From 59d62720ed2874a342b1c3fc4624d8a60cfc5fa4 Mon Sep 17 00:00:00 2001
From: Björn Persson
Date: Mon, 4 Nov 2013 09:06:24 +0100
Subject: Made explicitly set directory variables override a directories
project.
---
INSTALL | 24 +++++----
comfignat.mk | 161 ++++++++++++++++++++++++++++++++++-----------------------
manual.en.html | 5 ++
3 files changed, 114 insertions(+), 76 deletions(-)
diff --git a/INSTALL b/INSTALL
index 982d5a7..4a33eb2 100644
--- a/INSTALL
+++ b/INSTALL
@@ -55,7 +55,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
@@ -73,13 +75,13 @@ 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
libexecdir
The top-level directory for programs that are intended to be run by other
- programs rather than by users, used only if no directories project is
- provided. Default: /libexec
+ programs rather than by users; may be provided by a directories project.
+ Default: /libexec
datarootdir
The root of the directory tree for read-only architecture-independent data
@@ -124,22 +126,22 @@ 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
archincludedir
Like includedir but for architecture-specific source files, in case this
- library must install such files. Default:
+ library must install such files; may be provided by a directories project.
+ Default:
libdir
The directory for binary libraries to be used by other software, and the
- top-level directory for other architecture-specific files, used for
- libraries 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, used only if no directories project is provided.
+ files for this library; may be provided by a directories project.
Default:
gprdir
diff --git a/comfignat.mk b/comfignat.mk
index 9bc4f7b..f2a9955 100644
--- a/comfignat.mk
+++ b/comfignat.mk
@@ -317,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_
@@ -382,33 +397,81 @@ maybe_relative_to = \
# 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 += '-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}"'
# runstatedir and lockdir belong to the operating system and are used for
@@ -416,54 +479,22 @@ all_directories += '-DLockdir="${lockdir}"'
# 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 maybe_relative_to,${bindir},${libexecdir}}"'
- 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}}"' \
- '-DArchincludedir="${call usage_pathname,${archincludedir}}"' \
- '-DLibdir="${call usage_pathname,${libdir}}"' \
- '-DAlidir="${call usage_pathname,${alidir}}"'
-
-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 += '-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' \
- '-DArchincludedir=${directories_project}.Archincludedir' \
- '-DLibdir=${directories_project}.Libdir' \
- '-DAlidir=${directories_project}.Alidir'
-
-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}, \
diff --git a/manual.en.html b/manual.en.html
index c219442..bfbc04c 100755
--- a/manual.en.html
+++ b/manual.en.html
@@ -642,6 +642,11 @@ and testing, and delete parts that don't apply to your project.
Noteworthy Changes in Version 1.2
+The interaction between directory variables and directories projects was
+corrected so that a directories project overrides the default values of some
+directory variables, but an explicitly set Make variable overrides the
+corresponding variable in the directories project.
+
The directory variables alidir and archincludedir
were added.
--
cgit v1.2.3