diff --git a/make/defs-cpp.mk b/make/defs-cpp.mk index f0de5cd5..d83b455d 100644 --- a/make/defs-cpp.mk +++ b/make/defs-cpp.mk @@ -1,141 +1,47 @@ -# ----- compilation options +ifndef JW_BUILD_CPP_DEFS_MK_INCLUDED +JW_BUILD_CPP_DEFS_MK_INCLUDED := true + +# -- default choices + #COMPILER_SUITE ?= clang COMPILER_SUITE ?= gcc CPP_STANDARD_VERSION ?= 17 C_STANDARD_VERSION ?= 11 - -ifeq ($(TARGET_TRIPLET),arm-none-eabi) - LIBTYPE ?= static -else - LIBTYPE ?= shared -endif - -ifeq ($(COMPILER_SUITE),gcc) - DEBUGGER ?= gdb - BUILD_EXTRA_DEBUG_FLAGS += -ggdb -endif - -ifeq ($(COMPILER_SUITE),clang) - DEBUGGER = lldb -endif - -ifeq ($(TARGET_ARCH),$(ARCH_32)) - PROJECT_CPPFLAGS += -m32 - PROJECT_LDFLAGS += -m32 -endif - -ifeq ($(TARGET_ARCH),armv7hl) - PROJECT_CPPFLAGS += -fPIC -else ifeq ($(TARGET_ARCH),aarch64) - PROJECT_CPPFLAGS += -fPIC -endif +USE_PROJECT_LIB ?= true +EXPORT_PROJECT_LIB ?= $(USE_PROJECT_LIB) +USE_JW_BUILD ?= true +USE_EXCEPTIONS_IN_C ?= true +USE_COMPILER_OPTIMIZATION_OPTS ?= false +USE_COMPILER_DEBUG_OPTS ?= true +USE_VERSION_MACROS ?= true +COMPILE_DEBUG_CODE ?= true ifeq ($(findstring $(TARGET_OS),linux),) USE_SYSTEMD := false endif -ifeq ($(DEVELOPMENT),true) - export G_SLICE = always-malloc - export G_DEBUG = gc-friendly,resident-modules - export MALLOC_CHECK_ = 2 -endif +# -- build TAGGED_TMPL_TAGS cascade -USE_PROJECT_LIB ?= true -EXPORT_PROJECT_LIB ?= $(USE_PROJECT_LIB) -USE_JW_BUILD ?= true -USE_EXCEPTIONS_IN_C ?= true - -USE_COMPILER_OPTIMIZATION_OPTS ?= false -USE_COMPILER_DEBUG_OPTS ?= true -COMPILE_DEBUG_CODE ?= true - -BUILD_CFLAGS += $(CFLAGS) -BUILD_CXXFLAGS += $(CXXFLAGS) -BUILD_CPPFLAGS += $(CPPFLAGS) -BUILD_LDFLAGS += $(LDFLAGS) - -BUILD_CPPFLAGS += -D_FILE_OFFSET_BITS=64 -Wall -Wno-unused-value -Wno-deprecated -DPROJECT_STR=\"$(PROJECT)\" -BUILD_LDFLAGS += -Wall - -LOG_QUAL_PREFIX ?= $(LOGID): - -ifneq ($(LOG_QUAL_PREFIX),) - PROJECT_CPPFLAGS += -DKEEP_FILES_OPEN -DLOG_QUAL_PREFIX=\"$(LOG_QUAL_PREFIX)\" -endif - -ifeq ($(CATCH_ONLY_YERROR),true) - BUILD_CPPFLAGS += -DCATCH_ONLY_YERROR -endif - -SYSCFG_DIR ?= /etc/sysconfig -SYSCFG_FILE ?= $(SYSCFG_DIR)/$(PROJECT) -OPTS_PID_FILE ?= $(PIDDIR)/$(PROJECT).pid - -USE_VERSION_MACROS ?= true -ifeq ($(USE_VERSION_MACROS),true) - BUILD_CPPFLAGS += -DVERSION=$(HEX_VERSION) -DVERSION_STR=\"$(VERSION)\" +ifneq ($(findstring st-nucleo-f103rb,$(TAGGED_TMPL_TAGS)),) + TAGGED_TMPL_TAGS += cortex-m3 + MCU_BOARD_MODEL ?= ST-NUCLEO-F103RB + MCU_FLASH_OFFSET ?= 0x0000000 + MCU_FLASH_SIZE ?= 0x5000 + MODM_BSPS += modm:nucleo-f103rb endif ifneq ($(findstring cortex-m3,$(TAGGED_TMPL_TAGS)),) - - # -- set jw-build mcu choices - MCU_CPU ?= cortex-m3 - - # -- set flags - - # don't wrap error message lines - #PROJECT_LDFLAGS += -fmessage-length=0 - - # don't know what kind of optimization that is - #PROJECT_LDFLAGS += -Og - - # stick with what janware code tends to expect - PROJECT_LDFLAGS += -fsigned-char - - # I have no clue which part would evaluate these names - PROJECT_LDFLAGS += -ffunction-sections - PROJECT_LDFLAGS += -fdata-sections - PROJECT_LDFLAGS += -ffreestanding - PROJECT_LDFLAGS += -fno-move-loop-invariants - - # skip any automatic initialization - PROJECT_LDFLAGS += -nostartfiles - - # garbage collect unused input sections - PROJECT_LDFLAGS += -Xlinker --gc-sections - - # create map file - PROJECT_LDFLAGS += -Wl,-Map,"$(EXE_MAP)" - - # use newlib-nano, provides symbols _write _close _fstat _isatty _lseek (at least) - # (TODO: No -Wl necessary?) - PROJECT_LDFLAGS += --specs=nano.specs - PROJECT_LDFLAGS += --specs=nosys.specs - + TAGGED_TMPL_TAGS += cortex-m endif -ifneq ($(findstring gnu-mcu-eclipse,$(TAGGED_TMPL_TAGS)),) - LD_DEFINE_SYMBOLS += _sbrk +ifneq ($(findstring cortex-m,$(TAGGED_TMPL_TAGS)),) + TAGGED_TMPL_TAGS += cortex endif -# ----- build options based on product choices - -ifneq ($(findstring $(MCU_CPU),cortex-m3),) - - PROJECT_CPPFLAGS += -mcpu=cortex-m3 -mthumb - PROJECT_LDFLAGS += -mcpu=cortex-m3 -mthumb - +ifneq ($(findstring cortex-m3,$(TAGGED_TMPL_TAGS)),) + TARGET_CPU = cortex-m3 endif -# ----- tagged templates -#MCU_LD_DIR = $(wildcard $(firstword $(call $(TAGGED_TMPL_DIRS),ld))) -#MCU_LD_DIR = $(firstword $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(wildcard $(repo)/$(tag)/ld)))) -#MCU_LD_DIR = $(firstword $(wildcard $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(repo)/$(tag)/ld)))) -MCU_LD_CHECK_DIRS = $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(repo)/$(tag)/ld)) -MCU_LD_DIRS = $(wildcard $(MCU_LD_CHECK_DIRS)) -MCU_LD_DIR = $(firstword $(MCU_LD_DIRS)) - -PROJECT_LDFLAGS += -L$(MCU_LD_DIR) $(addprefix -T ,$(sort $(notdir $(wildcard $(MCU_LD_DIR)/*.ld)))) # ----- tool chain ifneq ($(TARGET_TRIPLET),$(HOST_TRIPLET)) # we're cross-compiling @@ -175,12 +81,161 @@ else # we're not cross-compiling endif +ifeq ($(COMPILER_SUITE),gcc) + + GCC ?= $(TC_BIN_PREFIX)gcc + GXX ?= $(TC_BIN_PREFIX)g++ + CXX ?= $(GXX) + GNU_LD ?= $(TC_BIN_PREFIX)ld + CLANG ?= $(TC_BIN_PREFIX)clang + CLANGPP ?= $(TC_BIN_PREFIX)clang++ + STRIP ?= $(TC_BIN_PREFIX)strip + RANLIB ?= $(TC_BIN_PREFIX)ranlib + AR ?= $(TC_BIN_PREFIX)ar + PKG_CONFIG_EXE ?= $(TC_BIN_PREFIX)pkg-config + CPP_FILT ?= $(TC_BIN_PREFIX)c++filt + OBJCOPY ?= $(TC_BIN_PREFIX)objcopy + OBJDUMP ?= $(TC_BIN_PREFIX)objdump + + # compiler and linker + # gcc + GCC_VERSION := $(shell $(GCC) -v 2>&1 | $(SED) '/gcc.version/I !d; s/.*version *//I; s/ \+.*//') + GCC_VERSION_NUMBERS := $(subst ., ,$(GCC_VERSION)) + GCC_MAJOR := $(word 1,$(GCC_VERSION_NUMBERS)) + GCC_MINOR := $(word 2,$(GCC_VERSION_NUMBERS)) + GCC_REV := $(word 3,$(GCC_VERSION_NUMBERS)) + + # Not needed anywhere + #GNU_LD_VERSION := $(shell $(LD) -V | $(SED) '/GNU ld/ !d; s/(.*)//; s/[^0-9.-]*//') + #GNU_LD_VERSION_NUMBERS := $(subst ., ,$(GNU_LD_VERSION)) + #GNU_LD_MAJOR := $(word 1,$(GNU_LD_VERSION_NUMBERS)) + #GNU_LD_MINOR := $(word 2,$(GNU_LD_VERSION_NUMBERS)) + #GNU_LD_REV := $(word 3,$(GNU_LD_VERSION_NUMBERS)) + + CC = $(GCC) + CXX = $(GXX) + LD = $(GXX) + + BUILD_CXXFLAGS += -std=c++$(CPP_STANDARD_VERSION) + BUILD_CFLAGS += -std=gnu$(C_STANDARD_VERSION) + + ifeq ($(shell $(TEST) $(GCC_MAJOR) -ge 5; $(ECHO) $$?),0) + ifeq ($(USE_CPP_FORCE_OVERRIDE),true) + GCC_CXXFLAGS += -Werror=suggest-override + endif + endif + +else ifeq ($(COMPILER_SUITE),clang) + + # clang + CLANG_CXXFLAGS += -Wno-unused-private-field -Wno-self-assign-field -Wno-overloaded-virtual + CC = $(CLANG) + CXX = $(CLANGPP) + LD = $(CLANGPP) + + ifeq ($(USE_CPP_WARN_INCONSISTENT_OVERRIDE),true) + CLANG_CXXFLAGS += -Winconsistent-missing-override + endif + +endif # COMPILER_SUITE + +# -- gather compiler options in BUILD_XXXFLAGS + +BUILD_CFLAGS += $(CFLAGS) +BUILD_CXXFLAGS += $(CXXFLAGS) +BUILD_CPPFLAGS += $(CPPFLAGS) +BUILD_LDFLAGS += $(LDFLAGS) + +BUILD_CPPFLAGS += -D_FILE_OFFSET_BITS=64 -Wall -Wno-unused-value -Wno-deprecated -DPROJECT_STR=\"$(PROJECT)\" +BUILD_LDFLAGS += -Wall + +ifeq ($(TARGET_ARCH),$(ARCH_32)) + PROJECT_CPPFLAGS += -m32 + PROJECT_LDFLAGS += -m32 +endif + ifeq ($(TARGET_ARCH),x86_64) BUILD_CPPFLAGS += -fPIC LIBFLAGS += endif +ifeq ($(TARGET_ARCH),armv7hl) + PROJECT_CPPFLAGS += -fPIC +else ifeq ($(TARGET_ARCH),aarch64) + PROJECT_CPPFLAGS += -fPIC +endif + ifeq ($(TARGET_TRIPLET),arm-none-eabi) + LIBTYPE ?= static +else + LIBTYPE ?= shared +endif + +ifeq ($(COMPILER_SUITE),gcc) + DEBUGGER ?= gdb + BUILD_EXTRA_DEBUG_FLAGS += -ggdb +endif + +ifeq ($(COMPILER_SUITE),clang) + DEBUGGER = lldb +endif + +ifeq ($(DEVELOPMENT),true) + export G_SLICE = always-malloc + export G_DEBUG = gc-friendly,resident-modules + export MALLOC_CHECK_ = 2 +endif + +ifneq ($(LOG_QUAL_PREFIX),) + PROJECT_CPPFLAGS += -DKEEP_FILES_OPEN -DLOG_QUAL_PREFIX=\"$(LOG_QUAL_PREFIX)\" +endif + +ifeq ($(CATCH_ONLY_YERROR),true) + BUILD_CPPFLAGS += -DCATCH_ONLY_YERROR +endif + +ifeq ($(USE_VERSION_MACROS),true) + BUILD_CPPFLAGS += -DVERSION=$(HEX_VERSION) -DVERSION_STR=\"$(VERSION)\" +endif + +ifeq ($(TARGET_TRIPLET),arm-none-eabi) + + ifneq ($(findstring $(TARGET_CPU),cortex-m3),) + + PROJECT_CPPFLAGS += -mcpu=cortex-m3 -mthumb + PROJECT_LDFLAGS += -mcpu=cortex-m3 -mthumb + + # don't wrap error message lines + #PROJECT_LDFLAGS += -fmessage-length=0 + + # don't know what kind of optimization that is + #PROJECT_LDFLAGS += -Og + + # stick with what janware code tends to expect + PROJECT_LDFLAGS += -fsigned-char + + # I have no clue which part would evaluate these names + PROJECT_LDFLAGS += -ffunction-sections + PROJECT_LDFLAGS += -fdata-sections + PROJECT_LDFLAGS += -ffreestanding + PROJECT_LDFLAGS += -fno-move-loop-invariants + + # skip any automatic initialization + PROJECT_LDFLAGS += -nostartfiles + + # garbage collect unused input sections + PROJECT_LDFLAGS += -Xlinker --gc-sections + + # create map file + PROJECT_LDFLAGS += -Wl,-Map,"$(EXE_MAP)" + + # use newlib-nano, provides symbols _write _close _fstat _isatty _lseek (at least) + # (TODO: No -Wl necessary?) + PROJECT_LDFLAGS += --specs=nano.specs + PROJECT_LDFLAGS += --specs=nosys.specs + + endif + USE_DISABLE_COMPILER_OPTIMISATION_OPTS = false USE_EXCEPTIONS_IN_C = false ARM_NONE_EABI_ALLFLAGS += -fno-exceptions @@ -251,66 +306,23 @@ ifeq ($(TARGET_TRIPLET),arm-none-eabi) #BUILD_CPPFLAGS += -fno-exceptions #BUILD_CXXFLAGS += -fno-rtti + + ifneq ($(findstring gnu-mcu-eclipse,$(TAGGED_TMPL_TAGS)),) + LD_DEFINE_SYMBOLS += _sbrk + endif + + # ----- tagged templates + #MCU_LD_DIR = $(wildcard $(firstword $(call $(TAGGED_TMPL_DIRS),ld))) + #MCU_LD_DIR = $(firstword $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(wildcard $(repo)/$(tag)/ld)))) + #MCU_LD_DIR = $(firstword $(wildcard $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(repo)/$(tag)/ld)))) + MCU_LD_CHECK_DIRS = $(foreach tag,$(TAGGED_TMPL_TAGS),$(foreach repo,$(TOPDIR)/tmpl/tagged $(MODDIR)/tmpl/tagged,$(repo)/$(tag)/ld)) + MCU_LD_DIRS = $(wildcard $(MCU_LD_CHECK_DIRS)) + MCU_LD_DIR = $(firstword $(MCU_LD_DIRS)) + + PROJECT_LDFLAGS += -L$(MCU_LD_DIR) $(addprefix -T ,$(sort $(notdir $(wildcard $(MCU_LD_DIR)/*.ld)))) + endif -ifeq ($(COMPILER_SUITE),gcc) - - GCC ?= $(TC_BIN_PREFIX)gcc - GXX ?= $(TC_BIN_PREFIX)g++ - CXX ?= $(GXX) - GNU_LD ?= $(TC_BIN_PREFIX)ld - CLANG ?= $(TC_BIN_PREFIX)clang - CLANGPP ?= $(TC_BIN_PREFIX)clang++ - STRIP ?= $(TC_BIN_PREFIX)strip - RANLIB ?= $(TC_BIN_PREFIX)ranlib - AR ?= $(TC_BIN_PREFIX)ar - PKG_CONFIG_EXE ?= $(TC_BIN_PREFIX)pkg-config - CPP_FILT ?= $(TC_BIN_PREFIX)c++filt - OBJCOPY ?= $(TC_BIN_PREFIX)objcopy - OBJDUMP ?= $(TC_BIN_PREFIX)objdump - - # compiler and linker - # gcc - GCC_VERSION := $(shell $(GCC) -v 2>&1 | $(SED) '/gcc.version/I !d; s/.*version *//I; s/ \+.*//') - GCC_VERSION_NUMBERS := $(subst ., ,$(GCC_VERSION)) - GCC_MAJOR := $(word 1,$(GCC_VERSION_NUMBERS)) - GCC_MINOR := $(word 2,$(GCC_VERSION_NUMBERS)) - GCC_REV := $(word 3,$(GCC_VERSION_NUMBERS)) - - # Not needed anywhere - #GNU_LD_VERSION := $(shell $(LD) -V | $(SED) '/GNU ld/ !d; s/(.*)//; s/[^0-9.-]*//') - #GNU_LD_VERSION_NUMBERS := $(subst ., ,$(GNU_LD_VERSION)) - #GNU_LD_MAJOR := $(word 1,$(GNU_LD_VERSION_NUMBERS)) - #GNU_LD_MINOR := $(word 2,$(GNU_LD_VERSION_NUMBERS)) - #GNU_LD_REV := $(word 3,$(GNU_LD_VERSION_NUMBERS)) - - CC = $(GCC) - CXX = $(GXX) - LD = $(GXX) - - BUILD_CXXFLAGS += -std=c++$(CPP_STANDARD_VERSION) - BUILD_CFLAGS += -std=gnu$(C_STANDARD_VERSION) - - ifeq ($(shell $(TEST) $(GCC_MAJOR) -ge 5; $(ECHO) $$?),0) - ifeq ($(USE_CPP_FORCE_OVERRIDE),true) - GCC_CXXFLAGS += -Werror=suggest-override - endif - endif - -else ifeq ($(COMPILER_SUITE),clang) - - # clang - CLANG_CXXFLAGS += -Wno-unused-private-field -Wno-self-assign-field -Wno-overloaded-virtual - CC = $(CLANG) - CXX = $(CLANGPP) - LD = $(CLANGPP) - - ifeq ($(USE_CPP_WARN_INCONSISTENT_OVERRIDE),true) - CLANG_CXXFLAGS += -Winconsistent-missing-override - endif - -endif # COMPILER_SUITE - PROJECT_LDFLAGS += $(addprefix -u ,$(LD_DEFINE_SYMBOLS)) # -- target files and dirs @@ -701,3 +713,5 @@ INSTALLED_ALL_LIBS = $(addprefix $(INSTALL_LIBDIR)/,$(wildcard *.a)) INSTALLED_LIB += $(INSTALLED_LIB_SO) $(INSTALLED_SHOBJS) \ $(INSTALLED_LINKS_SO) $(sort $(INSTALLED_LIB_A) $(INSTALLED_ALL_LIBS)) \ $(INSTALLED_DEF) + +endif # ifndef JW_BUILD_CPP_DEFS_MK_INCLUDED diff --git a/make/defs.mk b/make/defs.mk index ae255a71..cc4ad24a 100644 --- a/make/defs.mk +++ b/make/defs.mk @@ -246,8 +246,6 @@ endif REV_SUBDIRS = $(call reverse $(SUBDIRS)) FRESH_CVSDIR = $(HOME)/local/src/cvs.fresh -IMAGE_DIR ?= $(CVS_ROOT_DIR)/images -PCKG_DEPS_DIR = $(MODDIR)/make/deps.d PCKG_DEFS_DIR = $(MODDIR)/make/defs.d HDRDIR_SCOPE_SUFFIX ?= $(PROJECT) @@ -268,11 +266,14 @@ endif IMAGES += $(wildcard *.png *.jpg *.bmp *.gif *.ico *.svg) FONTS += $(wildcard *.woff *.svg) +OPTS_PID_FILE ?= $(PIDDIR)/$(PROJECT).pid LOCAL_MKFILES ?= $(wildcard GNUmakefile makefile Makefile *.mk) +LOG_QUAL_PREFIX ?= $(LOGID): # -- standard dirs and files for build and install - # -- CFG +SYSCFG_DIR ?= /etc/sysconfig +SYSCFG_FILE ?= $(SYSCFG_DIR)/$(PROJECT) INSTALLATION_FILE_TYPES += CFG CONFIG_FILE ?= $(CONFIG_DIR)/$(PROJECT).conf SYSCFG_FILE ?= $(SYSCFG_DIR)/$(PROJECT) diff --git a/make/platform.mk b/make/platform.mk index 01aedde5..b95b4908 100644 --- a/make/platform.mk +++ b/make/platform.mk @@ -169,4 +169,5 @@ ifneq ($(TARGET_TRIPLET),$(HOST_TRIPLET)) endif endif +TARGET_CPU ?= $(TARGET_ARCH) endif # ifndef PLATFORM_MK_INCLUDED