diff options
author | px4dev <px4@purgatory.org> | 2013-02-23 14:33:53 -0800 |
---|---|---|
committer | px4dev <px4@purgatory.org> | 2013-02-23 22:01:00 -0800 |
commit | 6b215be739528eb20b50247a0a095d27092b3be4 (patch) | |
tree | 626241e09b180d4f8378a9512adf4832b188102c /makefiles | |
parent | d24599931a3d68586cc62eddd8ffc4e309ba1606 (diff) | |
download | px4-firmware-6b215be739528eb20b50247a0a095d27092b3be4.tar.gz px4-firmware-6b215be739528eb20b50247a0a095d27092b3be4.tar.bz2 px4-firmware-6b215be739528eb20b50247a0a095d27092b3be4.zip |
Use indirect calls for all commands (echo, make, etc.)
Replace our dependency on xxd with a toolchain call, and implement the backend using objcopy evil for the default toolchain.
Diffstat (limited to 'makefiles')
-rw-r--r-- | makefiles/firmware.mk | 54 | ||||
-rw-r--r-- | makefiles/module.mk | 6 | ||||
-rw-r--r-- | makefiles/nuttx.mk | 8 | ||||
-rw-r--r-- | makefiles/setup.mk | 4 | ||||
-rw-r--r-- | makefiles/toolchain_gnu-arm-eabi.mk | 61 |
5 files changed, 81 insertions, 52 deletions
diff --git a/makefiles/firmware.mk b/makefiles/firmware.mk index 1b6a1cdef..23fd3136f 100644 --- a/makefiles/firmware.mk +++ b/makefiles/firmware.mk @@ -172,10 +172,10 @@ MODULE_OBJS := $(foreach path,$(dir $(MODULE_MKFILES)),$(WORK_DIR)$(path)module $(MODULE_OBJS): relpath = $(patsubst $(WORK_DIR)%,%,$@) $(MODULE_OBJS): mkfile = $(patsubst %module.pre.o,%module.mk,$(relpath)) $(MODULE_OBJS): $(GLOBAL_DEPS) $(NUTTX_CONFIG_HEADER) - @echo %% - @echo %% Building module using $(mkfile) - @echo %% - $(Q) make -f $(PX4_MK_DIR)module.mk \ + @$(ECHO) %% + @$(ECHO) %% Building module using $(mkfile) + @$(ECHO) %% + $(Q) $(MAKE) -f $(PX4_MK_DIR)module.mk \ MODULE_WORK_DIR=$(dir $@) \ MODULE_OBJ=$@ \ MODULE_MK=$(mkfile) \ @@ -189,8 +189,8 @@ MODULE_CLEANS := $(foreach path,$(dir $(MODULE_MKFILES)),$(WORK_DIR)$(path)/cle $(MODULE_CLEANS): relpath = $(patsubst $(WORK_DIR)%,%,$@) $(MODULE_CLEANS): mkfile = $(patsubst %clean,%module.mk,$(relpath)) $(MODULE_CLEANS): - @echo %% cleaning using $(mkfile) - $(Q) make -f $(PX4_MK_DIR)module.mk \ + @$(ECHO) %% cleaning using $(mkfile) + $(Q) $(MAKE) -f $(PX4_MK_DIR)module.mk \ MODULE_WORK_DIR=$(dir $@) \ MODULE_MK=$(mkfile) \ clean @@ -210,6 +210,8 @@ include $(PX4_MK_DIR)/nuttx.mk # NuttX export library. Instead, we have to treat it like a library. # ifneq ($(ROMFS_ROOT),) + +# Add dependencies on anything in the ROMFS root ROMFS_DEPS += $(wildcard \ (ROMFS_ROOT)/* \ (ROMFS_ROOT)/*/* \ @@ -223,15 +225,13 @@ ROMFS_OBJ = $(ROMFS_CSRC:.c=.o) LIBS += $(ROMFS_OBJ) LINK_DEPS += $(ROMFS_OBJ) -$(ROMFS_OBJ): $(ROMFS_CSRC) - $(Q) $(call COMPILE,$<,$@) - -$(ROMFS_CSRC): $(ROMFS_IMG) - @echo %% generating $@ - $(Q) (cd $(dir $<) && xxd -i $(notdir $<)) > $@ +# Turn the ROMFS image into an object file +$(ROMFS_OBJ): $(ROMFS_IMG) $(GLOBAL_DEPS) + $(call BIN_TO_OBJ,$<,$@,romfs_img) +# Generate the ROMFS image from the root $(ROMFS_IMG): $(ROMFS_DEPS) $(GLOBAL_DEPS) - @echo %% generating $@ + @$(ECHO) %% generating $@ $(Q) $(GENROMFS) -f $@ -d $(ROMFS_ROOT) -V "NSHInitVol" endif @@ -264,25 +264,25 @@ BUILTIN_COMMANDS += $(subst COMMAND.,,$(notdir $(wildcard $(WORK_DIR)builtin_com # (BUILTIN_PROTO,<cmdspec>,<outputfile>) define BUILTIN_PROTO - echo 'extern int $(word 4,$1)(int argc, char *argv[]);' >> $2; + $(ECHO) 'extern int $(word 4,$1)(int argc, char *argv[]);' >> $2; endef # (BUILTIN_DEF,<cmdspec>,<outputfile>) define BUILTIN_DEF - echo ' {"$(word 1,$1)", $(word 2,$1), $(word 3,$1), $(word 4,$1)},' >> $2; + $(ECHO) ' {"$(word 1,$1)", $(word 2,$1), $(word 3,$1), $(word 4,$1)},' >> $2; endef $(BUILTIN_CSRC): $(GLOBAL_DEPS) - @echo %% generating $@ - $(Q) echo '/* builtin command list - automatically generated, do not edit */' > $@ - $(Q) echo '#include <nuttx/config.h>' >> $@ - $(Q) echo '#include <nuttx/binfmt/builtin.h>' >> $@ + @$(ECHO) %% generating $@ + $(Q) $(ECHO) '/* builtin command list - automatically generated, do not edit */' > $@ + $(Q) $(ECHO) '#include <nuttx/config.h>' >> $@ + $(Q) $(ECHO) '#include <nuttx/binfmt/builtin.h>' >> $@ $(Q) $(foreach spec,$(BUILTIN_COMMANDS),$(call BUILTIN_PROTO,$(subst ., ,$(spec)),$@)) - $(Q) echo 'const struct builtin_s g_builtins[] = {' >> $@ + $(Q) $(ECHO) 'const struct builtin_s g_builtins[] = {' >> $@ $(Q) $(foreach spec,$(BUILTIN_COMMANDS),$(call BUILTIN_DEF,$(subst ., ,$(spec)),$@)) - $(Q) echo ' {NULL, 0, 0, NULL}' >> $@ - $(Q) echo '};' >> $@ - $(Q) echo 'const int g_builtin_count = $(words $(BUILTIN_COMMANDS));' >> $@ + $(Q) $(ECHO) ' {NULL, 0, 0, NULL}' >> $@ + $(Q) $(ECHO) '};' >> $@ + $(Q) $(ECHO) 'const int g_builtin_count = $(words $(BUILTIN_COMMANDS));' >> $@ BUILTIN_OBJ = $(BUILTIN_CSRC:.c=.o) LIBS += $(BUILTIN_OBJ) @@ -302,7 +302,7 @@ $(BUILTIN_OBJ): $(BUILTIN_CSRC) ifeq ($(SRCS),) EMPTY_SRC = $(WORK_DIR)empty.c $(EMPTY_SRC): - $(Q) echo '/* this is an empty file */' > $@ + $(Q) $(ECHO) '/* this is an empty file */' > $@ SRCS += $(EMPTY_SRC) endif @@ -346,7 +346,7 @@ $(filter %.S.o,$(OBJS)): $(WORK_DIR)%.S.o: %.S $(GLOBAL_DEPS) # $(PRODUCT_BUNDLE): $(PRODUCT_BIN) - @echo %% Generating $@ + @$(ECHO) %% Generating $@ $(Q) $(MKFW) --prototype $(IMAGE_DIR)/$(BOARD).prototype \ --git_identity $(PX4_BASE) \ --image $< > $@ @@ -363,7 +363,7 @@ $(PRODUCT_SYM): $(OBJS) $(MODULE_OBJS) $(GLOBAL_DEPS) $(LINK_DEPS) $(MODULE_MKF .PHONY: upload upload: $(PRODUCT_BUNDLE) $(PRODUCT_BIN) - $(Q) make -f $(PX4_MK_DIR)/upload.mk \ + $(Q) $(MAKE) -f $(PX4_MK_DIR)/upload.mk \ METHOD=serial \ PRODUCT=$(PRODUCT) \ BUNDLE=$(PRODUCT_BUNDLE) \ @@ -371,7 +371,7 @@ upload: $(PRODUCT_BUNDLE) $(PRODUCT_BIN) .PHONY: clean clean: $(MODULE_CLEANS) - @echo %% cleaning + @$(ECHO) %% cleaning $(Q) $(REMOVE) $(PRODUCT_BUNDLE) $(PRODUCT_BIN) $(PRODUCT_SYM) $(Q) $(REMOVE) $(OBJS) $(DEP_INCLUDES) $(Q) $(RMDIR) $(NUTTX_EXPORT_DIR) diff --git a/makefiles/module.mk b/makefiles/module.mk index 306a9594f..bf54362e6 100644 --- a/makefiles/module.mk +++ b/makefiles/module.mk @@ -100,9 +100,9 @@ MODULE_COMMAND_FILES := $(addprefix $(WORK_DIR)/builtin_commands/COMMAND.,$(MODU .PHONY: $(MODULE_COMMAND_FILES) $(MODULE_COMMAND_FILES): $(GLOBAL_DEPS) - @echo COMMAND $(word 2,$(subst ., ,$(notdir $(@)))) - @mkdir -p $@ - $(Q) touch $@ + @$(ECHO) COMMAND $(word 2,$(subst ., ,$(notdir $(@)))) + @$(MKDIR) -p $(dir $@) + $(Q) $(TOUCH) $@ endif ################################################################################ diff --git a/makefiles/nuttx.mk b/makefiles/nuttx.mk index bd2b98084..e71993916 100644 --- a/makefiles/nuttx.mk +++ b/makefiles/nuttx.mk @@ -27,7 +27,7 @@ GLOBAL_DEPS += $(NUTTX_CONFIG_HEADER) # # Use the linker script from the NuttX export # -LDSCRIPT = $(NUTTX_EXPORT_DIR)build/ld.script +LDSCRIPT += $(NUTTX_EXPORT_DIR)build/ld.script # # Add directories from the NuttX export to the relevant search paths @@ -39,6 +39,6 @@ LINK_DEPS += $(NUTTX_EXPORT_DIR)libs/libapps.a \ $(NUTTX_EXPORT_DIR)libs/libnuttx.a $(NUTTX_CONFIG_HEADER): $(NUTTX_ARCHIVE) - @echo %% Unpacking $(NUTTX_ARCHIVE) - $(Q) unzip -q -o -d $(WORK_DIR) $(NUTTX_ARCHIVE) - $(Q) touch $@ + @$(ECHO) %% Unpacking $(NUTTX_ARCHIVE) + $(Q) $(UNZIP) -q -o -d $(WORK_DIR) $(NUTTX_ARCHIVE) + $(Q) $(TOUCH) $@ diff --git a/makefiles/setup.mk b/makefiles/setup.mk index d4b279e7c..f67ab7bb0 100644 --- a/makefiles/setup.mk +++ b/makefiles/setup.mk @@ -29,6 +29,10 @@ COPY = cp REMOVE = rm -f RMDIR = rm -rf GENROMFS = genromfs +TOUCH = touch +MKDIR = mkdir +ECHO = echo +UNZIP = unzip # # Host-specific paths, hacks and fixups diff --git a/makefiles/toolchain_gnu-arm-eabi.mk b/makefiles/toolchain_gnu-arm-eabi.mk index 0a1ee18e9..108476782 100644 --- a/makefiles/toolchain_gnu-arm-eabi.mk +++ b/makefiles/toolchain_gnu-arm-eabi.mk @@ -119,7 +119,7 @@ AFLAGS = $(CFLAGS) -D__ASSEMBLY__ LDFLAGS += --warn-common \ --gc-sections \ - -T $(LDSCRIPT) \ + $(addprefix -T,$(LDSCRIPT)) \ $(addprefix -L,$(LIB_DIRS)) LIBGCC := $(shell $(CC) $(ARCHCPUFLAGS) -print-libgcc-file-name) @@ -134,51 +134,76 @@ DEP_INCLUDES = $(subst .o,.d,$(OBJS)) # compile C source $1 to object $2 # as a side-effect, generate a dependency file define COMPILE - @echo "CC <- $1" - @echo "CC -> $2" - @mkdir -p $(dir $2) + @$(ECHO) "CC <- $1" + @$(ECHO) "CC -> $2" + @$(MKDIR) -p $(dir $2) $(Q) $(CC) -MD -c $(CFLAGS) $(abspath $1) -o $2 endef # compile C++ source $1 to $2 # as a side-effect, generate a dependency file define COMPILEXX - @echo "CXX: $1" - @mkdir -p $(dir $2) + @$(ECHO) "CXX: $1" + @$(MKDIR) -p $(dir $2) $(Q) $(CXX) -MD -c $(CXXFLAGS) $(abspath $1) -o $2 endef # assemble $1 into $2 define ASSEMBLE - @echo "AS: $1" - @mkdir -p $(dir $2) + @$(ECHO) "AS: $1" + @$(MKDIR) -p $(dir $2) $(Q) $(CC) -c $(AFLAGS) $(abspath $1) -o $2 endef # produce partially-linked $1 from files in $2 define PRELINK - @echo "PRELINK: $1" - @mkdir -p $(dir $1) + @$(ECHO) "PRELINK: $1" + @$(MKDIR) -p $(dir $1) $(Q) $(LD) -Ur -o $1 $2 && $(OBJCOPY) --localize-hidden $1 endef # update the archive $1 with the files in $2 define ARCHIVE - @echo "AR: $2" - @mkdir -p $(dir $1) + @$(ECHO) "AR: $2" + @$(MKDIR) -p $(dir $1) $(Q) $(AR) $1 $2 endef -# Link the objects in $2 into the binary $1 +# link the objects in $2 into the binary $1 define LINK - @echo "LINK: $1" - @mkdir -p $(dir $1) + @$(ECHO) "LINK: $1" + @$(MKDIR) -p $(dir $1) $(Q) $(LD) $(LDFLAGS) -o $1 --start-group $2 $(LIBS) $(EXTRA_LIBS) $(LIBGCC) --end-group endef -# convert $1 from a linked object to a raw binary +# convert $1 from a linked object to a raw binary in $2 define SYM_TO_BIN - @echo "BIN: $2" - @mkdir -p $(dir $2) + @$(ECHO) "BIN: $2" + @$(MKDIR) -p $(dir $2) $(Q) $(OBJCOPY) -O binary $1 $2 endef + +# Take the raw binary $1 and make it into an object file $2. +# The symbol $3 points to the beginning of the file, and $3_len +# gives its length. +# +# - compile an empty file to generate a suitable object file +# - relink the object and insert the binary file +# - edit symbol names to suit +# +define BIN_SYM_PREFIX + _binary_$(subst /,_,$(subst .,_,$1)) +endef +define BIN_TO_OBJ + @$(ECHO) "WRAP: $2" + @$(MKDIR) -p $(dir $2) + $(Q) $(ECHO) > $2.c + $(call COMPILE,$2.c,$2.c.o) + $(LD) -r -o $2 $2.c.o -b binary $1 + $(OBJCOPY) $2 \ + --redefine-sym $(call BIN_SYM_PREFIX,$1)_start=$3 \ + --redefine-sym $(call BIN_SYM_PREFIX,$1)_size=$3_len \ + --strip-symbol $(call BIN_SYM_PREFIX,$1)_end +endef + +# $(Q) $(OBJCOPY) --add-section .rodata.$3=$1 $2 |