From 4be96e9fd99777cb84112bbe9498c89c7a88b502 Mon Sep 17 00:00:00 2001 From: John Mark Bell Date: Wed, 26 Aug 2009 12:47:22 +0000 Subject: C++ support svn path=/trunk/tools/buildsystem/; revision=9461 --- makefiles/Makefile.top | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'makefiles/Makefile.top') 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 @@ -497,10 +581,18 @@ ifeq ($(WANT_TEST),yes) $(foreach SOURCE,$(filter %.c,$(srcs_for_test)), \ $(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))) -- cgit v1.2.3