aboutsummaryrefslogtreecommitdiff
path: root/Makefile.in
diff options
context:
space:
mode:
authorRupert Swarbrick <rswarbrick@lowrisc.org>2020-02-27 13:20:41 +0000
committerRupert Swarbrick <rswarbrick@lowrisc.org>2020-02-27 13:43:58 +0000
commit2efea60720650c57649aec6ceef1756b892eec9b (patch)
tree9ad49487b943fdb3908f26fdf73de705c997141f /Makefile.in
parent157143b5038ef2b92b1c70d445b566d57b6f5096 (diff)
downloadspike-2efea60720650c57649aec6ceef1756b892eec9b.zip
spike-2efea60720650c57649aec6ceef1756b892eec9b.tar.gz
spike-2efea60720650c57649aec6ceef1756b892eec9b.tar.bz2
Allow overriding CFLAGS and similar when building
Before this patch, I don't think it was possible to change (say) CFLAGS as part of running the make command. Nor did setting them when running configure do anything. Getting this right is a little fiddly: for example, see Automake's approach at [1] ("AM_CFLAGS" and friends). This patch adds an "mcppbs-" prefix, and sets things up properly for CFLAGS, CPPFLAGS, CXXFLAGS and LDFLAGS. Note that the bulk of the patch is either the auto-generated configure script or the ax_*.m4 files vendored in from the autoconf archive (needed to handle --export-dynamic correctly without trashing settings from the user running configure). What's supposed to happen is as follows: - Base compilation flags that should apply to everything (standard optimisation flags, warning flags etc.) are defined in Makefile.in. - When the user runs configure, they can set compilation flags on the command line. These end up as environment variables in the shell script. - Compilation flags that can only be decided when we run configure (this is currently just whether we support -Wl,--export-dynamic) are appended to the configure-time LDFLAGS environment variable. - At the end of the configure script, these environment variables are spliced into Makefile.in to fill out the corresponding @<varname>@ entries. - When running make, the user might again override compilation flags. These will get appended to the flags found so far. As a concrete example: mkdir build cd build ../configure CXXFLAGS='-O3' make CXXFLAGS='-O0' will result in c++ compile commands that look like this: g++ -MMD -MP \ -DPREFIX=\"/usr/local\" -Wall -Wno-unused -g -O2 -std=c++11 \ -O3 \ -O0 \ -I. -I.. -I../fesvr -I../riscv -I../dummy_rocc -I../softfloat \ -I../spike_main -fPIC -c ../fesvr/elfloader.cc (I've added some newlines to wrap the long line). Note that we have the base flags from Makefile.in (called $(default-CXXFLAGS) there) first. Then we have the -O3 from the configure command. Finally we have the -O0 from the Make command line. And I can finally run "make CXXFLAGS='-O0 -g3'". Phew! [1] https://www.gnu.org/software/automake/manual/html_node/Flag-Variables-Ordering.html
Diffstat (limited to 'Makefile.in')
-rw-r--r--Makefile.in45
1 files changed, 36 insertions, 9 deletions
diff --git a/Makefile.in b/Makefile.in
index f3bfb3f..154a6fd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -77,25 +77,52 @@ VPATH := $(addprefix $(src_dir)/, $(sprojs_enabled))
# C++ compiler
# - CPPFLAGS : flags for the preprocessor (eg. -I,-D)
# - CXXFLAGS : flags for C++ compiler (eg. -Wall,-g,-O3)
+#
+# To allow a user to specify CFLAGS or similar as part of the Make
+# command, we also have mcpps-CFLAGS etc. with stuff that shouldn't be
+# lost in such a case.
+#
+# The order of precedence (highest to lowest) is then:
+#
+# - Specified as part of Make command line
+# - Specified as part of running configure
+# - Specified here (default-CFLAGS)
+#
+# These all appear on the command line, from lowest precedence to
+# highest.
+
+default-CFLAGS := -DPREFIX=\"$(prefix)\" -Wall -Wno-unused -g -O2
+default-CXXFLAGS := $(default-CFLAGS) -std=c++11
+
+mcppbs-CPPFLAGS := @CPPFLAGS@
+mcppbs-CFLAGS := $(default-CFLAGS) @CFLAGS@
+mcppbs-CXXFLAGS := $(default-CXXFLAGS) @CXXFLAGS@
CC := @CC@
CXX := @CXX@
-CFLAGS += @CFLAGS@ -DPREFIX=\"$(prefix)\"
-CPPFLAGS += @CPPFLAGS@
-CXXFLAGS += @CXXFLAGS@ -DPREFIX=\"$(prefix)\"
-COMPILE := $(CXX) -MMD -MP $(CPPFLAGS) $(CXXFLAGS) \
- $(sprojs_include)
-COMPILE_C := $(CC) -MMD -MP $(CPPFLAGS) $(CFLAGS) \
- $(sprojs_include)
+
+# These are the flags actually used for a C++ compile or a C compile.
+# The language-specific flags come after the preprocessor flags, but
+# user-supplied flags always take precedence.
+all-cxx-flags := \
+ $(mcppbs-CPPFLAGS) $(mcppbs-CXXFLAGS) $(CPPFLAGS) $(CXXFLAGS)
+all-c-flags := \
+ $(mcppbs-CPPFLAGS) $(mcppbs-CFLAGS) $(CPPFLAGS) $(CFLAGS)
+
+COMPILE := $(CXX) -MMD -MP $(all-cxx-flags) $(sprojs_include)
+COMPILE_C := $(CC) -MMD -MP $(all-c-flags) $(sprojs_include)
+
# Linker
# - LDFLAGS : Flags for the linker (eg. -L)
# - LIBS : Library flags (eg. -l)
+mcppbs-LDFLAGS := @LDFLAGS@
+all-link-flags := $(mcppbs-LDFLAGS) $(LDFLAGS)
+
comma := ,
LD := $(CXX)
-LDFLAGS := @LDFLAGS@
LIBS := @LIBS@
-LINK := $(LD) -L. $(LDFLAGS) -Wl,-rpath,$(install_libs_dir) $(patsubst -L%,-Wl$(comma)-rpath$(comma)%,$(filter -L%,$(LDFLAGS)))
+LINK := $(LD) -L. $(all-link-flags) -Wl,-rpath,$(install_libs_dir) $(patsubst -L%,-Wl$(comma)-rpath$(comma)%,$(filter -L%,$(LDFLAGS)))
# Library creation