forked from Qorvo/QMatter
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgpcommon.mk
430 lines (359 loc) · 14.4 KB
/
gpcommon.mk
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
###### Definitions #######
PREREQ_HEADER_GENERATION_TARGETS ?=
COMMA=,
SPACE=$(EMPTY) $(EMPTY)
list2lines = $(subst $(SPACE),\n,$(1))
RM =rm -rf
MKDIR =mkdir -p
MV =mv
#Quick Non-Linux shell check
ifeq (,$(PWD))
OS_USED?=WIN
ECHO =echo -e
Color_Off=\e[0m
# Bold
BBlack=\e[1;30m
BRed=\e[1;31m
BGreen=\e[1;32m
BYellow=\e[1;33m
BBlue=\e[1;34m
BPurple=\e[1;35m
BCyan=\e[1;36m
BWhite=\e[1;37m
else
OS_USED?=LINUX
ECHO =echo
Color_Off=
# Bold
BBlack=
BRed=
BGreen=
BYellow=
BBlue=
BPurple=
BCyan=
BWhite=
endif
###### Function to convert Linux-style paths to Windows-style #####
# Roots
LINUX_WSL_ROOT := /home/
WINDOWS_WSL_ROOT := wsl$$/Ubuntu-18.04/home/
LINUX_C_ROOT := /mnt/c/
WINDOWS_C_ROOT := C:/
LINUX_D_ROOT := /mnt/d/
WINDOWS_D_ROOT := D:/
LINUX_E_ROOT := /mnt/e/
WINDOWS_E_ROOT := E:/
LINUX_R_ROOT := /mnt/r/
WINDOWS_R_ROOT := R:/
LINUX_Q_ROOT := /mnt/q/
WINDOWS_Q_ROOT := Q:/
# GPHUB_ROOT will be set by m.py normally, but need to strip trailing slashes as IAR cannot handle double slashes in paths
GPHUB_ROOT ?= $(ROOTDIR)/gpHub
override GPHUB_ROOT := $(patsubst %\,%,$(GPHUB_ROOT))
override GPHUB_ROOT := $(patsubst %/,%,$(GPHUB_ROOT))
# Replace windows roots "function"
replace_win_roots = $(patsubst $(LINUX_Q_ROOT)%,$(WINDOWS_Q_ROOT)%,$(patsubst $(LINUX_R_ROOT)%,$(WINDOWS_R_ROOT)%,$(patsubst $(LINUX_C_ROOT)%,$(WINDOWS_C_ROOT)%,$(patsubst $(LINUX_D_ROOT)%,$(WINDOWS_D_ROOT)%,$(patsubst $(LINUX_E_ROOT)%,$(WINDOWS_E_ROOT)%,$(1))))))
replace_win_roots_includes = $(patsubst -I$(LINUX_Q_ROOT)%,-I$(WINDOWS_Q_ROOT)%,$(patsubst -I$(LINUX_R_ROOT)%,-I$(WINDOWS_R_ROOT)%,$(patsubst -I$(LINUX_C_ROOT)%,-I$(WINDOWS_C_ROOT)%,$(patsubst -I$(LINUX_D_ROOT)%,-I$(WINDOWS_D_ROOT)%,$(patsubst -I$(LINUX_E_ROOT)%,-I$(WINDOWS_E_ROOT)%,$(1))))))
###### Speed optimizations #######
#Disable Parallel build with PAR=
PAR?=j4
ifeq (s,$(findstring s, $(MAKEFLAGS)))
MAKEFLAGS=sr$(PAR)
else
MAKEFLAGS=r$(PAR)
endif
###### Build rules ######
# Deleting the default suffixes
# Slight casing variations on Windows could give compilation using default rules iso our own
.SUFFIXES:
#Rules only active if a configuration was included
ifneq (,$(CURRENT_CONF))
# Used flags by compiler:
CFLAGS_COMPILER ?=
ASFLAGS_COMPILER ?=
LDFLAGS_COMPILER ?=
LIBFLAGS_COMPILER?=
##### Compiler-specific definitions #######
NR_OF_PROCESSORS=$(shell nproc)
ifeq ($(shell test $(NR_OF_PROCESSORS) -le 4; echo $$?),0)
# For regression machines, use all cores
NR_OF_PROCESSORS_FOR_COMPILATION?=$(NR_OF_PROCESSORS)
else
# For local machines, free up one core
NR_OF_PROCESSORS_FOR_COMPILATION?=$$(( $(NR_OF_PROCESSORS) - 1 ))
endif
COMPILER_DEFINES?=$(ENV_PATH)/make/compilers/$(COMPILER)/compiler_defines.mk
-include $(COMPILER_DEFINES)
# Define all object files.
ALL_SOURCES := $(SRC) $(ASRC)
# Change wanted output directory to workdirectory
ALL_SOURCES := $(subst $(GPHUB_ROOT),$(WORKDIR),$(subst $(ROOTDIR),$(WORKDIR),$(subst \,/, $(ALL_SOURCES))))
# Available file extensions that lead to objects
OBJS:= $(ALL_SOURCES)
OBJS:= $(OBJS:.cpp=.o)
OBJS:= $(OBJS:.c=.o)
OBJS:= $(OBJS:.S=.o)
OBJS:= $(OBJS:.s=.o)
# Define all listing files.
LSTS:= $(OBJS:.o=.lst)
# Define all dependency files.
DEPS:= $(OBJS:.o=.d)
# Define all library files
LIB := $(subst \,/, $(LIB))
LIB_DEP := $(filter %.$(LIB_EXT), $(LIB))
OBJ_DIRS:= $(foreach file,$(OBJS),$(dir $(file)))
EXPORT_OBJ_DIRS:= $(foreach file,$(subst $(GPHUB_ROOT),$(WORKDIR),$(subst $(ROOTDIR),$(WORKDIR),$(subst \,/, $(patsubst %, %.o, $(basename $(foreach comp,$(EXPORT_LIBCOMPS),$(SRC_$(comp)) $(ASRC_$(comp)))))))),$(dir $(file)))
LST_DIRS:= $(foreach file,$(LSTS),$(dir $(file)))
DEP_DIRS:= $(foreach file,$(DEPS),$(dir $(file)))
TARGET_DIRS:= $(sort $(OBJ_DIRS) $(EXPORT_OBJ_DIRS) $(LST_DIRS) $(DEP_DIRS) $(dir $(APPFILE))) # sort removes duplicates :-)
#Adjust paths
SRC_NOWARNING := $(subst \,/,$(SRC_NOWARNING))
SRC_DISABLE_ALIGNMENT_WARNING := $(subst \,/,$(SRC_DISABLE_ALIGNMENT_WARNING))
SRC_DISABLE_STRICT_ALIASING_WARNING := $(subst \,/,$(SRC_DISABLE_STRICT_ALIASING_WARNING))
SRC_DISABLE_UNDEF_WARNING := $(subst \,/,$(SRC_DISABLE_UNDEF_WARNING))
###### Output files ######
#Primary target - executable
ifneq (,$(APPFILE))
TARGET_FILES = $(APPFILE)
else
ifneq (,$(SOLIB))
TARGET_FILES = $(SOLIB)
else
TARGET_FILES = $(APPLIB)
endif
endif
#Secondary targets - mainly used in debugging
TARGET_FILES_SEC+=$(WORKDIR)/$(APPNAME).elf
TARGET_FILES_SEC+=$(WORKDIR)/$(APPNAME).map
TARGET_FILES_SEC+=$(WORKDIR)/$(APPNAME).lss
TARGET_FILES_SEC+=$(WORKDIR)/$(APPNAME).sym
TARGET_FILES_SEC+=$(WORKDIR)/$(APPNAME).size.sym
TARGET_FILES_SEC+=$(LSTS)
#Digsim targets - mainly used in Digsim debugging
TARGET_FILES_DIGSIM+=$(WORKDIR)/$(APPNAME).elf
TARGET_FILES_DIGSIM+=$(WORKDIR)/$(APPNAME).sym
###### Flags used in build rules ######
INC := $(subst \,/,$(INC))
CFLAGS =$(CFLAGS_COMPILER) $(FLAGS)
ASFLAGS =$(ASFLAGS_COMPILER) $(FLAGS)
CXXFLAGS =$(CXXFLAGS_COMPILER) $(FLAGS)
ALL_CFLAGS =$(CFLAGS) $(INC)
ALL_CXXFLAGS =$(CXXFLAGS) $(INC)
ALL_ASFLAGS =$(ASFLAGS) $(AINC)
#Library inclusion
LIBFLAGS =$(LIBFLAGS_COMPILER)
LDFLAGS =$(LDFLAGS_COMPILER)
###### Convert Linux-style paths to Windows-style #####
ifneq (, $(CONVERT_TO_WIN_PATHS))
# Convert paths:
INC := $(call replace_win_roots_includes,$(INC))
AINC := $(call replace_win_roots_includes,$(AINC))
LIB := $(call replace_win_roots,$(LIB))
OBJS_COMP := $(call replace_win_roots,$(OBJS))
TARGET = $(call replace_win_roots,$(@))
SOURCE = $(call replace_win_roots,$(<))
STEM = $(call replace_win_roots,$(*))
PRE_REQS = $(call replace_win_roots,$(^))
BINSHIPPED_COMP = $(call replace_win_roots,$(BINSHIPPED))
# Dependency files will be generated with Windows paths => convert back to linux
CORRECT_DEPS := $(PYTHON_BIN) $(ENV_PATH)/make/compilers/windows_only/correctdep.py -r $(WINDOWS_WSL_ROOT) $(LINUX_WSL_ROOT) -r $(WINDOWS_C_ROOT) $(LINUX_C_ROOT) -r $(WINDOWS_R_ROOT) $(LINUX_R_ROOT) -r $(WINDOWS_D_ROOT) $(LINUX_D_ROOT) -r $(WINDOWS_E_ROOT) $(LINUX_E_ROOT)
# we need a temporary dependency file to not leave a corrupt one
DEP_FILE = $(@:.o=.dd)
DEP_FILE_FLAG = -MF $(call replace_win_roots,$(DEP_FILE))
PREINCLUDE_HEADER := $(call replace_win_roots,$(PREINCLUDE_HEADER))
else
# INC := $(INC)
# LIB := $(LIB)
TARGET = $@
SOURCE = $<
STEM = $*
PRE_REQS = $^
OBJS_COMP := $(OBJS)
BINSHIPPED_COMP = $(BINSHIPPED)
# No need to correct dependencies when not converting paths
CORRECT_DEPS :=
DEP_FILE :=
DEP_FILE_FLAG :=
CONFIG_HEADER := $(subst \,/,$(CONFIG_HEADER))
INTERNALS_HEADER := $(subst \,/,$(INTERNALS_HEADER))
PREINCLUDE_HEADER := $(subst \,/,$(PREINCLUDE_HEADER))
endif
###### Default build target ######
.PHONY:app all postbuild-app postbuild-all build-app build-all prebuild-script app-target all-target
app: postbuild-app
all: postbuild-all
digsim: $(TARGET_FILES) $(TARGET_FILES_DIGSIM)
postbuild-app: build-app
ifneq (,$(POSTBUILD_SCRIPT))
cd "$(WORKDIR)" && \
export ENV_PATH="$(ENV_PATH)" && \
sh $(POSTBUILD_SCRIPT) $(dir $(firstword $(MAKEFILE_LIST))) $(APPFILE) && \
cd -
endif
postbuild-all: build-all
ifneq (,$(POSTBUILD_SCRIPT))
cd "$(WORKDIR)" && \
export ENV_PATH="$(ENV_PATH)" && \
sh $(POSTBUILD_SCRIPT) $(dir $(firstword $(MAKEFILE_LIST))) $(APPFILE) && \
cd -
endif
ifneq (,$(PREBUILD_SCRIPT))
build-app: prebuild-script
@$(MAKE) -f $(firstword $(MAKEFILE_LIST)) --no-print-directory app-target
else
build-app: app-target
endif
ifneq (,$(PREBUILD_SCRIPT))
build-all: prebuild-script
@$(MAKE) -f $(firstword $(MAKEFILE_LIST)) --no-print-directory all-target
else
build-all: all-target
endif
prebuild-script:
ifneq (,$(PREBUILD_SCRIPT))
sh $(PREBUILD_SCRIPT) $(dir $(firstword $(MAKEFILE_LIST))) $(APPFILE)
endif
app-target: $(TARGET_FILES)
all-target: $(TARGET_FILES) $(TARGET_FILES_SEC)
###### Default build rules ######
# We make all target directories sequentially because we noticed some strange mkdir errors
# when running mkdir in the compile rule which we suspect enabled to some race condition
$(TARGET_DIRS) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)):
for d in $@; do $(MKDIR) $$d; done
.PRECIOUS : $(WORKDIR)/%.o
#Include compiler specific rules
COMPILER_RULES?=$(ENV_PATH)/make/compilers/$(COMPILER)/compiler_rules.mk
-include $(COMPILER_RULES)
#Use C or CXX compiler to link
ifdef LINK_CXX
LINK_COMMAND=$(CXX)
else
LINK_COMMAND=$(CC)
endif
.SECONDEXPANSION:
%.elf %.map: $(OBJS) $(BINSHIPPED) $(LINKERSCRIPT) $(LIB_DEP) | $$(dir $$@)
@$(ECHO) "$(BYellow)Linking $(notdir $@)$(Color_Off)"
$(LINK_COMMAND) $(OBJS_COMP) $(BINSHIPPED) $(LIBFLAGS) --output $(STEM).elf $(LDFLAGS)
%.sym %.size.sym: %.elf
@$(ECHO) "$(BWhite)Creating symbol table:$(Color_Off)" $@
$(NM) -S -n -l $< > $(dir $@)/tmp.sym
$(MV) $(dir $@)tmp.sym $@
$(NM) -S --size-sort $< > $(dir $@).size.sym
%.lss: %.elf
@$(ECHO) "$(BWhite)Creating basic listing:$(Color_Off)" $@
$(OBJDUMP) -h -d -l $(SOURCE) > $(TARGET)
# Define compilation function to avoid repeating recipes
define compile # (compiler, flags)
@$(ECHO) "$(BYellow)Building $(notdir $@)$(Color_Off)"
$(1) -c $(2) $(INC) -DGP_FILENAME=$(basename $(notdir $<)). -MMD $(DEP_FILE_FLAG) $(SOURCE) -o $(TARGET)
$(CORRECT_DEPS) $(DEP_FILE)
endef
# flag_lookup: if the flag is present, return its name
# flag_value: if the flag has a value, return its value
ifdef CONFIG_HEADER
flag_lookup = $(shell grep -Eq -e '\#define[[:space:]]+$(1)$$' -e '\#define[[:space:]]+$(1)[[:space:]]+' $(CONFIG_HEADER) $(INTERNALS_HEADER) && echo $(1))
flag_value = $(shell sed -ne 's/\#define[[:space:]][[:space:]]*$(1)[[:space:]][[:space:]]*(..*)[[:space:]]*/\1/p' $(CONFIG_HEADER) $(INTERNALS_HEADER))
else
flag_lookup = $(patsubst %,$(1),$(filter -D$(1) -D$(1)=%,$(FLAGS)))
flag_value = $(patsubst -D$(1)=%,%,$(filter -D$(1)=%,$(FLAGS)))
endif
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(ROOTDIR)/%.c | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(CFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(GPHUB_ROOT)/%.c | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(CFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(ROOTDIR)/%.cpp | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CXX), $(CXXFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(GPHUB_ROOT)/%.cpp | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CXX), $(CXXFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(ROOTDIR)/%.S | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(ROOTDIR)/%.s | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(GPHUB_ROOT)/%.S | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.o: $(GPHUB_ROOT)/%.s | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call compile,$(CC), $(ASFLAGS))
# Define listing function to avoid repeating recipes
define list # (compiler, flags)
@$(ECHO) "$(BYellow)Creating $(notdir $@)$(Color_Off)"
$(1) -c $(2) $(INC) -DGP_FILENAME=$(basename $(notdir $<)). -Wa,-adhlns=$(TARGET) -MMD $(SOURCE)
endef
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(ROOTDIR)/%.c | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(CFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(GPHUB_ROOT)/%.c | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(CFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(ROOTDIR)/%.cpp | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CXX), $(CXXFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(GPHUB_ROOT)/%.cpp | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CXX), $(CXXFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(ROOTDIR)/%.S | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(GPHUB_ROOT)/%.S | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(ROOTDIR)/%.s | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(ASFLAGS))
.SECONDEXPANSION:
$(WORKDIR)/%.lst: $(GPHUB_ROOT)/%.s | $$(dir $$@) $(dir $(PREREQ_HEADER_GENERATION_TARGETS)) $(PREREQ_HEADER_GENERATION_TARGETS)
$(call list,$(CC), $(ASFLAGS))
ifeq (,$(COMPILER_SPECIFIC_LIB_RULE))
.PHONY:
applib: $(APPLIB)
$(APPLIB): $(BINSHIPPED) $(OBJS)
#create or update archive
@$(ECHO) "$(BYellow)Archiving $@$(Color_Off)"
$(RM) $@ ; \
$(AR) $(TARGET) $(BINSHIPPED) $(OBJS_COMP)
#Adding libraries flattend through ar scripting
(echo "OPEN $(TARGET)"; \
for lib in $(LIBFILES) ; do echo "ADDLIB " $$lib; done; \
echo "SAVE"; \
echo "END") | $(firstword $(AR)) -M
endif
ifeq (,$(COMPILER_SPECIFIC_SO_LIB_RULE))
.PHONY:
solib: $(SOLIB)
$(SOLIB): $(BINSHIPPED) $(OBJS)
#create or update library
@$(ECHO) "$(BYellow)Creating .so lib $@$(Color_Off)"
$(RM) $@ ; \
$(CXX) -shared -o $(TARGET) $(BINSHIPPED) $(OBJS_COMP) $(LIBFLAGS) $(LDFLAGS)
endif
#Include extra programmer rules
PROGRAMMER_RULES?=$(ENV_PATH)/make/programmers/$(PROGRAMMER)/programmer_rules.mk
-include $(PROGRAMMER_RULES)
###### Dependencies ######
# We generate a file for each .d files with addition rules to avoid the
# "no rule to make target" whenever a .h-file is deleted or renamed.
%.sd: %.d $(ENV_PATH)/make/make_d_rules.py
$(PYTHON_BIN) $(ENV_PATH)/make/make_d_rules.py <$< >$@
SAFE_DEPS:= $(OBJS:.o=.sd)
-include $(DEPS) $(SAFE_DEPS)
endif
#Include GreenPeak specific rules
-include $(ENV_PATH)/make/gpinternal.mk
.PHONY:clean
clean:
$(ECHO) "$(BGreen)---- Cleaning $(APPNAME) ----$(Color_Off)"
$(RM) $(WORKDIR)
help::
$(ECHO) "$(BWhite)--- Common ---$(Color_Off)\n\
app - create targets $(BWhite)(default)$(Color_Off)\n$(call list2lines,$(TARGET_FILES))\n\
all - create targets+secondary\n$(call list2lines,$(filter-out $(LSTS),$(TARGET_FILES_SEC)))\n\
digsim - make for digsim - create targets\n$(call list2lines,$(filter-out $(LSTS),$(TARGET_FILES_DIGSIM)))\n\
clean - clean working directory\n$(WORKDIR)\n"