# Just check if we have everything defined ifeq ($(CC_SOURCE_FILES_EXTS),) CC_SOURCE_FILES_EXTS := c endif ifeq ($(CXX_SOURCE_FILES_EXTS),) CXX_SOURCE_FILES_EXTS := cpp cxx cc endif # Target configuration DEBUG_INFO_FORMAT := gdb3 ifeq ($(TARGET),windows) DEBUG_INFO_FORMAT := coff endif CXXFLAGS_debug := -g$(DEBUG_INFO_FORMAT) -O0 CFLAGS_debug := -g$(DEBUG_INFO_FORMAT) -O0 CXXFLAGS_release := -O2 CFLAGS_release := -O2 OUTPUT_DIR_PREFIX = ../lib/$(TARGET)-$(ARCH) BUILD_DIR_PREFIX = ../build/$(TARGET)-$(ARCH) OBJECTS_NAMES = $(foreach sourceFilesExt,$(CC_SOURCE_FILES_EXTS), \ $(patsubst %.$(sourceFilesExt),%.$(sourceFilesExt).cc.o,$(filter %.$(sourceFilesExt),$(LOCAL_SRC_FILES))) \ ) $(foreach sourceFilesExt,$(CXX_SOURCE_FILES_EXTS), \ $(patsubst %.$(sourceFilesExt),%.$(sourceFilesExt).cxx.o,$(filter %.$(sourceFilesExt),$(LOCAL_SRC_FILES))) \ ) OBJECTS = $(addprefix obj-$(TARGET)-$(ARCH)/,$(OBJECTS_NAMES)) # Declare phony targets .PHONY: release debug clean installr installd install-release-$(DYNAMICLIB_EXT) install-debug-$(DYNAMICLIB_EXT) install-release-$(STATICLIB_EXT) install-debug-$(STATICLIB_EXT) # Default target .DEFAULT: installr # Precious targets .PRECIOUS: build-release/$(LIBNAME).$(LIBTYPE) build-debug/$(LIBNAME).$(LIBTYPE) $(addprefix build-release/,$(OBJECTS)) $(addprefix build-debug/,$(OBJECTS)) # Route build targets properly installr: $(OUTPUT_DIR_PREFIX)-release/$(LIBNAME).$(LIBTYPE) installd: $(OUTPUT_DIR_PREFIX)-debug/$(LIBNAME).$(LIBTYPE) release: $(BUILD_DIR_PREFIX)-release/$(LIBNAME).$(LIBTYPE) debug: $(BUILD_DIR_PREFIX)-debug/$(LIBNAME).$(LIBTYPE) # Clean removes all objects clean: $(RM) -r build-release/obj-$(TARGET)-$(ARCH)/ $(RM) -r build-debug/obj-$(TARGET)-$(ARCH)/ $(RM) -r build-release/$(TARGET)-$(ARCH) $(RM) -r build-debug/$(TARGET)-$(ARCH) $(RM) -r $(BUILD_DIR_PREFIX)-release $(RM) -r $(BUILD_DIR_PREFIX)-debug $(RM) $(OUTPUT_DIR_PREFIX)-release/$(LIBNAME).$(LIBTYPE) $(RM) $(OUTPUT_DIR_PREFIX)-debug/$(LIBNAME).$(LIBTYPE) # This target copies final output file to output directory $(OUTPUT_DIR_PREFIX)-%/$(LIBNAME).$(DYNAMICLIB_EXT): $(BUILD_DIR_PREFIX)-%/$(LIBNAME).$(LIBTYPE) @mkdir -p $(OUTPUT_DIR_PREFIX)-$* cp $(BUILD_DIR_PREFIX)-$*/$(LIBNAME).$(LIBTYPE) $(OUTPUT_DIR_PREFIX)-$*/$(LIBNAME).$(LIBTYPE) $(OUTPUT_DIR_PREFIX)-%/$(LIBNAME).$(STATICLIB_EXT): $(BUILD_DIR_PREFIX)-%/$(LIBNAME).$(LIBTYPE) @echo $@ does not need install # Builds source files using CC compiler build-release/obj-$(TARGET)-$(ARCH)/%.cc.o : % $(LOCAL_C_INCLUDES) @mkdir -p `dirname $@` $(CC) -o $@ -c $< $(CFLAGS_release) $(CFLAGS) $(addprefix -I, $(LOCAL_C_INCLUDES)) $(LOCAL_CFLAGS) $(GLOBAL_INCLUDES) build-debug/obj-$(TARGET)-$(ARCH)/%.cc.o : % $(LOCAL_C_INCLUDES) @mkdir -p `dirname $@` $(CC) -o $@ -c $< $(CFLAGS_debug) $(CFLAGS) $(addprefix -I, $(LOCAL_C_INCLUDES)) $(LOCAL_CFLAGS) $(GLOBAL_INCLUDES) # Builds source files using CXX compiler build-release/obj-$(TARGET)-$(ARCH)/%.cxx.o : % $(LOCAL_C_INCLUDES) @mkdir -p `dirname $@` $(CXX) -o $@ -c $< $(CXXFLAGS_release) $(CXXFLAGS) $(addprefix -I, $(LOCAL_C_INCLUDES)) $(LOCAL_CFLAGS) $(GLOBAL_INCLUDES) build-debug/obj-$(TARGET)-$(ARCH)/%.cxx.o : % $(LOCAL_C_INCLUDES) @mkdir -p `dirname $@` $(CXX) -o $@ -c $< $(CXXFLAGS_debug) $(CXXFLAGS) $(addprefix -I, $(LOCAL_C_INCLUDES)) $(LOCAL_CFLAGS) $(GLOBAL_INCLUDES) # This target assembles static library .SECONDEXPANSION: build-%/$(TARGET)-$(ARCH)/$(LIBNAME).$(STATICLIB_EXT): $$(addprefix build-%/,$(OBJECTS)) @mkdir -p `dirname $@` $(AR) rs $@ $(addprefix build-$*/,$(OBJECTS)) # This target assembles dynamic library .SECONDEXPANSION: build-%/$(TARGET)-$(ARCH)/$(LIBNAME).$(DYNAMICLIB_EXT): $$(addprefix build-%/,$(OBJECTS)) @mkdir -p `dirname $@` $(CXX) -shared -o $@ $(addprefix build-$*/,$(OBJECTS)) $(LDFLAGS) -L$(BUILD_DIR_PREFIX)-$* $(LDLIBS) # This is for copying binary files to build directory $(BUILD_DIR_PREFIX)-%/$(LIBNAME).$(LIBTYPE): build-%/$(TARGET)-$(ARCH)/$(LIBNAME).$(LIBTYPE) @mkdir -p $(BUILD_DIR_PREFIX)-$* cp build-$*/$(TARGET)-$(ARCH)/$(LIBNAME).$(LIBTYPE) $(BUILD_DIR_PREFIX)-$*/$(LIBNAME).$(LIBTYPE)