diff options
| author | Björn Persson <Bjorn@Rombobjörn.se> | 2015-08-19 23:41:51 +0200 | 
|---|---|---|
| committer | Björn Persson <Bjorn@Rombobjörn.se> | 2015-08-19 23:41:51 +0200 | 
| commit | d460f7df9ef66028b3d2eb1c344d6f8aa42f0cfa (patch) | |
| tree | e73d5680c5dc25c9c5ae99870a9452f8038bb3c2 /comfignat.mk | |
| parent | 1b448d59742b9be6561468ca2e6262e77593e646 (diff) | |
Updated Comfignat to version 1.4.
Diffstat (limited to 'comfignat.mk')
| -rw-r--r-- | comfignat.mk | 404 | 
1 files changed, 250 insertions, 154 deletions
| diff --git a/comfignat.mk b/comfignat.mk index a4742c4..f9f2038 100644 --- a/comfignat.mk +++ b/comfignat.mk @@ -1,5 +1,5 @@  # Comfignat makefile foundation for configuring and building GNAT projects -# Copyright 2013 B. Persson, Bjorn@Rombobeorn.se +# Copyright 2013 - 2015 B. Persson, Bjorn@Rombobeorn.se  #  # This material is provided as is, with absolutely no warranty expressed  # or implied. Any use is at your own risk. @@ -11,7 +11,7 @@  # modified is included with the above copyright notice. -# This file is part of Comfignat 1.2 – common, convenient, command-line- +# This file is part of Comfignat 1.4 – 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/. @@ -34,6 +34,69 @@  # +# First of all, define some functions and constants for processing directory +# variables: +# + +nil = +inert_space = _Comfignat_magic_protective_space_character_substitute_ +inert_tab = _Comfignat_magic_protective_tab_character_substitute_ +inert_percent = _Comfignat_magic_protective_percent_character_substitute_ +mung_string = ${subst %,${inert_percent},${subst ${nil}	,${inert_tab},${subst ${nil} ,${inert_space},${1}}}} +unmung_string = ${subst ${inert_percent},%,${subst ${inert_tab},	,${subst ${inert_space}, ,${1}}}} +# mung_string and unmung_string are used to prevent Make from interpreting +# space and percent characters in strings. + +relativize = ${if ${filter ${2}%,${1}}, \ +                  ${3}${1:${2}%=%}, \ +                  ${call relativize,${1},${dir ${2:%/=%}},${3}../}} +# relativize is the recursive algorithm that converts an absolute pathname into +# a relative one. +# Parameters: +#    1: an absolute pathname to convert to relative +#    2: the absolute base pathname, being shortened until it's a prefix of 1 +#    3: a growing series of "../" to lead the relative pathname with +# If 2 is a prefix of 1, then return 3 concatenated with the part of 1 that +# differs from 2. Otherwise delete the last element of 2, add one level of +# "../" to 3, and repeat. +# Within relativize all pathnames have one trailing slash so that only whole +# directory names will match. Otherwise "/usr/lib" could match "/usr/lib64" for +# example. + +prepare_pathname = ${subst //,/,${abspath ${call mung_string,${1}}}/} +# prepare_pathname prepares a pathname for use as a parameter to relativize. +#    · Protect space and percent characters from interpretation by Make. +#    · Normalize the pathname, eliminating ".", ".." and "//". +#    · Append a slash. +#    · If the input was "/", then it is now "//". Change that back to "/". + +relative_to = \ +   ${or ${call unmung_string \ +              ,${patsubst %/,%,${call relativize \ +                                     ,${call prepare_pathname,${1}} \ +                                     ,${call prepare_pathname,${2}},}}},.} +# relative_to converts an absolute pathname into a relative one. What it +# actually does is to prepare the input to relativize and fix up its output. +# Parameters: +#    1: an absolute pathname to convert to relative +#    2: the absolute base pathname that 1 shall be made relative to +# Processing: +#    · Prepare the two input pathnames with prepare_pathname. +#    · Call relativize with the prepared pathnames for parameters 1 and 2, and +#      an empty string for 3. +#    · Strip the result of surrounding spaces and the trailing slash. +#    · Reverse the protection of space and percent characters. +#    · If the result is an empty string, then return "." instead. + +Make_pathname = ${call relative_to,${${1}},${CURDIR}} +# Make_pathname takes the name of a variable whose value is an absolute +# pathname, and converts that pathname into the right form for usage in Make +# targets, prerequisites and functions, which means that it is made relative +# to the current working directory to prevent spaces in parent directories' +# names from breaking Make. + + +#  # Program-name variables and the usual options variables are picked up from the  # environment or the command line:  # @@ -118,15 +181,8 @@ objdir   = ${builddir}/obj  stagedir = ${builddir}/stage  # builddir is the build directory, which may be separate from the source tree.  # Intermediate files produced during the build are kept in objdir. Files to be -# 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 +# installed are written under stagedir in the build phase, and then copied to +# their destination in the installation phase.  # Containing makefiles should avoid modifying the directory variables. Users  # should be able to rely on these defaults. @@ -138,6 +194,12 @@ install_cp_flags = ${if ${DESTDIR},--preserve=timestamps}  # directly to the target system, because that would change the timestamps of  # existing directories. +do_preinstall  = ${if ${DESTDIR},false,true} +do_postinstall = ${if ${DESTDIR},false,true} +# Any pre- and post-installation commands that the containing makefile may +# specify are executed when installation is done directly to the target system, +# but not when installation is done to a staging directory, because such +# commands need to be run on the target system, not on a build server.  #  # Containing makefiles may use these variables in their rules, but nothing @@ -169,6 +231,29 @@ stage_miscdocdir     = ${stagedir}${miscdocdir}  # These are the directories where different kinds of files to be installed are  # written during the build. +Make_srcdir         = ${call Make_pathname,srcdir} +Make_builddir       = ${call Make_pathname,builddir} +Make_objdir         = ${call Make_pathname,objdir} +Make_stagedir       = ${call Make_pathname,stagedir} +Make_bindir         = ${call Make_pathname,stage_bindir} +Make_libexecdir     = ${call Make_pathname,stage_libexecdir} +Make_datadir        = ${call Make_pathname,stage_datadir} +Make_sysconfdir     = ${call Make_pathname,stage_sysconfdir} +Make_statedir       = ${call Make_pathname,stage_statedir} +Make_cachedir       = ${call Make_pathname,stage_cachedir} +Make_logdir         = ${call Make_pathname,stage_logdir} +Make_includedir     = ${call Make_pathname,stage_includedir} +Make_archincludedir = ${call Make_pathname,stage_archincludedir} +Make_libdir         = ${call Make_pathname,stage_libdir} +Make_alidir         = ${call Make_pathname,stage_alidir} +Make_gprdir         = ${call Make_pathname,stage_gprdir} +Make_localedir      = ${call Make_pathname,stage_localedir} +Make_mandir         = ${call Make_pathname,stage_mandir} +Make_infodir        = ${call Make_pathname,stage_infodir} +Make_miscdocdir     = ${call Make_pathname,stage_miscdocdir} +# These variables are for use in Make targets, prerequisites and other places +# where Make expects space-separated lists. +  preprocess_file = "${GNATPREP}" ${firstword ${filter %.gp,$^}} $@ \                    ${options_preprocessing} ${Gnatprep_arguments} \                    ${if ${filter ${notdir $@},${notdir ${usage_GPRs}}}, \ @@ -178,16 +263,74 @@ preprocess_file = "${GNATPREP}" ${firstword ${filter %.gp,$^}} $@ \  # 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 -# conveyed to it as Gnatprep symbols. Otherwise srcdir is conveyed. +# conveyed to it as Gnatprep symbols. Otherwise srcdir is conveyed, as it's +# needed by preprocessed build projects.  build_GPR = "${GNAT_BUILDER}" -P ${firstword ${filter %.gpr,$^}} \ -            -aP${srcdir} -aP${builddir} -p \ +            ${addprefix -aP,${VPATH}} -p \              ${options_building} ${builder_arguments} ${GNATFLAGS}  # build_GPR is a command for use in recipes. It performs a build controlled by  # the first project file among the rule's prerequisites.  # +# Adjust the build directory variables, and load the configuration: +# + +# Ensure that builddir is an absolute pathname and is inherited by sub-Makes: + +ifneq (${Comfignat_overriding_absolute_builddir},) +   override builddir := ${Comfignat_overriding_absolute_builddir} +else ifeq (${origin builddir},command line) +   override builddir := ${abspath ${builddir}} +endif +export Comfignat_overriding_absolute_builddir := ${builddir} + +# Read the configuration file if there is one: + +configuration = ${Make_builddir}/comfignat_configuration.mk + +-include ${configuration} + +# Ensure that objdir and stagedir are absolute pathnames and are inherited by +# sub-Makes: + +ifneq (${Comfignat_overriding_absolute_objdir},) +   override objdir := ${Comfignat_overriding_absolute_objdir} +else ifeq (${origin objdir},command line) +   override objdir := ${abspath ${objdir}} +   export Comfignat_overriding_absolute_objdir := ${objdir} +   objdir_is_overridden = true +endif + +ifneq (${Comfignat_overriding_absolute_stagedir},) +   override stagedir := ${Comfignat_overriding_absolute_stagedir} +else ifeq (${origin stagedir},command line) +   override stagedir := ${abspath ${stagedir}} +   export Comfignat_overriding_absolute_stagedir := ${stagedir} +   stagedir_is_overridden = true +endif + +# builddir, objdir and stagedir 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 correction of builddir in sub-Makes must happen before builddir is used +# in VPATH and in the pathname of the configuration file. +# The inclusion of the configuration file must happen after MAKEFILE_LIST has +# been used to define srcdir. +# 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 overridden so that "make configure" will save them. + + +#  # Containing makefiles should assign or append to these variables as needed:  # @@ -207,7 +350,7 @@ endif  ifneq (${origin preprocessed_files},file)     preprocessed_files = \        ${filter-out ${notdir ${usage_GPRs}}, \ -                   ${basename ${notdir ${wildcard ${srcdir}/*.gp}}}} +                   ${basename ${notdir ${wildcard ${Make_srcdir}/*.gp}}}}  endif  # preprocessed_files is a list of files to be produced in the preprocessing  # step at the beginning of the build. Containing makefiles may override it or @@ -241,9 +384,13 @@ endif  # default values for optional arguments should be set in the options variables  # instead. -VPATH += ${srcdir} ${builddir} +VPATH += ${filter-out .,${Make_srcdir} ${Make_builddir}}  # VPATH is a list of directories that Make should search for prerequisites. +# If VPATH has been defined as simply expanded before this file was included, +# then Make_srcdir and Make_builddir will be expanded now, so everything that's +# involved in their values must be defined before this point. +  configuration_variables += \     GNATPREP GNAT_BUILDER \     GNATPREPFLAGS GNAT_BUILDER_FLAGS ADAFLAGS CPPFLAGS CFLAGS CXXFLAGS FFLAGS \ @@ -257,6 +404,7 @@ configuration_variables += \     localedir mandir infodir miscdocdir \     objdir stagedir \     install_cp_flags \ +   do_preinstall do_postinstall \     ${options}  # configuration_variables is a list of variables that can be saved in the  # persistent configuration with "make configure". Containing makefiles may @@ -264,60 +412,12 @@ configuration_variables += \  # -# Read the configuration file if there is one: -# - -configuration = ${builddir}/comfignat_configuration.mk - --include ${configuration} - - -# -# Ensure that builddir, objdir and stagedir are absolute pathnames: -# - -ifeq (${origin builddir},command line) -   override builddir := ${abspath ${builddir}} -endif -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}} -   export Comfignat_overriding_absolute_objdir := ${objdir} -   objdir_is_overridden = true -endif - -ifneq (${Comfignat_overriding_absolute_stagedir},) -   override stagedir := ${Comfignat_overriding_absolute_stagedir} -else ifeq (${origin stagedir},command line) -   override stagedir := ${abspath ${stagedir}} -   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 overridden so that "make configure" will save them. - - -#  # Compute symbol definitions for Gnatprep and external variable assignments for  # build projects:  # -# First define some functions and constants for processing directory variables. +# For this some more functions and constants for processing directory variables +# are needed.  usage_directory_variables = includedir archincludedir libdir alidir  # These are the usage-relevant directory variables. They are needed in usage @@ -325,77 +425,36 @@ usage_directory_variables = includedir archincludedir libdir alidir  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. +# GNAT tools write files to be installed. These are the variables that +# Comfignat-compatible directories projects must provide.  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_ -mung_string = ${subst %,${inert_percent},${subst ${nil} ,${inert_space},${1}}} -unmung_string = ${subst ${inert_percent},%,${subst ${inert_space}, ,${1}}} -# mung_string and unmung_string are used to prevent Make from interpreting -# space and percent characters in strings. +checked_boolean = ${or ${and ${filter 1,${words ${${1}}}}, \ +                             ${filter true false,${${1}}}}, \ +                       ${error ${1} must be "true" or "false"}} +# checked_boolean takes the name of a variable and checks that its value is a +# single word, and that that word is either "true" or "false". If so it returns +# the value; otherwise it complains and stops the execution. -relativize = ${if ${filter ${2}%,${1}}, \ -                  ${3}${1:${2}%=%}, \ -                  ${call relativize,${1},${dir ${2:%/=%}},${3}../}} -# relativize is the recursive algorithm that converts an absolute pathname into -# a relative one. -# Parameters: -#    1: an absolute pathname to convert to relative -#    2: the absolute base pathname, being shortened until it's a prefix of 1 -#    3: a growing series of "../" to lead the relative pathname with -# If 2 is a prefix of 1, then return 3 concatenated with the part of 1 that -# differs from 2. Otherwise delete the last element of 2, add one level of -# "../" to 3, and repeat. -# Within relativize all pathnames have one trailing slash so that only whole -# directory names will match. Otherwise "/usr/lib" could match "/usr/lib64" for -# example. +checked_true = ${filter true,${call checked_boolean,${1}}} +# checked_true takes the name of a variable and checks that it has a boolean +# value. It then returns an empty string for "false" or a non-empty string for +# "true". -prepare_pathname = ${subst //,/,${abspath ${call mung_string,${1}}}/} -# prepare_pathname prepares a pathname for use as a parameter to relativize. -#    · Protect space and percent characters from interpretation by Make. -#    · Normalize the pathname, eliminating ".", ".." and "//". -#    · Append a slash. -#    · If the input was "/", then it is now "//". Change that back to "/". - -relative_to = \ -   ${or ${call unmung_string \ -              ,${patsubst %/,%,${call relativize \ -                                     ,${call prepare_pathname,${1}} \ -                                     ,${call prepare_pathname,${2}},}}},.} -# relative_to converts an absolute pathname into a relative one. What it -# actually does is to prepare the input to relativize and fix up its output. -# Parameters: -#    1: an absolute pathname to convert to relative -#    2: the absolute base pathname that 1 shall be made relative to -# Processing: -#    · Prepare the two input pathnames with prepare_pathname. -#    · Call relativize with the prepared pathnames for parameters 1 and 2, and -#      an empty string for 3. -#    · Strip the result of surrounding spaces and the trailing slash. -#    · Reverse the protection of space and percent characters. -#    · If the result is an empty string, then return "." instead. - -maybe_relative_to = \ -   ${if ${or ${filter-out 1,${words ${relocatable_package}}}, \ -             ${filter-out true false,${relocatable_package}}}, \ -        ${error relocatable_package must be "true" or "false"} \ -       ,${if ${filter true,${relocatable_package}} \ -            ,${call relative_to,${1},${2}},${1}}} +maybe_relative_to = ${if ${call checked_true,relocatable_package} \ +                        ,${call relative_to,${1},${2}},${1}}  # maybe_relative_to converts an absolute pathname into a relative one if a  # relocatable package is desired.  # Parameters:  #    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, +# If relocatable_package is "true", then let relative_to convert the pathname,  # otherwise return parameter 1 unchanged. +# It is checked that relocatable_package has a boolean value.  embed_pathname = ${call maybe_relative_to,${${1}},${if ${filter bindir,${1}} \                                                        ,${libexecdir},${bindir}}} @@ -415,11 +474,10 @@ define convey_builder_directory_variable     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. +# project files.  #    · 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 @@ -433,11 +491,10 @@ 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. +# variable from a directories project.  #    · 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. @@ -480,12 +537,12 @@ all_directories += '-DLockdir="${lockdir}"'  # pathnames.  # 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}}}}} +${foreach var,${builder_directory_variables}, \ +          ${if ${or ${findstring command line,${origin ${var}}}, \ +                    ${filter true,${${var}_is_configured}}, \ +                    ${filter 0,${words ${dirgpr}}}}, \ +               ${eval ${call convey_builder_directory_variable,${var}}}, \ +               ${eval ${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. @@ -498,15 +555,13 @@ ${eval ${foreach var,${builder_directory_variables}, \  option_values = \     ${foreach option,${options}, \ -             ${if ${and ${filter-out environment,${origin ${option}}}, \ -                        ${filter 1,${words ${${option}}}}, \ -                        ${filter true false,${${option}}}}, \ -                  ${option}=${${option}}, \ -                  ${error ${option} must be "true" or "false"}}} -# For each variable listed in options, check that it didn't come from the -# environment (to prevent accidents), that its value is a single word, and that -# that word is either "true" or "false". If so, output a name/value pair; -# otherwise complain and stop. +             ${if ${filter-out undefined environment,${origin ${option}}}, \ +                  ${option}=${call checked_boolean,${option}}, \ +                  ${error ${option} has no default value and must be set to \ +                          "true" or "false" on the command line}}} +# For each variable listed in options, check that it exists, that it didn't +# come from the environment (to prevent accidents), and that it has a boolean +# value. If so, output a name/value pair; otherwise complain and stop.  # Convey boolean options to Gnatprep.  options_preprocessing = ${addprefix -D,${option_values}} @@ -530,8 +585,8 @@ build_targets = ${addsuffix .phony_target,${build_GPRs}}  # A phony target is defined for each build project, and the job of determining  # whether the project needs rebuilding is delegated to the builder. -staged_usage_GPRs = ${addprefix ${stage_gprdir}/,${usage_GPRs}} -preprocessed_files_in_builddir = ${addprefix ${builddir}/,${preprocessed_files}} +staged_usage_GPRs = ${addprefix ${Make_gprdir}/,${usage_GPRs}} +preprocessed_files_in_builddir = ${addprefix ${Make_builddir}/,${preprocessed_files}}  # When usage projects are preprocessed they are written to stage_gprdir. Other  # preprocessed files are assumed to be needed during the build and are written  # to builddir. @@ -543,6 +598,7 @@ preprocessed_files_in_builddir = ${addprefix ${builddir}/,${preprocessed_files}}  .SECONDEXPANSION: +.PHONY: Comfignat_default_goal  Comfignat_default_goal: build  # How to make directories: @@ -551,11 +607,11 @@ Comfignat_default_goal: build  .PRECIOUS: %/  # This rule appears to work around a bug that was fixed in GNU Make 3.82: -${stage_gprdir}/: +${Make_gprdir}/:  	mkdir -p $@  # How to initialize a build directory with a delegating makefile: -${builddir}/Makefile: | ${builddir}/ +${Make_builddir}/Makefile: | ${Make_builddir}/  	@echo 'Writing $@.'  	@( echo 'Comfignat_default_goal: force ; ${delegation_command}'; \  	   echo '%: force ; ${delegation_command} $$@'; \ @@ -570,7 +626,8 @@ ${builddir}/Makefile: | ${builddir}/  # the match-anything rule to update the makefile.  # How to save configured variables: -configure:: ${builddir}/Makefile +.PHONY: configure +configure:: ${Make_builddir}/Makefile  	@echo "Writing ${configuration}."  	@( ${foreach var,${configuration_variables}, \  	             ${if ${or ${findstring command line,${origin ${var}}}, \ @@ -605,6 +662,7 @@ configure:: ${builddir}/Makefile  # V_is_weakly_configured=false".  # How to show the values of configured variables: +.PHONY: show_configuration  show_configuration::  	@${foreach var,${configuration_variables}, \  	           ${if ${filter true,${${var}_is_configured}}, \ @@ -614,21 +672,22 @@ show_configuration::  	 true  # How to preprocess the project Comfignat: -${builddir}/comfignat.gpr: comfignat.gpr.gp | ${builddir}/ +${Make_builddir}/comfignat.gpr: comfignat.gpr.gp | ${Make_builddir}/  	"${GNATPREP}" $< $@ -DInvoked_By_Makefile ${all_directories} ${GNATPREPFLAGS}  # How to preprocess files that are needed during the build: -${builddir}/%: %.gp | ${builddir}/ +${Make_builddir}/%: %.gp | ${Make_builddir}/  	${preprocess_file}  # How to preprocess usage projects: -${stage_gprdir}/%: %.gp | ${stage_gprdir}/ +${Make_gprdir}/%: %.gp | ${Make_gprdir}/  	${preprocess_file}  # How to stage usage projects that don't need preprocessing: -${stage_gprdir}/%: % | ${stage_gprdir}/ +${Make_gprdir}/%: % | ${Make_gprdir}/  	cp -p $< $@ +.PHONY: preprocess  preprocess: $${preprocessed_files_in_builddir}  # How to build a project: @@ -638,33 +697,70 @@ preprocess: $${preprocessed_files_in_builddir}  # requires that all preprocessing of files that are needed during the build is  # done before any project is built. +.PHONY: base  base: $${build_targets}  # This builds the projects listed in build_GPRs, plus any additional  # prerequisites that the containing makefile might add. +.PHONY: build  build: base $${staged_usage_GPRs}  # This is the default build. Additional targets that should be built by default  # may be added as prerequisites. +.PHONY: all  all: build  # Optional targets may be added as prerequisites of "all". -${stagedir}: +${Make_stagedir}:  	@${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. +.PHONY: preinstall +preinstall: +# A recipe may be added to "preinstall" with commands that need to be run +# before the files are installed when installation is done directly to the +# target system, but should be skipped when installation is done to a staging +# directory. +  # How to install what has been built and staged: -install: ${stagedir} -	mkdir -p "${DESTDIR}/" -	cp -RPf ${install_cp_flags} "${stagedir}"/* "${DESTDIR}/" +.PHONY: install_stage +install_stage: ${Make_stagedir} ${if ${call checked_true,do_preinstall},preinstall} +	if [ "`echo "${stagedir}"/*`" != "${stagedir}/*" ]; then \ +	   mkdir -p "${DESTDIR}/"; \ +	   cp -RPf ${install_cp_flags} "${stagedir}"/* "${DESTDIR}/"; \ +	fi +# If stagedir doesn't exist, then the rule to make it by running the build is +# invoked. If stagedir then exists and contains some files (the asterisk gets +# expanded) then those files are copied recursively to DESTDIR or to the +# filesystem root. + +.PHONY: install_files +install_files: install_stage +# A recipe may be added to "install_files" if any files have to be written, +# deleted or moved after the staged directory tree has been installed. This +# should be used only for workarounds. It's better to stage all the files +# correctly under stagedir in the build phase. + +.PHONY: postinstall +postinstall: install_files +# A recipe may be added to "postinstall" with commands that need to be run +# after the files are installed when installation is done directly to the +# target system, but should be skipped when installation is done to a staging +# directory. This will typically be commands that modify existing files on the +# target system. +  .PHONY: install +install: install_files ${if ${call checked_true,do_postinstall},postinstall} +.PHONY: clean  clean::  	rm -Rf "${objdir}" "${stagedir}" ${preprocessed_files_in_builddir} +.PHONY: unconfigure  unconfigure::  	rm -f "${configuration}" +.PHONY: distclean  distclean: clean unconfigure |