forked from Archive/PX4-Autopilot
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:
parent
d24599931a
commit
6b215be739
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
################################################################################
|
||||
|
|
|
@ -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) $@
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -0,0 +1,4 @@
|
|||
int test_main(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue