aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpx4dev <px4@purgatory.org>2013-02-23 14:33:53 -0800
committerpx4dev <px4@purgatory.org>2013-02-23 22:01:00 -0800
commit6b215be739528eb20b50247a0a095d27092b3be4 (patch)
tree626241e09b180d4f8378a9512adf4832b188102c
parentd24599931a3d68586cc62eddd8ffc4e309ba1606 (diff)
downloadpx4-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.
-rw-r--r--makefiles/firmware.mk54
-rw-r--r--makefiles/module.mk6
-rw-r--r--makefiles/nuttx.mk8
-rw-r--r--makefiles/setup.mk4
-rw-r--r--makefiles/toolchain_gnu-arm-eabi.mk61
-rw-r--r--src/modules/test/foo.c4
6 files changed, 85 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
diff --git a/src/modules/test/foo.c b/src/modules/test/foo.c
index e69de29bb..ff6af031f 100644
--- a/src/modules/test/foo.c
+++ b/src/modules/test/foo.c
@@ -0,0 +1,4 @@
+int test_main(void)
+{
+ return 0;
+} \ No newline at end of file