1*6897da5cSDirk Helbig# 2*6897da5cSDirk Helbig# Copyright 2022 Google LLC 3*6897da5cSDirk Helbig# 4*6897da5cSDirk Helbig# Licensed under the Apache License, Version 2.0 (the "License"); 5*6897da5cSDirk Helbig# you may not use this file except in compliance with the License. 6*6897da5cSDirk Helbig# You may obtain a copy of the License at: 7*6897da5cSDirk Helbig# 8*6897da5cSDirk Helbig# http://www.apache.org/licenses/LICENSE-2.0 9*6897da5cSDirk Helbig# 10*6897da5cSDirk Helbig# Unless required by applicable law or agreed to in writing, software 11*6897da5cSDirk Helbig# distributed under the License is distributed on an "AS IS" BASIS, 12*6897da5cSDirk Helbig# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*6897da5cSDirk Helbig# See the License for the specific language governing permissions and 14*6897da5cSDirk Helbig# limitations under the License. 15*6897da5cSDirk Helbig# 16*6897da5cSDirk Helbig 17*6897da5cSDirk HelbigV ?= @ 18*6897da5cSDirk Helbig 19*6897da5cSDirk HelbigBUILD_DIR := build 20*6897da5cSDirk HelbigBIN_DIR := bin 21*6897da5cSDirk Helbig 22*6897da5cSDirk Helbig 23*6897da5cSDirk Helbig# 24*6897da5cSDirk Helbig# Set `gcc` as default compiler 25*6897da5cSDirk Helbig# 26*6897da5cSDirk Helbig 27*6897da5cSDirk HelbigCC := $(if $(CC)=cc,gcc,$(CC)) 28*6897da5cSDirk HelbigAS := $(if $(AS)=as,$(CC),$(AS)) 29*6897da5cSDirk HelbigLD := $(if $(LD)=ld,$(CC),$(LD)) 30*6897da5cSDirk Helbig 31*6897da5cSDirk HelbigCFLAGS := $(if $(DEBUG),-O0 -g,-O3) 32*6897da5cSDirk HelbigLDFLAGS := $(if $(DEBUG),-O0 -g,-O3) 33*6897da5cSDirk Helbig 34*6897da5cSDirk HelbigCFLAGS += -std=c11 -Wall -Wextra -Wdouble-promotion -Wvla -pedantic 35*6897da5cSDirk Helbig 36*6897da5cSDirk HelbigTARGET = $(lastword $(shell $(CC) -v 2>&1 | grep "Target: ")) 37*6897da5cSDirk Helbig 38*6897da5cSDirk HelbigLIB_SHARED := true 39*6897da5cSDirk HelbigLIB_SUFFIX := so 40*6897da5cSDirk Helbig 41*6897da5cSDirk Helbigifeq ($(TARGET),wasm32) 42*6897da5cSDirk Helbig LIB_SHARED := false 43*6897da5cSDirk Helbig LIB_SUFFIX := wasm 44*6897da5cSDirk Helbig CFLAGS += -Iwasm -mbulk-memory 45*6897da5cSDirk Helbig LDFLAGS += -nostdlib -Wl,--no-entry -Wl,--export-dynamic 46*6897da5cSDirk Helbigendif 47*6897da5cSDirk Helbig 48*6897da5cSDirk Helbigifneq ($(LC3_PLUS),) 49*6897da5cSDirk Helbig DEFINE += LC3_PLUS=$(LC3_PLUS) 50*6897da5cSDirk Helbigendif 51*6897da5cSDirk Helbig 52*6897da5cSDirk Helbigifneq ($(LC3_PLUS_HR),) 53*6897da5cSDirk Helbig DEFINE += LC3_PLUS_HR=$(LC3_PLUS_HR) 54*6897da5cSDirk Helbigendif 55*6897da5cSDirk Helbig 56*6897da5cSDirk Helbig 57*6897da5cSDirk Helbig# 58*6897da5cSDirk Helbig# Declarations 59*6897da5cSDirk Helbig# 60*6897da5cSDirk Helbig 61*6897da5cSDirk Helbiglib_list := 62*6897da5cSDirk Helbigbin_list := 63*6897da5cSDirk Helbig 64*6897da5cSDirk Helbigdefine add-lib 65*6897da5cSDirk Helbig $(eval $(1)_bin ?= $(1).$(LIB_SUFFIX)) 66*6897da5cSDirk Helbig $(eval $(1)_bin := $(addprefix $(BIN_DIR)/,$($(1)_bin))) 67*6897da5cSDirk Helbig 68*6897da5cSDirk Helbig lib_list += $(1) 69*6897da5cSDirk Helbig LIB += $($(1)_bin) 70*6897da5cSDirk Helbigendef 71*6897da5cSDirk Helbig 72*6897da5cSDirk Helbigdefine add-bin 73*6897da5cSDirk Helbig $(eval $(1)_bin ?= $(1)) 74*6897da5cSDirk Helbig $(eval $(1)_bin := $(addprefix $(BIN_DIR)/,$($(1)_bin))) 75*6897da5cSDirk Helbig 76*6897da5cSDirk Helbig $($(1)_bin): LDLIBS += $(if $(filter $(LIBC),bionic),\ 77*6897da5cSDirk Helbig $(filter-out rt pthread,$($(1)_ldlibs)),$($(1)_ldlibs)) 78*6897da5cSDirk Helbig $($(1)_bin): LDFLAGS += $($(1)_ldflags) 79*6897da5cSDirk Helbig 80*6897da5cSDirk Helbig bin_list += $(1) 81*6897da5cSDirk Helbig BIN += $($(1)_bin) 82*6897da5cSDirk Helbigendef 83*6897da5cSDirk Helbig 84*6897da5cSDirk Helbigdefine set-target 85*6897da5cSDirk Helbig $(eval $(1)_obj ?= $(patsubst %.c,%.o,$(filter %.c,$($(1)_src))) \ 86*6897da5cSDirk Helbig $(patsubst %.s,%.o,$(filter %.s,$($(1)_src))) \ 87*6897da5cSDirk Helbig $(patsubst %.cc,%.o,$(filter %.cc,$($(1)_src)))) 88*6897da5cSDirk Helbig $(eval $(1)_obj := $(addprefix $(BUILD_DIR)/,$($(1)_obj))) 89*6897da5cSDirk Helbig 90*6897da5cSDirk Helbig $($(1)_obj): INCLUDE += $($(1)_include) 91*6897da5cSDirk Helbig $($(1)_obj): DEFINE += $($(1)_define) 92*6897da5cSDirk Helbig $($(1)_obj): CFLAGS += $($(1)_cflags) 93*6897da5cSDirk Helbig $($(1)_obj): CXXFLAGS += $($(1)_cxxflags) 94*6897da5cSDirk Helbig 95*6897da5cSDirk Helbig -include $($(1)_obj:.o=.d) 96*6897da5cSDirk Helbig 97*6897da5cSDirk Helbig $($(1)_bin): $($(1)_obj) 98*6897da5cSDirk Helbig $($(1)_bin): $($(1)_dependencies) 99*6897da5cSDirk Helbig 100*6897da5cSDirk Helbig .PHONY: $(1) 101*6897da5cSDirk Helbig $(1): $($(1)_bin) 102*6897da5cSDirk Helbigendef 103*6897da5cSDirk Helbig 104*6897da5cSDirk Helbig.PHONY: default 105*6897da5cSDirk Helbigdefault: 106*6897da5cSDirk Helbig 107*6897da5cSDirk Helbig 108*6897da5cSDirk HelbigINCLUDE += include 109*6897da5cSDirk Helbig 110*6897da5cSDirk HelbigSRC_DIR = src 111*6897da5cSDirk Helbiginclude $(SRC_DIR)/makefile.mk 112*6897da5cSDirk Helbig 113*6897da5cSDirk HelbigTOOLS_DIR = tools 114*6897da5cSDirk Helbig-include $(TOOLS_DIR)/makefile.mk 115*6897da5cSDirk Helbig 116*6897da5cSDirk HelbigTEST_DIR := test 117*6897da5cSDirk Helbig-include $(TEST_DIR)/makefile.mk 118*6897da5cSDirk Helbig 119*6897da5cSDirk HelbigFUZZ_DIR := fuzz 120*6897da5cSDirk Helbig-include $(FUZZ_DIR)/makefile.mk 121*6897da5cSDirk Helbig 122*6897da5cSDirk Helbig 123*6897da5cSDirk Helbig# 124*6897da5cSDirk Helbig# Rules 125*6897da5cSDirk Helbig# 126*6897da5cSDirk Helbig 127*6897da5cSDirk HelbigMAKEFILE_DEPS := $(MAKEFILE_LIST) 128*6897da5cSDirk Helbig 129*6897da5cSDirk Helbig$(foreach lib, $(lib_list), $(eval $(call set-target,$(lib)))) 130*6897da5cSDirk Helbig$(foreach bin, $(bin_list), $(eval $(call set-target,$(bin)))) 131*6897da5cSDirk Helbig 132*6897da5cSDirk Helbig$(BUILD_DIR)/%.o: %.c $(MAKEFILE_DEPS) 133*6897da5cSDirk Helbig @echo " CC $(notdir $<)" 134*6897da5cSDirk Helbig $(V)mkdir -p $(dir $@) 135*6897da5cSDirk Helbig $(V)$(CC) $< -c $(CFLAGS) \ 136*6897da5cSDirk Helbig $(addprefix -I,$(INCLUDE)) \ 137*6897da5cSDirk Helbig $(addprefix -D,$(DEFINE)) -MMD -MF $(@:.o=.d) -o $@ 138*6897da5cSDirk Helbig 139*6897da5cSDirk Helbig$(BUILD_DIR)/%.o: %.s $(MAKEFILE_DEPS) 140*6897da5cSDirk Helbig @echo " AS $(notdir $<)" 141*6897da5cSDirk Helbig $(V)mkdir -p $(dir $@) 142*6897da5cSDirk Helbig $(V)$(AS) $< -c $(CFLAGS) \ 143*6897da5cSDirk Helbig $(addprefix -I,$(INCLUDE)) \ 144*6897da5cSDirk Helbig $(addprefix -D,$(DEFINE)) -MMD -MF $(@:.o=.d) -o $@ 145*6897da5cSDirk Helbig 146*6897da5cSDirk Helbig$(BUILD_DIR)/%.o: %.cc $(MAKEFILE_DEPS) 147*6897da5cSDirk Helbig @echo " CXX $(notdir $<)" 148*6897da5cSDirk Helbig $(V)mkdir -p $(dir $@) 149*6897da5cSDirk Helbig $(V)$(CXX) $< -c $(CXXFLAGS) \ 150*6897da5cSDirk Helbig $(addprefix -I,$(INCLUDE)) \ 151*6897da5cSDirk Helbig $(addprefix -D,$(DEFINE)) -MMD -MF $(@:.o=.d) -o $@ 152*6897da5cSDirk Helbig 153*6897da5cSDirk Helbigifeq ($(LIB_SHARED),true) 154*6897da5cSDirk Helbig $(LIB): CFLAGS += -fvisibility=hidden -flto -fPIC 155*6897da5cSDirk Helbig $(LIB): LDFLAGS += -flto -shared 156*6897da5cSDirk Helbigendif 157*6897da5cSDirk Helbig 158*6897da5cSDirk Helbig$(LIB): $(MAKEFILE_DEPS) 159*6897da5cSDirk Helbig @echo " LD $(notdir $@)" 160*6897da5cSDirk Helbig $(V)mkdir -p $(dir $@) 161*6897da5cSDirk Helbig $(V)$(LD) $(filter %.o,$^) $(LDFLAGS) -o $@ 162*6897da5cSDirk Helbig 163*6897da5cSDirk Helbig$(BIN): $(MAKEFILE_DEPS) 164*6897da5cSDirk Helbig @echo " LD $(notdir $@)" 165*6897da5cSDirk Helbig $(V)mkdir -p $(dir $@) 166*6897da5cSDirk Helbig $(V)$(LD) $(filter %.o,$^) \ 167*6897da5cSDirk Helbig $(LDFLAGS) -L $(BIN_DIR) $(addprefix -l,$(LDLIBS)) -o $@ 168*6897da5cSDirk Helbig 169*6897da5cSDirk Helbigclean: 170*6897da5cSDirk Helbig $(V)rm -rf $(BUILD_DIR) 171*6897da5cSDirk Helbig $(V)rm -rf $(BIN_DIR) 172*6897da5cSDirk Helbig 173*6897da5cSDirk Helbigclean-all: clean 174