summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--makefiles/Makefile.tools28
-rw-r--r--makefiles/Makefile.top92
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