From 0ba0124b9e2c31d40ae56e2a8ed187ac7912ee3a Mon Sep 17 00:00:00 2001 From: Björn Persson Date: Wed, 6 Nov 2013 23:32:09 +0100 Subject: Updated Comfignat to version 1.2. --- INSTALL | 23 ++- Makefile | 2 + build_milter_api.gpr.gp | 2 +- comfignat.gpr.gp | 90 ++++++++---- comfignat.mk | 379 +++++++++++++++++++++++++++++++----------------- milter_api.gpr.gp | 2 +- 6 files changed, 328 insertions(+), 170 deletions(-) diff --git a/INSTALL b/INSTALL index 850a2e5..1d7ec2e 100644 --- a/INSTALL +++ b/INSTALL @@ -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: bindir - The directory for programs that can be run from a command prompt, used only - if no directories project is provided. Default: /bin + The directory for programs that can be run from a command prompt; may be + provided by a directories project. Default: /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: /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: /lib + top-level directory for other architecture-specific files; may be provided + by a directories project. Default: /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: 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 diff --git a/Makefile b/Makefile index a0e260b..9b95232 100644 --- a/Makefile +++ b/Makefile @@ -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 -- cgit v1.2.3