@@ -114,37 +114,31 @@ include builders/$(build_os).mk
114
114
include builders/default.mk
115
115
include packages/packages.mk
116
116
117
- full_env =$(shell printenv)
118
-
119
- build_id_string: =$(BUILD_ID_SALT )
120
-
121
- # GCC only prints COLLECT_LTO_WRAPPER when invoked with just "-v", but we want
122
- # the information from "-v -E -" as well, so just include both.
117
+ # Previously, we directly invoked the well-known programs using $(shell ...)
118
+ # to contruct build_id_string. However, that was problematic because:
123
119
#
124
- # '3>&1 1>&2 2>&3 > /dev/null' is supposed to swap stdin and stdout and silence
125
- # stdin, since we only want the stderr output
126
- build_id_string+ =$(shell $(build_CC ) -v < /dev/null 3>&1 1>&2 2>&3 > /dev/null) $(shell $(build_CC ) -v -E - < /dev/null 3>&1 1>&2 2>&3 > /dev/null)
127
- build_id_string+ =$(shell $(build_AR ) --version 2>/dev/null) $(filter AR_% ,$(full_env ) ) ZERO_AR_DATE=$(ZERO_AR_DATE )
128
- build_id_string+ =$(shell $(build_CXX ) -v < /dev/null 3>&1 1>&2 2>&3 > /dev/null) $(shell $(build_CXX ) -v -E - < /dev/null 3>&1 1>&2 2>&3 > /dev/null)
129
- build_id_string+ =$(shell $(build_RANLIB ) --version 2>/dev/null) $(filter RANLIB_% ,$(full_env ) )
130
- build_id_string+ =$(shell $(build_STRIP ) --version 2>/dev/null) $(filter STRIP_% ,$(full_env ) )
131
-
132
- $(host_arch)_$(host_os)_id_string: =$(HOST_ID_SALT )
133
- $(host_arch)_$(host_os)_id_string+ =$(shell $(host_CC ) -v < /dev/null 3>&1 1>&2 2>&3 > /dev/null) $(shell $(host_CC ) -v -E - < /dev/null 3>&1 1>&2 2>&3 > /dev/null)
134
- $(host_arch)_$(host_os)_id_string+ =$(shell $(host_AR ) --version 2>/dev/null) $(filter AR_% ,$(full_env ) ) ZERO_AR_DATE=$(ZERO_AR_DATE )
135
- $(host_arch)_$(host_os)_id_string+ =$(shell $(host_CXX ) -v < /dev/null 3>&1 1>&2 2>&3 > /dev/null) $(shell $(host_CXX ) -v -E - < /dev/null 3>&1 1>&2 2>&3 > /dev/null)
136
- $(host_arch)_$(host_os)_id_string+ =$(shell $(host_RANLIB ) --version 2>/dev/null) $(filter RANLIB_% ,$(full_env ) )
137
- $(host_arch)_$(host_os)_id_string+ =$(shell $(host_STRIP ) --version 2>/dev/null) $(filter STRIP_% ,$(full_env ) )
138
-
139
- ifneq ($(strip $(FORCE_USE_SYSTEM_CLANG ) ) ,)
140
- # Make sure that cache is invalidated when switching between system and
141
- # depends-managed, pinned clang
142
- build_id_string+ =system_clang
143
- $(host_arch)_$(host_os)_id_string+ =system_clang
144
- endif
145
-
146
- build_id_string+=GUIX_ENVIRONMENT =$(realpath $(GUIX_ENVIRONMENT ) )
147
- $(host_arch)_$(host_os)_id_string+=GUIX_ENVIRONMENT =$(realpath $(GUIX_ENVIRONMENT ) )
120
+ # 1. When invoking a shell, GNU Make special-cases exit code 127 (command not
121
+ # found) by not capturing the output but instead passing it through. This is
122
+ # not done for any other exit code.
123
+ #
124
+ # 2. Characters like '#' (from these programs' output) would end up in make
125
+ # variables like build_id_string, which would be wrongly interpreted by make
126
+ # when these variables were used.
127
+ #
128
+ # Therefore, we should avoid having arbitrary strings in make variables where
129
+ # possible. The gen_id script used here hashes the output to construct a
130
+ # "make-safe" id.
131
+ #
132
+ # Also note that these lines need to be:
133
+ #
134
+ # 1. After including {hosts,builders}/*.mk, since they rely on the tool
135
+ # variables (e.g. build_CC, host_STRIP, etc.) to be set.
136
+ #
137
+ # 2. Before including packages/*.mk (excluding packages/packages.mk), since
138
+ # they rely on the build_id variables
139
+ #
140
+ build_id: =$(shell env CC='$(build_CC ) ' CXX='$(build_CXX ) ' AR='$(build_AR ) ' RANLIB='$(build_RANLIB ) ' STRIP='$(build_STRIP ) ' SHA256SUM='$(build_SHA256SUM ) ' DEBUG='$(DEBUG ) ' ./gen_id '$(BUILD_ID_SALT ) ' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT ) ) ')
141
+ $(host_arch)_$(host_os)_id: =$(shell env CC='$(host_CC ) ' CXX='$(host_CXX ) ' AR='$(host_AR ) ' RANLIB='$(host_RANLIB ) ' STRIP='$(host_STRIP ) ' SHA256SUM='$(build_SHA256SUM ) ' DEBUG='$(DEBUG ) ' ./gen_id '$(HOST_ID_SALT ) ' 'GUIX_ENVIRONMENT=$(realpath $(GUIX_ENVIRONMENT ) ) ')
148
142
149
143
qrencode_packages_$(NO_QR) = $(qrencode_packages )
150
144
0 commit comments