mirror of
https://github.com/Rockbox/rockbox.git
synced 2026-04-11 16:37:45 -04:00
The preprocess2file helper is mainly used to preprocess linker scripts, but piping the preprocessor output to 'grep' masks the exit code of gcc, so if it fails (eg. due to an #error directive) then it does not cause the build to fail like it should. In this particular case the grep commands don't seem to be doing anything, since the "-P" option suppresses line markers, which "grep -v ^$(_hash)" is probably meant to filter out. The intent behind "grep -v ^$$" is unclear since the preprocessor doesn't seem to output any line beginning with '$', but in any event it seems unnecessary. Change-Id: Ie23f5de1fe1bfb5890c7b2f3c7fa05401931d89f
104 lines
4.1 KiB
Makefile
104 lines
4.1 KiB
Makefile
# __________ __ ___.
|
|
# Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
# \/ \/ \/ \/ \/
|
|
# $Id$
|
|
#
|
|
|
|
# preprocess - run preprocessor on a file and return the result as a string
|
|
#
|
|
# The weird grep -v thing in here is due to Apple's stupidities and is needed
|
|
# to make this do right when used on Mac OS X.
|
|
#
|
|
# The sed line is to prepend the directory to all source files
|
|
|
|
# This is needed because GNU Make older than 4.3 treats this as the start
|
|
# of a comment even within a $(shell) call and requires a backslash escape.
|
|
# Newer Makes pass the whole "\#" through, making the backslash visible in
|
|
# the shell. To safely pass a literal "#", it has to go in a variable.
|
|
_hash_ = \#
|
|
|
|
preprocess = $(shell $(CC) $(PPCFLAGS) $(2) -E -P -x c -include config.h $(1) | \
|
|
grep -v "^$(_hash_)" | grep -v "^ *$$" | \
|
|
sed -e 's:^..*:$(dir $(1))&:')
|
|
|
|
preprocess2file = $(SILENT)$(CC) $(PPCFLAGS) $(3) -E -P -x c -include config.h $(1) -o $(2)
|
|
|
|
asmdefs2file = $(SILENT)$(CC) $(PPCFLAGS) $(3) -S -x c -o - -include config.h $(1) | \
|
|
perl -ne 'if(/^_?AD_(\w+):$$/){$$var=$$1}else{/^\W\.(?:word|long)\W(.*)$$/ && $$var && print "\#define $$var $$1\n";$$var=0}' > $(2)
|
|
|
|
c2obj = $(addsuffix .o,$(basename $(call full_path_subst,$(ROOTDIR)/%,$(BUILDDIR)/%,$(1))))
|
|
|
|
a2lnk = $(patsubst lib%.a,-l%,$(notdir $(1)))
|
|
|
|
# objcopy wrapper that keeps debug symbols in DEBUG builds
|
|
# handles the $(1) == $(2) case too
|
|
ifndef APP_TYPE
|
|
objcopy = $(OC) $(if $(filter yes, $(USE_ELF)), -S -x, -O binary) $(1) $(2) # objcopy native
|
|
objcopy_plugin = $(OC) $(if $(filter yes, $(PLUGIN_USE_ELF)), -S -x, -O binary) $(1) $(2)
|
|
else ifneq (,$(findstring sdl-sim,$(APP_TYPE)))
|
|
objcopy = cp $(1) $(1).tmp;mv -f $(1).tmp $(2) # objcopy simulator
|
|
objcopy_plugin = $(objcopy)
|
|
else ifneq (,$(findstring ctru,$(MODELNAME))) # 3dsxtool requires symbols
|
|
objcopy = cp $(1) $(1).tmp;mv -f $(1).tmp $(2)
|
|
objcopy_plugin = $(objcopy)
|
|
else
|
|
ifdef DEBUG
|
|
objcopy = cp $(1) $(1).tmp;mv -f $(1).tmp $(2) # objcopy hosted (DEBUG)
|
|
objcopy_plugin = $(objcopy)
|
|
else
|
|
objcopy = $(OC) -S -x $(1) $(2) # objcopy hosted (!DEBUG)
|
|
objcopy_plugin = $(objcopy)
|
|
endif
|
|
endif
|
|
|
|
# calculate dependencies for a list of source files $(2) and output them to $(1)
|
|
mkdepfile = $(SILENT)perl $(TOOLSDIR)/multigcc.pl $(CC) $(PPCFLAGS) $(OTHER_INC) -MG -MM -include config.h -- $(2) | \
|
|
sed -e "s: lang.h: lang/lang.h:" \
|
|
-e 's:_asmdefs.o:_asmdefs.h:' \
|
|
-e "s: max_language_size.h: lang/max_language_size.h:" | \
|
|
$(TOOLSDIR)/addtargetdir.pl $(ROOTDIR) $(BUILDDIR) \
|
|
>> $(1)
|
|
|
|
# function to create .bmp dependencies
|
|
bmpdepfile = $(SILENT) \
|
|
for each in $(2); do \
|
|
obj=`echo $$each | sed -e 's/\.bmp/.o/' -e 's:$(ROOTDIR):$(BUILDDIR):'`; \
|
|
src=`echo $$each | sed -e 's/\.bmp/.c/' -e 's:$(ROOTDIR):$(BUILDDIR):'`; \
|
|
hdr=`echo $$each | sed -e 's/.*\/\(.*\)\..*\.bmp/bitmaps\/\1\.h/'`; \
|
|
echo $$obj: $$src; \
|
|
echo $$src: $$each; \
|
|
echo $(BUILDDIR)/$$hdr: $$src; \
|
|
done \
|
|
>> $(1)
|
|
|
|
ifndef V
|
|
SILENT:=@
|
|
else
|
|
VERBOSEOPT:=-v
|
|
endif
|
|
PRINTS=$(SILENT)$(call info,$(1))
|
|
|
|
# old 'make' versions don't have the built-in 'info' function
|
|
info=old$(shell echo >&2 "Consider upgrading to GNU make 3.81+ for optimum build performance.")
|
|
ifeq ($(call info),old)
|
|
export info=echo "$$(1)";
|
|
endif
|
|
|
|
# path substituion can be surprisingly tricky, indeed the following almost
|
|
# always work but not quite:
|
|
# BMPOBJ = $(BMP:$(ROOTDIR)/%.bmp=$(BUILDDIR)/%.o)
|
|
# indeed if
|
|
# ROOTDIR=/rockbox
|
|
# BUILDDIR=/rockbox/build-bla
|
|
# then:
|
|
# /rockbox/apps/bitmaps/rockboxlogo-bla.bmp -> /rockbox/apps/bitmaps/rockbox/build-blalogo.o
|
|
# this function ensure that this type of problems does not occur
|
|
#
|
|
# usage: $(call full_path_subst,patterm,replacement,text)
|
|
#
|
|
# example: $(call full_path_subst,$(ROOTDIR)/%.bmp,$(BUILDDIR)/%.o,$(BMP))
|
|
NO_MATCH=this_string_will_never_match_anything
|
|
full_path_subst=$(patsubst $(NO_MATCH)/%,%, $(patsubst $(NO_MATCH)/$(1), $(2), $(addprefix $(NO_MATCH)/, $(3))))
|