diff options
| -rw-r--r-- | INSTALL | 16 | ||||
| -rw-r--r-- | comfignat.gpr.gp | 35 | ||||
| -rw-r--r-- | comfignat.mk | 83 | ||||
| -rwxr-xr-x | manual.en.html | 58 | 
4 files changed, 140 insertions, 52 deletions
| @@ -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 & "/example";     for Library_Dir       use Comfignat.Stage_Libdir; -   for Library_ALI_Dir   use Comfignat.Stage_Libdir & "/example"; +   for Library_ALI_Dir   use Comfignat.Stage_Alidir & "/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 & "/example");     for Library_Dir      use $Libdir; -   for Library_ALI_Dir  use $Libdir & "/example"; +   for Library_ALI_Dir  use $Alidir & "/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/" & Lib; -   Bindir     := "/usr/bin"; -   Libexecdir := "/usr/libexec"; -   Includedir := "/usr/include"; +   Bindir         := "/usr/bin"; +   Libexecdir     := "/usr/libexec"; +   Includedir     := "/usr/include"; +   Alidir         := Libdir; +   Archincludedir := Libdir & "/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 |