diff options
-rw-r--r-- | makefiles/Makefile.tools | 28 | ||||
-rw-r--r-- | makefiles/Makefile.top | 92 |
2 files changed, 119 insertions, 1 deletions
diff --git a/makefiles/Makefile.tools b/makefiles/Makefile.tools index c8087a8..9da5538 100644 --- a/makefiles/Makefile.tools +++ b/makefiles/Makefile.tools @@ -13,7 +13,8 @@ # BUILD Type of build to perform: # release - Release build (default) # debug - Debug build -# OPTCFLAGS Optional compiler flags for $(BUILD) +# OPTCFLAGS Optional C compiler flags for $(BUILD) +# OPTCXXFLAGS Optional C++ compiler flags for $(BUILD) # OPTLDFLAGS Optional linker flags for $(BUILD) # TARGET Target platform (defaults to host) # @@ -72,6 +73,7 @@ ifeq ($(TARGET),riscos) GCCSDK_INSTALL_ENV ?= <NSLibs$$Dir> CC__ := gcc + CXX__ := g++ CMHG ?= cmunge GENHTML ?= echo LCOV ?= echo @@ -89,6 +91,7 @@ ifeq ($(TARGET),riscos) AR__ := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*ar) CC__ := $(wildcard $(GCCSDK_INSTALL_CROSSBIN)/*gcc) + CXX__ := $(wildcard $(GCCSDK_INSTALL_CROSSBIN/*g++) CMHG ?= PATH="$(GCCSDK_INSTALL_CROSSBIN):$(PATH)" $(GCCSDK_INSTALL_CROSSBIN)/cmunge GENHTML ?= echo LCOV ?= echo @@ -106,6 +109,7 @@ ifeq ($(TARGET),riscos) endif CFLAGS := $(CFLAGS) -mpoke-function-name -I$(GCCSDK_INSTALL_ENV)/include + CXXFLAGS := $(CXXFLAGS) -mpoke-function-name -I$(GCCSDK_INSTALL_ENV)/include LDFLAGS := $(LDFLAGS) -L$(GCCSDK_INSTALL_ENV)/lib CMHGFLAGS := -p -tgcc -32bit -apcs 3/32/nonreent/fpe2/noswst/nofpr/nofp @@ -146,12 +150,14 @@ ifeq ($(TARGET),windows) GCCSDK_INSTALL_ENV ?= /usr/local/mingw CC__ := i586-mingw32msvc-gcc + CXX__ := i586-mingw32msvc-g++ AR__ := i586-mingw32msvc-ar PKGCONFIG ?= $(GCCSDK_INSTALL_ENV)/bin/win-pkg-config endif CFLAGS := $(CFLAGS) -U__STRICT_ANSI__ -I$(GCCSDK_INSTALL_ENV)/include + CXXFLAGS := $(CXXFLAGS) -U__STRICT_ANSI__ -I$(GCCSDK_INSTALL_ENV)/include LDFLAGS := $(LDFLAGS) -L$(GCCSDK_INSTALL_ENV)/lib # Default prefix @@ -172,6 +178,8 @@ GENHTML ?= genhtml HOST_CC ?= $(CC) +HOST_CXX ?= $(CXX) + INSTALL ?= install LCOV ?= lcov @@ -201,8 +209,10 @@ XSLTPROC ?= xsltproc ifeq ($(BUILD),release) OPTCFLAGS ?= -DNDEBUG -O2 + OPTCXXFLAGS ?= -DNDEBUG -O2 else OPTCFLAGS ?= -g -O0 + OPTCXXFLAGS ?= -g -O0 OPTLDFLAGS ?= -g endif @@ -213,9 +223,12 @@ endif ASFLAGS ?= -xassembler-with-cpp CFLAGS := $(CFLAGS) $(OPTCFLAGS) +CXXFLAGS := $(CXXFLAGS) $(OPTCXXFLAGS) # Some attempt to sanitise TARGET and HOST when used as pre-defines CFLAGS := $(CFLAGS) -DBUILD_TARGET_$(subst .,_,$(subst -,_,$(TARGET))) +CXXFLAGS := $(CXXFLAGS) -DBUILD_TARGET_$(subst .,_,$(subst -,_,$(TARGET))) CFLAGS := $(CFLAGS) -DBUILD_HOST_$(subst .,_,$(subst -,_,$(HOST))) +CXXFLAGS := $(CXXFLAGS) -DBUILD_HOST_$(subst .,_,$(subst -,_,$(HOST))) ASFLAGS := $(ASFLAGS) $(CFLAGS) LDFLAGS := $(LDFLAGS) $(OPTLDFLAGS) @@ -223,18 +236,22 @@ LDFLAGS := $(LDFLAGS) $(OPTLDFLAGS) # Extensions for coverage target ifeq ($(MAKECMDGOALS),coverage) COVCFLAGS ?= -fprofile-arcs -ftest-coverage + COVCXXFLAGS ?= -fprofile-arcs -ftest-coverage COVLDFLAGS ?= -lgcov CFLAGS := $(CFLAGS) $(COVCFLAGS) + CXXFLAGS := $(CXXFLAGS) $(COVCXXFLAGS) LDFLAGS := $(LDFLAGS) $(COVLDFLAGS) endif # Extensions for profile target ifeq ($(MAKECMDGOALS),profile) PROFCFLAGS ?= -pg + PROFCXXFLAGS ?= -pg PROFLDFLAGS ?= -pg CFLAGS := $(CFLAGS) $(PROFCFLAGS) + CXXFLAGS := $(CXXFLAGS) $(PROFCXXFLAGS) LDFLAGS := $(LDFLAGS) $(PROFLDFLAGS) endif @@ -253,6 +270,7 @@ endif ifeq ($(COMPONENT_TYPE),lib-shared) # Default CFLAGS/LDFLAGS for shared libraries SHAREDCFLAGS ?= -fPIC -DPIC + SHAREDCXXFLAGS ?= -fPIC -DPIC SHAREDLDFLAGS ?= -shared \ -Wl,-soname,$(SONAME) SHAREDLDPATH ?= LD_LIBRARY_PATH="$(BUILDDIR):$(LD_LIBRARY_PATH)" @@ -268,6 +286,7 @@ ifeq ($(COMPONENT_TYPE),riscos-module) endif CFLAGS := $(CFLAGS) -mmodule + CXXFLAGS := $(CXXFLAGS) -mmodule LDFLAGS := $(LDFLAGS) -mmodule endif @@ -296,6 +315,13 @@ else endif endif +# CXX +ifeq ($(origin CXX),default) + ifdef CXX__ + CXX := $(CXX__) + endif +endif + # AR ifeq ($(origin AR),default) ifdef AR__ diff --git a/makefiles/Makefile.top b/makefiles/Makefile.top index df1ff9b..a9e0213 100644 --- a/makefiles/Makefile.top +++ b/makefiles/Makefile.top @@ -31,9 +31,11 @@ # # ARFLAGS Archiver flags for the current compilation # CFLAGS C compiler flags for the current compilation +# CXXFLAGS C++ compiler flags for the current compilation # LDFLAGS Linker flags for the current compilation # # TESTCFLAGS Any test-specific CFLAGS +# TESTCXXFLAGS Any test-specific CXXFLAGS # TESTLDFLAGS Any test-specific LDFLAGS # # TESTRUNNER Test runner invocation command @@ -168,12 +170,20 @@ $(eval $(foreach INC, $(MAKE_INCLUDES), $(call do_include,$(INC)))) # Calculate objects to build OBJECTS := $(addprefix $(BUILDDIR)/,$(filter %.o, \ $(subst /,_,$(subst .c,.o,$(SOURCES))) \ + $(subst /,_,$(subst .cpp,.o,$(SOURCES))) \ $(subst /,_,$(subst .cmhg,.o,$(SOURCES))) \ $(subst /,_,$(subst .s,.o,$(SOURCES))))) bin_for_test = $(addprefix $(BUILDDIR)/,$(firstword $(subst :, ,$(ITEM)))) TEST_BINARIES := $(foreach ITEM,$(TEST_ITEMS),$(bin_for_test)) +# Determine if we're building any C++ sources +ifneq ($(filter %.cpp,$(SOURCES)),) + CXX_IN_BUILD := yes +else + CXX_IN_BUILD := no +endif + # Determine the output filename ifeq ($(findstring lib,$(COMPONENT_TYPE)),lib) ifeq ($(findstring lib-shared,$(COMPONENT_TYPE)),lib-shared) @@ -355,7 +365,11 @@ ifeq ($(COMPONENT_TYPE),lib-static) $(Q)$(AR) $(ARFLAGS) $@ $(OBJECTS) else $(VQ)$(ECHO) $(ECHOFLAGS) " LINK: $@" + ifeq ($(CXX_IN_BUILD),yes) + $(Q)$(CXX) -o $@ $(OBJECTS) $(LDFLAGS) $(SHAREDLDFLAGS) + else $(Q)$(CC) -o $@ $(OBJECTS) $(LDFLAGS) $(SHAREDLDFLAGS) + endif endif ############################################################################### @@ -377,6 +391,15 @@ ifeq ($(CC_CAN_BUILD_AND_DEP),yes) endef + define dep_cxx + ifeq ($$(findstring $$(BUILDDIR)/$2,$$(DEPFILES)),) + $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 + + DEPFILES += $$(BUILDDIR)/$2 + endif + + endef + define build_c ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 @@ -387,6 +410,17 @@ ifeq ($(CC_CAN_BUILD_AND_DEP),yes) endif endef + + define build_cxx + ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) + $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 + $$(VQ)$$(ECHO) $$(ECHOFLAGS) " COMPILE: $1" + $$(Q)$$(CXX) -MMD -MP $$($3) -o $$@ -c $1 + + BUILDFILES += $$(BUILDDIR)/$2 + endif + + endef else ifeq ($(CC_CANNOT_DEP),yes) # C compiler cannot calculate dependencies @@ -394,6 +428,9 @@ else define dep_c endef + define dep_cxx + endef + define build_c ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 @@ -404,6 +441,17 @@ else endif endef + + define build_cxx + ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) + $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 + $$(VQ)$$(ECHO) $$(ECHOFLAGS) " COMPILE: $1" + $$(Q)$$(CXX) $$($3) -o $$@ -c $1 + + BUILDFILES += $$(BUILDDIR)/$2 + endif + + endef else # C compiler must calculate dependencies first, then compile (default) @@ -421,6 +469,20 @@ else endef + define dep_cxx + ifeq ($$(findstring $$(BUILDDIR)/$2,$$(DEPFILES)),) + $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 + $$(VQ)$$(ECHO) $$(ECHOFLAGS) " DEP: $1" + $$(Q)$$(RM) $$(RMFLAGS) $($@) + $$(Q)$$(CXX) $$($3) -MM $1 > $$@.tmp + $$(Q)$$(SED) $$(SEDFLAGS) 's,^.*:,$$@ $$(@:.d=.o):,' < $$@.tmp > $$@ + $$(Q)$$(RM) $$@.tmp + + DEPFILES += $$(BUILDDIR)/$2 + endif + + endef + define build_c ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 @@ -431,6 +493,17 @@ else endif endef + + define build_cxx + ifeq ($$(findstring $$(BUILDDIR)/$2,$$(BUILDFILES)),) + $$(BUILDDIR)/$2: $$(BUILDDIR)/stamp $1 + $$(VQ)$$(ECHO) $$(ECHOFLAGS) " COMPILE: $1" + $$(Q)$$(CXX) $$($3) -o $$@ -c $1 + + BUILDFILES += $$(BUILDDIR)/$2 + endif + + endef endif endif @@ -456,16 +529,22 @@ define build_s endef BUILDCFLAGS = $(CFLAGS) $(SHAREDCFLAGS) +BUILDCXXFLAGS = $(CXXFLAGS) $(SHAREDCXXFLAGS) BUILDASFLAGS = $(ASFLAGS) $(SHAREDCFLAGS) # Generate dependency rules $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ $(call dep_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.d)),BUILDCFLAGS))) +$(eval $(foreach SOURCE,$(filter %.cpp,$(SOURCES)), \ + $(call dep_cxx,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.d)),BUILDCXXFLAGS))) # Generate compilation rules $(eval $(foreach SOURCE,$(filter %.c,$(SOURCES)), \ $(call build_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),BUILDCFLAGS))) +$(eval $(foreach SOURCE,$(filter %.cpp,$(SOURCES)), \ + $(call build_cxx,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.o)),BUILDCXXFLAGS))) + $(eval $(foreach SOURCE,$(filter %.cmhg,$(SOURCES)), \ $(call build_cmhg,$(SOURCE),$(subst /,_,$(SOURCE:.cmhg=.o))))) @@ -480,12 +559,17 @@ ifeq ($(WANT_TEST),yes) endif TESTCFLAGS += $(CFLAGS) + TESTCXXFLAGS += $(CXXFLAGS) TESTLDFLAGS += $(LDFLAGS) define link_test $2: $($3) $1 $$(VQ)$$(ECHO) $$(ECHOFLAGS) " LINK: $2" + ifeq ($$(CXX_IN_BUILD),yes) + $$(Q)$$(CXX) -o $$@ $1 $$($4) + else $$(Q)$$(CC) -o $$@ $1 $$($4) + endif endef @@ -498,10 +582,18 @@ ifeq ($(WANT_TEST),yes) $(call dep_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.d)),TESTCFLAGS)))) $(eval $(foreach ITEM,$(TEST_ITEMS), \ + $(foreach SOURCE,$(filter %.cpp,$(srcs_for_test)), \ + $(call dep_cxx,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.d)),TESTCXXFLAGS)))) + + $(eval $(foreach ITEM,$(TEST_ITEMS), \ $(foreach SOURCE,$(filter %.c,$(srcs_for_test)), \ $(call build_c,$(SOURCE),$(subst /,_,$(SOURCE:.c=.o)),TESTCFLAGS)))) $(eval $(foreach ITEM,$(TEST_ITEMS), \ + $(foreach SOURCE,$(filter %.cpp,$(srcs_for_test)), \ + $(call build_cxx,$(SOURCE),$(subst /,_,$(SOURCE:.cpp=.o)),TESTCXXFLAGS)))) + + $(eval $(foreach ITEM,$(TEST_ITEMS), \ $(call link_test,$(objs_for_test),$(bin_for_test),TESTLIB,TESTLDFLAGS))) endif |