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.
This commit is contained in:
px4dev 2013-02-23 14:33:53 -08:00
parent d24599931a
commit 6b215be739
6 changed files with 85 additions and 52 deletions

View File

@ -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)

View File

@ -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
################################################################################

View File

@ -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) $@

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,4 @@
int test_main(void)
{
return 0;
}