xref: /btstack/3rd-party/lc3-google/Makefile (revision 6897da5c53aac5b1f90f41b5b15d0bd43d61dfff)
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