diff options
| -rw-r--r-- | INSTALL | 23 | ||||
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | build_milter_api.gpr.gp | 2 | ||||
| -rw-r--r-- | comfignat.gpr.gp | 90 | ||||
| -rw-r--r-- | comfignat.mk | 379 | ||||
| -rw-r--r-- | milter_api.gpr.gp | 2 | 
6 files changed, 328 insertions, 170 deletions
| @@ -51,7 +51,9 @@ are relevant during the build:      GNAT project file that defines directory variables for use by other project      files. Multiarch support requires a directories project that can refer to      different directories depending on the target architecture. A directories -    project overrides some but not all of the directory variables listed below. +    project overrides the default values of some of the directory variables +    listed below, but if one of those variables is set explicitly, then it +    overrides the directories project.   relocatable_package      If relocatable_package is true and no directories project is provided, then @@ -69,8 +71,8 @@ are relevant during the build:      other architecture-specific files. Default: <prefix>   bindir -    The directory for programs that can be run from a command prompt, used only -    if no directories project is provided. Default: <exec_prefix>/bin +    The directory for programs that can be run from a command prompt; may be +    provided by a directories project. Default: <exec_prefix>/bin   datarootdir      The root of the directory tree for read-only architecture-independent data @@ -78,13 +80,18 @@ are relevant during the build:   includedir      The top-level directory for source files to be used in the compilation of -    software using libraries, used only if no directories project is provided. +    software using libraries; may be provided by a directories project.      Default: <prefix>/include   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; may be provided +    by a directories project. Default: <exec_prefix>/lib + + alidir +    The parent of the library-specific directory for Ada library information +    files for this library; may be provided by a directories project. +    Default: <libdir>   gprdir      The directory for GNAT project files to be used in the building of software @@ -114,6 +121,7 @@ invoke Gnatprep. You may need to define them if you run Gnatprep manually.   Bindir   Includedir   Libdir + Alidir      These correspond to the like-named Make variables. The same defaults as      above will be used if the symbols are undefined. @@ -143,6 +151,9 @@ options are passed to them:   GNAT_BUILDER      The command for invoking the builder, that is GPRbuild. Default: gprbuild + GNATPREPFLAGS +    A space-separated list of options to be passed to Gnatprep. +   GNATFLAGS      A space-separated list with all of the optional parameters to be passed to      the builder, including any options to be forwarded to the compiler, binder @@ -19,3 +19,5 @@ usage_GPRs = milter_api.gpr  test_milter: build build_test_milter.gpr  	${build_GPR} + +all: test_milter diff --git a/build_milter_api.gpr.gp b/build_milter_api.gpr.gp index e204191..106e0ab 100644 --- a/build_milter_api.gpr.gp +++ b/build_milter_api.gpr.gp @@ -30,7 +30,7 @@ library project Build_Milter_API is     for Object_Dir        use Comfignat.Objdir;     for Library_Src_Dir   use Comfignat.Stage_Includedir & "/adamilter";     for Library_Dir       use Comfignat.Stage_Libdir; -   for Library_ALI_Dir   use Comfignat.Stage_Libdir & "/adamilter"; +   for Library_ALI_Dir   use Comfignat.Stage_Alidir & "/adamilter";     package Naming is        for body("Milter_API.Start_Wrapping") use diff --git a/comfignat.gpr.gp b/comfignat.gpr.gp index e334f00..b27e460 100644 --- a/comfignat.gpr.gp +++ b/comfignat.gpr.gp @@ -11,9 +11,9 @@  -- modified is included with the above copyright notice. --- This file is part of Comfignat – common, convenient, command-line-controlled --- compile-time configuration of software built with the GNAT tools. For more --- information about Comfignat, see http://www.Rombobeorn.se/Comfignat/. +-- This file is part of Comfignat 1.2 – common, convenient, command-line- +-- controlled compile-time configuration of software built with the GNAT tools. +-- For information about Comfignat, see http://www.Rombobeorn.se/Comfignat/.  -- This project file defines directory variables for use in build-controlling @@ -78,12 +78,13 @@ abstract project Comfignat is     -- tell them where to find or write different kinds of files at run time.     -- Most of the directory names are relative to Bindir if the software was     -- configured as a relocatable package. Otherwise they are absolute -   -- pathnames. +   -- pathnames. Bindir is relative to Libexecdir when the package is +   -- relocatable.     --     -- Programs that can be run from a command prompt are in Bindir. This is -   -- normally the same directory that the program itself is in, so this -   -- variable is probably of little use at run time. +   -- usually the same directory that the program itself is in, so this +   -- variable is probably useful only to programs in Libexecdir.     #if Bindir'Defined then        Bindir := $Bindir;     #else @@ -136,6 +137,25 @@ abstract project Comfignat is        Logdir := Localstatedir & "/log";     #end if; +   -- Small files that take part in describing the state of the system and that +   -- exist only while the program is running, such as process identifier files +   -- and transient Unix-domain sockets, shall be sought and created under +   -- Runstatedir. (This is NOT the place for temporary files in general.) +   #if Runstatedir'Defined then +      Runstatedir := $Runstatedir; +   #else +      Runstatedir := "/run"; +   #end if; + +   -- Lock files that are used to prevent multiple programs from trying to +   -- access a device or other resource at the same time shall be sought and +   -- created under Lockdir. +   #if Lockdir'Defined then +      Lockdir := $Lockdir; +   #else +      Lockdir := Runstatedir & "/lock"; +   #end if; +     -- Source files to be used in the compilation of software using libraries     -- are under Includedir.     #if Includedir'Defined then @@ -144,6 +164,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 +180,17 @@ 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; + +   -- A program or library that has Archincludedir, Libdir and/or Alidir +   -- compiled-in will in those directories find only libraries compiled for +   -- the same architecture as itself. +     -- GNAT project files are under GPRdir.     #if GPRdir'Defined then        GPRdir := $GPRdir; @@ -187,25 +227,6 @@ abstract project Comfignat is        Miscdocdir := Datarootdir & "/doc";     #end if; -   -- Small files that take part in describing the state of the system, and -   -- that exist only while the program is running, such as process identifier -   -- files and transient Unix-domain sockets, shall be created under -   -- Runtimedir. (This is NOT the place for temporary files in general.) -   #if Runtimedir'Defined then -      Runtimedir := $Runtimedir; -   #else -      Runtimedir := "/run"; -   #end if; - -   -- Lock files that are used to prevent multiple programs from trying to -   -- access a device or other resource at the same time shall be created under -   -- Lockdir. -   #if Lockdir'Defined then -      Lockdir := $Lockdir; -   #else -      Lockdir := Runtimedir & "/lock"; -   #end if; -     --     -- The following variables are for use in attributes to control where @@ -267,13 +288,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 07ae8d2..a4742c4 100644 --- a/comfignat.mk +++ b/comfignat.mk @@ -11,9 +11,9 @@  # modified is included with the above copyright notice. -# This file is part of Comfignat – common, convenient, command-line-controlled -# compile-time configuration of software built with the GNAT tools. For more -# information about Comfignat, see http://www.Rombobeorn.se/Comfignat/. +# This file is part of Comfignat 1.2 – common, convenient, command-line- +# controlled compile-time configuration of software built with the GNAT tools. +# For information about Comfignat, see http://www.Rombobeorn.se/Comfignat/.  # This file contains generic Make code. It is designed to be included by other @@ -61,8 +61,8 @@ GNATFLAGS ?= ${if ${findstring gnatmake, \  # (DESTDIR is also supported.)  # Containing makefiles may assign default values to the options variables -# GNAT_BUILDER_FLAGS, ADAFLAGS, CPPFLAGS, CFLAGS, CXXFLAGS, FFLAGS, -# GNATBINDFLAGS, GNATLINKFLAGS and LDFLAGS if they are undefined in the +# GNATPREPFLAGS, GNAT_BUILDER_FLAGS, ADAFLAGS, CPPFLAGS, CFLAGS, CXXFLAGS, +# FFLAGS, GNATBINDFLAGS, GNATLINKFLAGS and LDFLAGS if they are undefined in the  # environment, but should expect that users and distributions may override  # those defaults. @@ -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 +runstatedir    = /run +lockdir        = ${runstatedir}/lock +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  # These are the directories where different kinds of files will be located on  # the target system. @@ -119,6 +121,13 @@ stagedir = ${builddir}/stage  # installed are written under stagedir, and then copied to their destination in  # the installation step. +ifneq (${Comfignat_overriding_absolute_builddir},) +   # This process is a sub-Make and must use the same builddir as its parent. +   # This assignment must be done before builddir is used in VPATH and in the +   # pathname of the configuration file. +   override builddir := ${Comfignat_overriding_absolute_builddir} +endif +  # Containing makefiles should avoid modifying the directory variables. Users  # should be able to rely on these defaults. @@ -136,24 +145,27 @@ install_cp_flags = ${if ${DESTDIR},--preserve=timestamps}  #  srcdir := ${abspath ${dir ${lastword ${MAKEFILE_LIST}}}} -# srcdir is the root of the source tree, computed 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} +# srcdir is the directory in the source tree where makefiles and project files +# are. It may be the root of the source tree or a subdirectory. It is computed +# 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_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. @@ -161,7 +173,8 @@ preprocess_file = "${GNATPREP}" ${firstword ${filter %.gp,$^}} $@ \                    ${options_preprocessing} ${Gnatprep_arguments} \                    ${if ${filter ${notdir $@},${notdir ${usage_GPRs}}}, \                         ${usage_directories}, \ -                       '-DSrcdir="${srcdir}"'} +                       '-DSrcdir="${srcdir}"'} \ +                  ${GNATPREPFLAGS}  # preprocess_file is a command for use in recipes. It runs the first .gp file  # among the rule's prerequisites through Gnatprep to produce the target. If the  # target is a usage project, then the usage-relevant directory variables are @@ -207,7 +220,8 @@ ifneq (${origin options},file)     options =  endif  # options may be assigned a list of variable names. Those variables may be -# overridden on the command line, and will be defined as Gnatprep symbols. +# overridden on the command line, and will be defined as Gnatprep symbols and +# as external variables for build projects.  # Their values must be "true" or "false".  # The containing makefile should assign a default value to each variable unless  # it shall be mandatory to always set the option on the command line. @@ -232,13 +246,15 @@ VPATH += ${srcdir} ${builddir}  configuration_variables += \     GNATPREP GNAT_BUILDER \ -   GNAT_BUILDER_FLAGS ADAFLAGS CPPFLAGS CFLAGS CXXFLAGS FFLAGS GNATBINDFLAGS \ -   GNATLINKFLAGS LDFLAGS GNATFLAGS \ +   GNATPREPFLAGS GNAT_BUILDER_FLAGS ADAFLAGS CPPFLAGS CFLAGS CXXFLAGS FFLAGS \ +   GNATBINDFLAGS GNATLINKFLAGS LDFLAGS GNATFLAGS \     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 runstatedir lockdir \ +   includedir archincludedir libdir alidir gprdir \ +   localedir mandir infodir miscdocdir \     objdir stagedir \     install_cp_flags \     ${options} @@ -263,21 +279,37 @@ configuration = ${builddir}/comfignat_configuration.mk  ifeq (${origin builddir},command line)     override builddir := ${abspath ${builddir}}  endif -ifeq (${origin objdir},command line) +export Comfignat_overriding_absolute_builddir := ${builddir} + +ifneq (${Comfignat_overriding_absolute_objdir},) +   override objdir := ${Comfignat_overriding_absolute_objdir} +else ifeq (${origin objdir},command line)     override objdir := ${abspath ${objdir}} -   objdir_is_configured = true +   export Comfignat_overriding_absolute_objdir := ${objdir} +   objdir_is_overridden = true  endif -ifeq (${origin stagedir},command line) + +ifneq (${Comfignat_overriding_absolute_stagedir},) +   override stagedir := ${Comfignat_overriding_absolute_stagedir} +else ifeq (${origin stagedir},command line)     override stagedir := ${abspath ${stagedir}} -   stagedir_is_configured = true +   export Comfignat_overriding_absolute_stagedir := ${stagedir} +   stagedir_is_overridden = true  endif +  # These pathnames need to be absolute in project files, because a pathname  # relative to a project file can be wrong when a separate build directory is  # used and project files are both in srcdir and in builddir. objdir and  # stagedir also need to be absolute in the configuration file because the  # working directory might change between Make invocations. +# Sub-Makes must use the same builddir, objdir and stagedir as the parent, so +# the absolute pathnames are conveyed to child processes in environment +# variables that won't normally be overridden and are unlikely to be defined by +# accident. +# The changes to objdir and stagedir must be done after the configuration file +# is read because otherwise the configuration would override the command line.  # Once modified the variables are no longer of command line origin, so they are -# marked as configured so that "make configure" will save them. +# marked as overridden so that "make configure" will save them.  # @@ -285,6 +317,21 @@ endif  # build projects:  # +# First define some functions and constants for processing directory variables. + +usage_directory_variables = includedir archincludedir libdir alidir +# These are the usage-relevant directory variables. They are needed in usage +# projects after installation. + +builder_directory_variables = bindir libexecdir ${usage_directory_variables} +# These are the builder-relevant directory variables. They control where the +# GNAT tools write files to be installed. + +usage_relevant = ${filter ${usage_directory_variables},${1}} +# usage_relevant returns a list of the words in the input list that are usage- +# relevant directory variables. If given a single variable name, it returns +# that name if the variable is usage-relevant, or an empty string if it isn't. +  nil =  inert_space = _Comfignat_magic_protective_space_character_substitute_  inert_percent = _Comfignat_magic_protective_percent_character_substitute_ @@ -343,85 +390,111 @@ maybe_relative_to = \  # maybe_relative_to converts an absolute pathname into a relative one if a  # relocatable package is desired.  # Parameters: -#    1: an absolute pathname to convert to relative +#    1: an absolute pathname to maybe convert to relative  #    2: the absolute base pathname that 1 may be made relative to  # First check that the value of relocatable_package is a single word and that  # that word is either "true" or "false". Complain and stop if that isn't so.  # Then, if relocatable_package is "true", let relative_to convert the pathname,  # otherwise return parameter 1 unchanged. -embed_pathname = ${call maybe_relative_to,${1},${bindir}} -# embed_pathname converts an absolute pathname into the right form for -# inclusion in a program, which means that it is made relative to bindir if a +embed_pathname = ${call maybe_relative_to,${${1}},${if ${filter bindir,${1}} \ +                                                      ,${libexecdir},${bindir}}} +# embed_pathname takes the name of a variable whose value is an absolute +# pathname, and converts that pathname into the right form for inclusion in a +# program, which means that bindir is made relative to libexecdir and other +# variables are made relative to bindir if a relocatable package is desired. + +usage_pathname = ${call maybe_relative_to,${${1}},${gprdir}} +# usage_pathname takes the name of a variable whose value is an absolute +# pathname, and converts that pathname into the right form for inclusion in a +# usage project, which means that it is made relative to gprdir if a  # relocatable package is desired. -usage_pathname = ${call maybe_relative_to,${1},${gprdir}} -# usage_pathname converts an absolute pathname into the right form for -# inclusion in a usage project, which means that it is made relative to gprdir -# if a relocatable package is desired. +define convey_builder_directory_variable +   all_directories   += '-D${1}="${call embed_pathname,${1}}"' +   all_directories   += '-Dstage_${1}="${stage_${1}}"' +   usage_directories += ${if ${call usage_relevant,${1}}, \ +                             '-D${1}="${call usage_pathname,${1}}"'} + +endef +# convey_builder_directory_variable takes the name of a builder-relevant +# directory variable and returns Make code that conveys that variable to +# project files. The code snippet ends with a line break. +#    · Append a symbol definition to all_directories to convey the variable to +#      comfignat.gpr in the right form for inclusion in a program. +#    · Also convey to comfignat.gpr the corresponding pathname under the +#      staging directory, which wouldn't be derived correctly from a relative +#      pathname. +#    · If the variable is also usage-relevant, then append a symbol definition +#      to usage_directories to convey it to usage projects in the form that +#      usage projects need. + +define use_directories_project_variable +   all_directories   += '-D${1}=${directories_project}.${1}' +   usage_directories += ${if ${call usage_relevant,${1}}, \ +                             '-D${1}=${directories_project}.${1}'} + +endef +# use_directories_project_variable takes the name of a builder-relevant +# directory variable and returns Make code that makes project files get that +# variable from a directories project. The code snippet ends with a line break. +#    · Append a symbol definition to all_directories for comfignat.gpr. +#    · If the variable is also usage-relevant, then append a symbol definition +#      to usage_directories for usage projects. + +# Now that all those functions are defined, compute the symbol definitions for +# the directory variables.  # Convey builddir, objdir and stagedir to comfignat.gpr.  all_directories = '-DBuilddir="${builddir}"' '-DObjdir="${objdir}"' \                    '-DStagedir="${stagedir}"' +usage_directories = + +# Make project files import the directories project if one has been provided. +ifneq (${dirgpr},) +   directories_project := ${basename ${notdir ${call mung_string,${dirgpr}}}} +   all_directories     += '-DDirectories_GPR="${dirgpr}"' +   all_directories     += '-DDirectories_Project=${directories_project}' +   usage_directories   += '-DDirectories_GPR="${dirgpr}"' +endif +  # Convey the builder-irrelevant directory variables, making them available to  # build projects for inclusion in binaries. Make most of the pathnames relative  # if a relocatable package is desired. -all_directories += '-DDatadir="${call embed_pathname,${datadir}}"' -all_directories += '-DSysconfdir="${call embed_pathname,${sysconfdir}}"' -all_directories += '-DStatedir="${call embed_pathname,${statedir}}"' -all_directories += '-DCachedir="${call embed_pathname,${cachedir}}"' -all_directories += '-DLogdir="${call embed_pathname,${logdir}}"' -all_directories += '-DGPRdir="${call embed_pathname,${gprdir}}"' -all_directories += '-DLocaledir="${call embed_pathname,${localedir}}"' -all_directories += '-DMandir="${call embed_pathname,${mandir}}"' -all_directories += '-DInfodir="${call embed_pathname,${infodir}}"' -all_directories += '-DMiscdocdir="${call embed_pathname,${miscdocdir}}"' -all_directories += '-DRuntimedir="${runtimedir}"' +all_directories += '-DDatadir="${call embed_pathname,datadir}"' +all_directories += '-DSysconfdir="${call embed_pathname,sysconfdir}"' +all_directories += '-DStatedir="${call embed_pathname,statedir}"' +all_directories += '-DCachedir="${call embed_pathname,cachedir}"' +all_directories += '-DLogdir="${call embed_pathname,logdir}"' +all_directories += '-DGPRdir="${call embed_pathname,gprdir}"' +all_directories += '-DLocaledir="${call embed_pathname,localedir}"' +all_directories += '-DMandir="${call embed_pathname,mandir}"' +all_directories += '-DInfodir="${call embed_pathname,infodir}"' +all_directories += '-DMiscdocdir="${call embed_pathname,miscdocdir}"' +all_directories += '-DRunstatedir="${runstatedir}"'  all_directories += '-DLockdir="${lockdir}"' -# runtimedir and lockdir belong to the operating system and are used for +# runstatedir and lockdir belong to the operating system and are used for  # communication between subsystems. It wouldn't make sense for an application -# to have its own runtimedir. Therefore these variables are always absolute +# to have its own runstatedir. Therefore these variables are always absolute  # pathnames. -ifeq (${dirgpr},) - -   # No directories project was provided, so convey even the builder-relevant -   # directory variables to comfignat.gpr, and convey the usage-relevant ones -   # to usage projects in the form that usage projects need. - -   all_directories += '-DBindir="${call embed_pathname,${bindir}}"' -   all_directories += '-DLibexecdir="${call embed_pathname,${libexecdir}}"' -   all_directories += '-DIncludedir="${call embed_pathname,${includedir}}"' -   all_directories += '-DLibdir="${call embed_pathname,${libdir}}"' - -   all_directories += '-DStage_Bindir="${stage_bindir}"' -   all_directories += '-DStage_Libexecdir="${stage_libexecdir}"' -   all_directories += '-DStage_Includedir="${stage_includedir}"' -   all_directories += '-DStage_Libdir="${stage_libdir}"' - -   usage_directories = '-DIncludedir="${call usage_pathname,${includedir}}"' \ -                       '-DLibdir="${call usage_pathname,${libdir}}"' - -else - -   # A directories project is used, so make project files take the builder- -   # relevant directory variables from there. - -   directories_project := ${basename ${notdir ${call mung_string,${dirgpr}}}} - -   all_directories += '-DDirectories_GPR="${dirgpr}"' -   all_directories += '-DDirectories_Project=${directories_project}' -   all_directories += '-DBindir=${directories_project}.Bindir' -   all_directories += '-DLibexecdir=${directories_project}.Libexecdir' -   all_directories += '-DIncludedir=${directories_project}.Includedir' -   all_directories += '-DLibdir=${directories_project}.Libdir' - -   usage_directories = '-DDirectories_GPR="${dirgpr}"' \ -                       '-DIncludedir=${directories_project}.Includedir' \ -                       '-DLibdir=${directories_project}.Libdir' - -endif +# Set the builder-relevant directory variables. +${eval ${foreach var,${builder_directory_variables}, \ +                 ${if ${or ${findstring command line,${origin ${var}}}, \ +                           ${filter true,${${var}_is_configured}}, \ +                           ${filter 0,${words ${dirgpr}}}}, \ +                      ${call convey_builder_directory_variable,${var}}, \ +                      ${call use_directories_project_variable,${var}}}}} +# For each builder-relevant directory variable, check whether its value in +# project files should be taken from the corresponding Make variable or from a +# directories project, and construct symbol definitions accordingly. +# If a variable is of command line origin or marked as configured, or if dirgpr +# is empty (that is, no directories project has been provided), then convey the +# variable to project files. Otherwise make project files use the variable that +# the directories project provides. + +# And now process any boolean options.  option_values = \     ${foreach option,${options}, \ @@ -446,8 +519,9 @@ options_building = ${addprefix -X,${option_values}}  # Some other data that the rules below need:  # -delegation_command := @$${MAKE} --file=${abspath ${firstword ${MAKEFILE_LIST}}}\ -                     --include-dir=${srcdir} --no-print-directory +main_makefile := ${firstword ${MAKEFILE_LIST}} +delegation_command = @$${MAKE} --file=${abspath ${main_makefile}} \ +                     --include-dir=${abspath ${dir ${main_makefile}}}  # delegation_command is the Make command line that delegating makefiles in  # separate build directories use to delegate commands to the main makefile. The  # first pathname in MAKEFILE_LIST is the main makefile. @@ -472,11 +546,16 @@ preprocessed_files_in_builddir = ${addprefix ${builddir}/,${preprocessed_files}}  Comfignat_default_goal: build  # How to make directories: -${builddir} ${stage_gprdir}: +%/: +	mkdir -p $@ +.PRECIOUS: %/ + +# This rule appears to work around a bug that was fixed in GNU Make 3.82: +${stage_gprdir}/:  	mkdir -p $@  # How to initialize a build directory with a delegating makefile: -${builddir}/Makefile: | ${builddir} +${builddir}/Makefile: | ${builddir}/  	@echo 'Writing $@.'  	@( echo 'Comfignat_default_goal: force ; ${delegation_command}'; \  	   echo '%: force ; ${delegation_command} $$@'; \ @@ -493,40 +572,61 @@ ${builddir}/Makefile: | ${builddir}  # How to save configured variables:  configure:: ${builddir}/Makefile  	@echo "Writing ${configuration}." -	@( ${foreach variable,${configuration_variables}, \ -	             ${if ${or ${findstring command line, \ -	                                    ${origin ${variable}}}, \ -	                       ${filter true,${${variable}_is_configured}}}, \ -	                  echo 'ifneq "$${origin ${variable}}" "command line"';\ -	                  echo 'override ${variable} = ${value ${variable}}'; \ +	@( ${foreach var,${configuration_variables}, \ +	             ${if ${or ${findstring command line,${origin ${var}}}, \ +	                       ${filter true,${${var}_is_overridden}}, \ +	                       ${filter true,${${var}_is_configured}}}, \ +	                  echo 'ifneq "$${origin ${var}}" "command line"'; \ +	                  echo '   override ${var} = ${value ${var}}';\ +	                  echo 'endif'; \ +	                  echo '${var}_is_configured = true'; \ +	                  echo;, \ +	             ${if ${or ${findstring environment,${origin ${var}}}, \ +	                       ${filter true,${${var}_is_weakly_configured}}}, \ +	                  echo 'ifneq "$${origin ${var}}" "environment"'; \ +	                  echo '   ${var} = ${value ${var}}'; \  	                  echo 'endif'; \ -	                  echo '${variable}_is_configured = true';}} \ +	                  echo '${var}_is_weakly_configured = true'; \ +	                  echo;}}} \  	   true \  	 ) > "${configuration}"  # Out of the variables listed in configuration_variables, all that were -# overridden on the command line, and all that were previously configured, are -# written to the configuration file. Configured values override defaults -# defined later in the containing makefile, but can be overridden on the -# command line. A variable is considered previously configured if there is -# another variable with "_is_configured" appended to its name and a value of -# "true". Such a variable is also written for each configured variable. As a -# side effect of this it is possible to delete a variable V from the -# configuration by running "make configure V_is_configured=false". +# overridden on the command line, all that are set in the environment and not +# overridden elsewhere, and all that were previously configured, are written +# to the configuration file. Command-line-configured values override defaults +# assigned later in the containing makefile, but can be overridden on the +# command line. Environment-configured values override defaults assigned with +# "?=", but can be overridden in the environment or on the command line. A +# variable is considered previously configured if there is another variable +# with "_is_configured" or "_is_weakly_configured" appended to its name and a +# value of "true". Such a variable is also written for each configured +# variable. As a side effect of this it is possible to delete a variable V from +# the configuration by running "make configure V_is_configured=false +# V_is_weakly_configured=false". + +# How to show the values of configured variables: +show_configuration:: +	@${foreach var,${configuration_variables}, \ +	           ${if ${filter true,${${var}_is_configured}}, \ +	                echo '${var} = ${value ${var}}';} \ +	           ${if ${filter true,${${var}_is_weakly_configured}}, \ +	                echo '${var} ?= ${value ${var}}';}} \ +	 true  # How to preprocess the project Comfignat: -${builddir}/comfignat.gpr: comfignat.gpr.gp | ${builddir} -	"${GNATPREP}" $< $@ -DInvoked_By_Makefile ${all_directories} +${builddir}/comfignat.gpr: comfignat.gpr.gp | ${builddir}/ +	"${GNATPREP}" $< $@ -DInvoked_By_Makefile ${all_directories} ${GNATPREPFLAGS}  # How to preprocess files that are needed during the build: -${builddir}/%: %.gp | ${builddir} +${builddir}/%: %.gp | ${builddir}/  	${preprocess_file}  # How to preprocess usage projects: -${stage_gprdir}/%: %.gp | ${stage_gprdir} +${stage_gprdir}/%: %.gp | ${stage_gprdir}/  	${preprocess_file}  # How to stage usage projects that don't need preprocessing: -${stage_gprdir}/%: % | ${stage_gprdir} +${stage_gprdir}/%: % | ${stage_gprdir}/  	cp -p $< $@  preprocess: $${preprocessed_files_in_builddir} @@ -538,10 +638,19 @@ preprocess: $${preprocessed_files_in_builddir}  # requires that all preprocessing of files that are needed during the build is  # done before any project is built. -build: $${build_targets} $${staged_usage_GPRs} +base: $${build_targets} +# This builds the projects listed in build_GPRs, plus any additional +# prerequisites that the containing makefile might add. + +build: base $${staged_usage_GPRs} +# This is the default build. Additional targets that should be built by default +# may be added as prerequisites. + +all: build +# Optional targets may be added as prerequisites of "all".  ${stagedir}: -	@${MAKE} build --no-print-directory +	@${MAKE} build  # "make install" straight out of a source package triggers a build, but if  # something has been built then "make install" doesn't rebuild anything, just  # copies the built files to their destination. diff --git a/milter_api.gpr.gp b/milter_api.gpr.gp index e585e8a..c161af8 100644 --- a/milter_api.gpr.gp +++ b/milter_api.gpr.gp @@ -16,7 +16,7 @@ library project Milter_API is     for Library_Kind     use "dynamic";     for Source_Dirs      use ($Includedir & "/adamilter");     for Library_Dir      use $Libdir; -   for Library_ALI_Dir  use $Libdir & "/adamilter"; +   for Library_ALI_Dir  use $Alidir & "/adamilter";     for Externally_Built use "true";     #if Wrap_Threads then |