ud3tn/mk/toolchain.mk
Felix Walter 5309ea171f mk: Disable unsupported LD options on MacOS
This does not pass the `--gc-sections,--sort-common,--as-needed` and
`-Wl,-z,relro,-z,now,-z,noexecstack` linker flags when using the MacOS
linker. The OS detection is moved to `posix.mk`, which is included
earlier.

Fixes: #135
Signed-off-by: Felix Walter <felix.walter@d3tn.com>
2023-06-05 12:43:58 +02:00

173 lines
5 KiB
Makefile

# TOOLCHAIN
TOOLCHAIN ?= gcc
ifeq ($(TOOLCHAIN),clang)
CLANG ?= $(CLANG_PREFIX)clang
CC := $(CLANG)
CXX := $(CLANG)
LD := $(CLANG)
else
CC := $(GCC_TOOLCHAIN_PREFIX)gcc
CXX := $(GCC_TOOLCHAIN_PREFIX)g++
LD := $(GCC_TOOLCHAIN_PREFIX)gcc
endif
AS := $(GCC_TOOLCHAIN_PREFIX)gcc
AR := $(GCC_TOOLCHAIN_PREFIX)ar
RANLIB := $(GCC_TOOLCHAIN_PREFIX)ranlib
OBJCOPY := $(GCC_TOOLCHAIN_PREFIX)objdump
OBJCOPY := $(GCC_TOOLCHAIN_PREFIX)objcopy
# COMMON FLAGS
CPPFLAGS += $(ARCH_FLAGS) -MMD -Iinclude $(EXTERNAL_INCLUDES)
CFLAGS += -std=gnu99
CXXFLAGS += -fno-exceptions -fno-rtti
ASFLAGS += $(ARCH_FLAGS)
ifeq ($(EXPECT_MACOS_LINKER),1)
LDFLAGS_PRE_LIB += -Wl,-all_load
else
LDFLAGS_PRE += -Wl,--start-group
LDFLAGS += -Wl,--end-group
LDFLAGS_PRE_LIB += -Wl,--whole-archive
LDFLAGS_LIB += -Wl,--no-whole-archive
endif
LDFLAGS += $(ARCH_FLAGS) -lc -lm
ifeq ($(TOOLCHAIN),clang)
ifneq ($(CLANG_SYSROOT),)
CPPFLAGS += --sysroot $(CLANG_SYSROOT)
endif
endif
# COMMANDS
echo-cmd = $(if $($(quiet)cmd_$1),echo '$($(quiet)cmd_$1)';)
cmd = @$(call echo-cmd,$1,$2) $(cmd_$1)
quiet_cmd_cc_o_c = CC $@
cmd_cc_o_c = "$(CC)" -o "$@" $(CFLAGS) $(CPPFLAGS) -c "$<"
quiet_cmd_cc_o_cxx = CXX $@
cmd_cc_o_cxx = "$(CXX)" -o "$@" $(CXXFLAGS) $(CPPFLAGS) -c "$<"
quiet_cmd_cc_o_s = AS $@
cmd_cc_o_s = "$(AS)" -o "$@" $(ASFLAGS) -c "$<"
quiet_cmd_ar = AR $@
cmd_ar = "$(AR)" rcs "$@" $(OBJECTS)
quiet_cmd_arcat = AR_CAT $@
cmd_arcat = "$(AR)" rcT "$@" $(LIBS)
quiet_cmd_link = LINK $@
cmd_link = "$(LD)" -o "$@" \
$(LDFLAGS_PRE) \
$(OBJECTS) $(LIBS) \
$(LDFLAGS_EXECUTABLE) $(LDFLAGS)
quiet_cmd_linklib = LINK $@
cmd_linklib = "$(LD)" -o "$@" \
$(LDFLAGS_PRE) $(LDFLAGS_PRE_LIB) \
$(OBJECTS) $(LIBS) \
$(LDFLAGS_LIB) $(LDFLAGS)
quiet_cmd_mkdir = MKDIR $@
cmd_mkdir = mkdir -p "$@"
quiet_cmd_rm = RM $2
cmd_rm = rm -rf "$2"
quiet_cmd_bin = BIN $@
cmd_bin = "$(OBJCOPY)" -O binary "$<" "$@"
quiet_cmd_ihex = IHEX $@
cmd_ihex = "$(OBJCOPY)" -O ihex "$<" "$@"
quiet_cmd_ccmd_o_x = CCMD $@
cmd_ccmd_o_x = echo '{"command": "cc -o \"$(patsubst %.ccmd,%.o,$@)\" \
$(CFLAGS) $(CPPFLAGS) -c \"$<\"", "directory": "$(CURDIR)", \
"file": "$<"}' > "$@"
quiet_cmd_ccmds = CCMDS $@
cmd_ccmds = echo "[$$(sed -s -e '$$a,' $(CCMDS) | sed -e '$$d')]" > "$@"
# RULE GENERATION
define generateComponentRules
component_C_SOURCES := $(if $(2),$(patsubst %.c,$(1)/%.c,$(filter %.c,$(2))),$$(wildcard $(1)/*.c))
component_CXX_SOURCES := $(if $(2),$(patsubst %.cpp,$(1)/%.cpp,$(filter %.cpp,$(2))),$$(wildcard $(1)/*.cpp))
component_ASM_SOURCES := $(if $(2),$(patsubst %.s,$(1)/%.s,$(filter %.s,$(2))),$$(wildcard $(1)/*.s))
component_OBJECTS := $$(patsubst $(1)/%.c,build/$(PLATFORM)/$(1)/%.o,$$(component_C_SOURCES)) \
$$(patsubst $(1)/%.cpp,build/$(PLATFORM)/$(1)/%.o,$$(component_CXX_SOURCES)) \
$$(patsubst $(1)/%.s,build/$(PLATFORM)/$(1)/%.o,$$(component_ASM_SOURCES)) \
component_DEPS := $$(patsubst $(1)/%.c,build/$(PLATFORM)/$(1)/%.d,$$(component_C_SOURCES)) \
$$(patsubst $(1)/%.cpp,build/$(PLATFORM)/$(1)/%.d,$$(component_CXX_SOURCES))
-include $$(component_DEPS)
build/$(PLATFORM)/$(1)/%.o: $(1)/%.c | build/$(PLATFORM)/$(1)
$$(call cmd,cc_o_c)
build/$(PLATFORM)/$(1)/%.o: $(1)/%.cpp | build/$(PLATFORM)/$(1)
$$(call cmd,cc_o_cxx)
build/$(PLATFORM)/$(1)/%.o: $(1)/%.s | build/$(PLATFORM)/$(1)
$$(call cmd,cc_o_s)
build/$(PLATFORM)/$(1)/component.a: OBJECTS := $$(component_OBJECTS)
build/$(PLATFORM)/$(1)/component.a: $$(component_OBJECTS)
build/$(PLATFORM)/$(1)/component.a: | build/$(PLATFORM)/$(1)
$$(call cmd,ar)
build/$(PLATFORM)/$(1): | build/$(PLATFORM)
$$(call cmd,mkdir)
# Clang compile_commands.json
component_CCMDS := $$(patsubst %.o,%.ccmd,$$(component_OBJECTS))
build/$(PLATFORM)/$(1)/%.ccmd: $(1)/%.c | build/$(PLATFORM)/$(1)
$$(call cmd,ccmd_o_x)
build/$(PLATFORM)/$(1)/%.ccmd: $(1)/%.cpp | build/$(PLATFORM)/$(1)
$$(call cmd,ccmd_o_x)
build/$(PLATFORM)/$(1)/%.ccmd: $(1)/%.s | build/$(PLATFORM)/$(1)
$$(call cmd,ccmd_o_x)
build/$(PLATFORM)/compile_commands.json: CCMDS := $$(component_CCMDS)
build/$(PLATFORM)/compile_commands.json: $$(component_CCMDS)
build/$(PLATFORM)/compile_commands.json: | build/$(PLATFORM)
endef
define addComponent
LIBS_$(1) += build/$(PLATFORM)/$(2)/component.a
build/$(PLATFORM)/$(1): build/$(PLATFORM)/$(2)/component.a
build/$(PLATFORM)/$(1): | build/$(PLATFORM)
endef
define addComponentWithRules
$(call generateComponentRules,$(1),$(2))
$(call addComponent,libud3tn.so,$(1))
$(call addComponent,ud3tn,$(1))
$(call addComponent,testud3tn,$(1))
endef
build/$(PLATFORM)/compile_commands.json:
build/$(PLATFORM)/compile_commands.json: | build/$(PLATFORM)
$(call cmd,ccmds)