Rombobjörn

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--INSTALL16
-rw-r--r--comfignat.gpr.gp35
-rw-r--r--comfignat.mk83
-rwxr-xr-xmanual.en.html58
4 files changed, 140 insertions, 52 deletions
diff --git a/INSTALL b/INSTALL
index 93b4650..5a45025 100644
--- a/INSTALL
+++ b/INSTALL
@@ -117,10 +117,20 @@ are relevant during the build:
software using libraries, used only if no directories project is provided.
Default: <prefix>/include
+ archincludedir
+ Like includedir but for architecture-specific source files, in case this
+ library must install such files. Default: <includedir>
+
libdir
The directory for binary libraries to be used by other software, and the
- top-level directory for other architecture-specific files, used only if no
- directories project is provided. Default: <exec_prefix>/lib
+ top-level directory for other architecture-specific files, used for
+ libraries only if no directories project is provided.
+ Default: <exec_prefix>/lib
+
+ alidir
+ The parent of the library-specific directory for Ada library information
+ files for this library, used only if no directories project is provided.
+ Default: <libdir>
gprdir
The directory for GNAT project files to be used in the building of software
@@ -183,7 +193,9 @@ invoke Gnatprep. You may need to define them if you run Gnatprep manually.
Cachedir
Logdir
Includedir
+ Archincludedir
Libdir
+ Alidir
GPRdir
Localedir
Mandir
diff --git a/comfignat.gpr.gp b/comfignat.gpr.gp
index 1ba4337..22fab2d 100644
--- a/comfignat.gpr.gp
+++ b/comfignat.gpr.gp
@@ -144,6 +144,15 @@ abstract project Comfignat is
Includedir := Prefix & "/include";
#end if;
+ -- If a library has installed architecture-specific source files to be used
+ -- in compilation, then those files may also be under a library-specific
+ -- subdirectory of Archincludedir.
+ #if Archincludedir'Defined then
+ Archincludedir := $Archincludedir;
+ #else
+ Archincludedir := Includedir;
+ #end if;
+
-- Binary libraries and other architecture-specific files are under Libdir.
#if Libdir'Defined then
Libdir := $Libdir;
@@ -151,6 +160,13 @@ abstract project Comfignat is
Libdir := Exec_Prefix & "/lib";
#end if;
+ -- ALI files are under a library-specific subdirectory of Alidir.
+ #if Alidir'Defined then
+ Alidir := $Alidir;
+ #else
+ Alidir := Libdir;
+ #end if;
+
-- GNAT project files are under GPRdir.
#if GPRdir'Defined then
GPRdir := $GPRdir;
@@ -267,13 +283,28 @@ abstract project Comfignat is
Stage_Includedir := Stagedir & Includedir;
#end if;
+ -- If architecture-specific source files absolutely must be installed, then
+ -- those files may be placed under a library-specific subdirectory of
+ -- Stage_Archincludedir.
+ #if Stage_Archincludedir'Defined then
+ Stage_Archincludedir := $Stage_Archincludedir;
+ #else
+ Stage_Archincludedir := Stagedir & Archincludedir;
+ #end if;
+
-- Binary libraries shall be installed in Stage_Libdir.
- -- ALI files shall be installed in a library-specific subdirectory of
- -- Stage_Libdir.
#if Stage_Libdir'Defined then
Stage_Libdir := $Stage_Libdir;
#else
Stage_Libdir := Stagedir & Libdir;
#end if;
+ -- ALI files shall be installed under a library-specific subdirectory of
+ -- Stage_Alidir.
+ #if Stage_Alidir'Defined then
+ Stage_Alidir := $Stage_Alidir;
+ #else
+ Stage_Alidir := Stagedir & Alidir;
+ #end if;
+
end Comfignat;
diff --git a/comfignat.mk b/comfignat.mk
index 01cf031..c22ede5 100644
--- a/comfignat.mk
+++ b/comfignat.mk
@@ -92,22 +92,24 @@ localstatedir = ${prefix}/var
# These variables are used in constructing the default values of the directory
# variables below.
-bindir = ${exec_prefix}/bin
-libexecdir = ${exec_prefix}/libexec
-datadir = ${datarootdir}
-sysconfdir = ${prefix}/etc
-statedir = ${localstatedir}/lib
-cachedir = ${localstatedir}/cache
-logdir = ${localstatedir}/log
-includedir = ${prefix}/include
-libdir = ${exec_prefix}/lib
-gprdir = ${datarootdir}/gpr
-localedir = ${datarootdir}/locale
-mandir = ${datarootdir}/man
-infodir = ${datarootdir}/info
-miscdocdir = ${datarootdir}/doc
-runtimedir = /run
-lockdir = ${runtimedir}/lock
+bindir = ${exec_prefix}/bin
+libexecdir = ${exec_prefix}/libexec
+datadir = ${datarootdir}
+sysconfdir = ${prefix}/etc
+statedir = ${localstatedir}/lib
+cachedir = ${localstatedir}/cache
+logdir = ${localstatedir}/log
+includedir = ${prefix}/include
+archincludedir = ${includedir}
+libdir = ${exec_prefix}/lib
+alidir = ${libdir}
+gprdir = ${datarootdir}/gpr
+localedir = ${datarootdir}/locale
+mandir = ${datarootdir}/man
+infodir = ${datarootdir}/info
+miscdocdir = ${datarootdir}/doc
+runtimedir = /run
+lockdir = ${runtimedir}/lock
# These are the directories where different kinds of files will be located on
# the target system.
@@ -148,20 +150,22 @@ srcdir := ${abspath ${dir ${lastword ${MAKEFILE_LIST}}}}
# as the directory part of the last pathname in MAKEFILE_LIST – which is this
# file since there is no include directive above this point.
-stage_bindir = ${stagedir}${bindir}
-stage_libexecdir = ${stagedir}${libexecdir}
-stage_datadir = ${stagedir}${datadir}
-stage_sysconfdir = ${stagedir}${sysconfdir}
-stage_statedir = ${stagedir}${statedir}
-stage_cachedir = ${stagedir}${cachedir}
-stage_logdir = ${stagedir}${logdir}
-stage_includedir = ${stagedir}${includedir}
-stage_libdir = ${stagedir}${libdir}
-stage_gprdir = ${stagedir}${gprdir}
-stage_localedir = ${stagedir}${localedir}
-stage_mandir = ${stagedir}${mandir}
-stage_infodir = ${stagedir}${infodir}
-stage_miscdocdir = ${stagedir}${miscdocdir}
+stage_bindir = ${stagedir}${bindir}
+stage_libexecdir = ${stagedir}${libexecdir}
+stage_datadir = ${stagedir}${datadir}
+stage_sysconfdir = ${stagedir}${sysconfdir}
+stage_statedir = ${stagedir}${statedir}
+stage_cachedir = ${stagedir}${cachedir}
+stage_logdir = ${stagedir}${logdir}
+stage_includedir = ${stagedir}${includedir}
+stage_archincludedir = ${stagedir}${archincludedir}
+stage_libdir = ${stagedir}${libdir}
+stage_alidir = ${stagedir}${alidir}
+stage_gprdir = ${stagedir}${gprdir}
+stage_localedir = ${stagedir}${localedir}
+stage_mandir = ${stagedir}${mandir}
+stage_infodir = ${stagedir}${infodir}
+stage_miscdocdir = ${stagedir}${miscdocdir}
# These are the directories where different kinds of files to be installed are
# written during the build.
@@ -245,8 +249,9 @@ configuration_variables += \
DESTDIR \
dirgpr relocatable_package \
prefix exec_prefix datarootdir localstatedir \
- bindir libexecdir datadir sysconfdir statedir cachedir logdir includedir \
- libdir gprdir localedir mandir infodir miscdocdir runtimedir lockdir \
+ bindir libexecdir datadir sysconfdir statedir cachedir logdir \
+ includedir archincludedir libdir alidir gprdir \
+ localedir mandir infodir miscdocdir runtimedir lockdir \
objdir stagedir \
install_cp_flags \
${options}
@@ -417,15 +422,21 @@ ifeq (${dirgpr},)
all_directories += '-DBindir="${call embed_pathname,${bindir}}"'
all_directories += '-DLibexecdir="${call embed_pathname,${libexecdir}}"'
all_directories += '-DIncludedir="${call embed_pathname,${includedir}}"'
+ all_directories += '-DArchincludedir="${call embed_pathname,${archincludedir}}"'
all_directories += '-DLibdir="${call embed_pathname,${libdir}}"'
+ all_directories += '-DAlidir="${call embed_pathname,${alidir}}"'
all_directories += '-DStage_Bindir="${stage_bindir}"'
all_directories += '-DStage_Libexecdir="${stage_libexecdir}"'
all_directories += '-DStage_Includedir="${stage_includedir}"'
+ all_directories += '-DStage_Archincludedir="${stage_archincludedir}"'
all_directories += '-DStage_Libdir="${stage_libdir}"'
+ all_directories += '-DStage_Alidir="${stage_alidir}"'
usage_directories = '-DIncludedir="${call usage_pathname,${includedir}}"' \
- '-DLibdir="${call usage_pathname,${libdir}}"'
+ '-DArchincludedir="${call usage_pathname,${archincludedir}}"' \
+ '-DLibdir="${call usage_pathname,${libdir}}"' \
+ '-DAlidir="${call usage_pathname,${alidir}}"'
else
@@ -439,11 +450,15 @@ else
all_directories += '-DBindir=${directories_project}.Bindir'
all_directories += '-DLibexecdir=${directories_project}.Libexecdir'
all_directories += '-DIncludedir=${directories_project}.Includedir'
+ all_directories += '-DArchincludedir=${directories_project}.Archincludedir'
all_directories += '-DLibdir=${directories_project}.Libdir'
+ all_directories += '-DAlidir=${directories_project}.Alidir'
usage_directories = '-DDirectories_GPR="${dirgpr}"' \
'-DIncludedir=${directories_project}.Includedir' \
- '-DLibdir=${directories_project}.Libdir'
+ '-DArchincludedir=${directories_project}.Archincludedir' \
+ '-DLibdir=${directories_project}.Libdir' \
+ '-DAlidir=${directories_project}.Alidir'
endif
diff --git a/manual.en.html b/manual.en.html
index a9d125a..d46954d 100755
--- a/manual.en.html
+++ b/manual.en.html
@@ -147,7 +147,7 @@ that the project <var>Comfignat</var> defines.</p>
<li><p>If your project file builds a library, then use a subdirectory of
<var>Comfignat.Stage_Includedir</var> for <var>Library_Src_Dir</var>,
<var>Comfignat.Stage_Libdir</var> for <var>Library_Dir</var>, and a
- subdirectory of <var>Comfignat.Stage_Libdir</var> for
+ subdirectory of <var>Comfignat.Stage_Alidir</var> for
<var>Library_ALI_Dir</var>.</p></li>
</ul>
</li>
@@ -159,8 +159,8 @@ project file without the "<samp>.gp</samp>" suffix. Make it import the project
file that the preprocessor symbol <var>Directories_GPR</var> specifies, but
only if <var>Directories_GPR</var> is defined. Do not import
<var>comfignat.gpr</var>. Use the symbol <var>Includedir</var> in the value of
-<var>Source_Dirs</var>, and use <var>Libdir</var> for <var>Library_Dir</var>
-and as part of <var>Library_ALI_Dir</var>.</p></li>
+<var>Source_Dirs</var>, use <var>Libdir</var> for <var>Library_Dir</var>, and
+use <var>Alidir</var> as part of <var>Library_ALI_Dir</var>.</p></li>
<li><p>Write a makefile that includes <var>comfignat.mk</var>. The makefile
shall set the variable <var>build_GPRs</var> to the filename of the
@@ -187,7 +187,7 @@ library project Build_Example is
for Object_Dir use Comfignat.Objdir;
for Library_Src_Dir use Comfignat.Stage_Includedir &amp; "/example";
for Library_Dir use Comfignat.Stage_Libdir;
- for Library_ALI_Dir use Comfignat.Stage_Libdir &amp; "/example";
+ for Library_ALI_Dir use Comfignat.Stage_Alidir &amp; "/example";
end Build_Example;</pre></div>
<div class="example file"><h5><code>example.gpr.gp</code></h5>
@@ -200,7 +200,7 @@ library project Example is
for Library_Kind use "dynamic";
for Source_Dirs use ($Includedir &amp; "/example");
for Library_Dir use $Libdir;
- for Library_ALI_Dir use $Libdir &amp; "/example";
+ for Library_ALI_Dir use $Alidir &amp; "/example";
for Externally_Built use "true";
end Example;</pre></div>
@@ -284,14 +284,31 @@ install log files but you may want to create a separate subdirectory under
compilation of other software that uses your libraries shall be placed under
<var>Comfignat.Stage_Includedir</var> by build project files, usually under a
separate subdirectory. Usage project files shall get the directory from the
-preprocessor symbol <var>Includedir</var>.</p></li>
+preprocessor symbol <var>Includedir</var>. These files should normally be
+architecture-independent.</p></li>
+
+<li><p>If you have architecture-specific source files that you need to make
+available to other software that uses your libraries, then you should refactor
+your code to encapsulate the architecture-specific bits in the compiled code
+and keep the API clean. But if you really must install such files, then you may
+put them under a separate subdirectory of <var>stage_archincludedir</var>.
+Usage project files shall get the directory from the preprocessor symbol
+<var>Archincludedir</var>.</p></li>
<li><p>Binary libraries shall be placed in <var>Comfignat.Stage_Libdir</var>
by build project files. Usage project files shall get the directory from the
preprocessor symbol <var>Libdir</var>.</p></li>
-<li><p>ALI files and other architecture-specific files shall usually be placed
-under a separate subdirectory of <var>Comfignat.Stage_Libdir</var>.</p></li>
+<li><p>Ada library information (ALI) files shall be placed under a separate
+subdirectory of <var>Comfignat.Stage_Alidir</var> by build project files. Usage
+project files shall get the directory from the preprocessor symbol
+<var>Alidir</var>.</p></li>
+
+<li><p>Other architecture-specific files shall usually be placed under a
+separate subdirectory of <var>stage_libdir</var>. (It will be the same
+subdirectory that ALI files are placed in when
+<var>alidir</var> = <var>libdir</var>.) Programs shall look for them under
+<var>Comfignat.Libdir</var>.</p></li>
<li><p>Comfignat puts usage project files in <var>stage_gprdir</var>.</p></li>
@@ -334,12 +351,22 @@ target architecture.</dd>
programs rather than by users.</dd>
<dt><var>Includedir</var></dt>
-<dd>The top-level directory for source files to be used in the compilation of
-software using libraries.</dd>
+<dd>The top-level directory for (normally architecture-independent) source
+files to be used in the compilation of software using libraries.</dd>
+
+<dt><var>Archincludedir</var></dt>
+<dd>The parent of libraries' separate library-specific directories for
+architecture-specific source files to be used in the compilation of software
+using libraries, for any libraries that absolutely must install such
+files.</dd>
<dt><var>Libdir</var></dt>
<dd>The directory for binary libraries to be used by other software, and the
top-level directory for other architecture-specific files.</dd>
+
+<dt><var>Alidir</var></dt>
+<dd>The parent of libraries' separate library-specific directories for
+Ada library information files.</dd>
</dl>
<p>Here's an example of what a directories project may look like:</p>
@@ -357,16 +384,19 @@ top-level directory for other architecture-specific files.</dd>
end case;
Libdir := "/usr/" &amp; Lib;
- Bindir := "/usr/bin";
- Libexecdir := "/usr/libexec";
- Includedir := "/usr/include";
+ Bindir := "/usr/bin";
+ Libexecdir := "/usr/libexec";
+ Includedir := "/usr/include";
+ Alidir := Libdir;
+ Archincludedir := Libdir &amp; "/include";
end System_Directories;</pre>
<p>This directories project belongs in a multiarch operating system where
libraries are kept in either <var>/usr/lib</var> or <var>/usr/lib64</var>
depending on which architecture they are compiled for. The directories project
-sets <var>Libdir</var> to the right directory for the target architecture based
+sets <var>Libdir</var>, <var>Alidir</var> and <var>Archincludedir</var>
+to the right directories for the target architecture based
on an environment variable. A library project that uses this directories
project will therefore automatically adapt to the current target architecture,
so that 32-bit and 64-bit instances of the library can be installed in parallel