我正试图为asm文件的交叉编译编写一个制作配方。问题是,我想使用regex作为输出目标的makefile先决条件,因为这些程序集文件是以某种程度上的自动方式生成的。
因此,它们的名称遵循以下模式:
1_mps.S # i want this to be compiled into 1_mps.elf
2_mps.S # i want this to be compiled into 2_mps.elf
3_mps.S # i want this to be compiled into 3_mps.elf等等..。
我正试图在Makefile文档中找到这个有点动态的规则定义的适当处理方法,但是我有点迷路了,我需要一些帮助。
那么,我如何定义一个前提条件,并将输出文件命名为这样呢?
到目前为止,我已经尝试使用通配符和%模式,但没有成功。
例如:
out.elf : %_mps.S, vectors.S, syscalls.c
... gcc cross-compiler invocation here...out.elf : *_mps.S, vectors.S, syscalls.c
... gcc cross-compiler invocation here...当然,这两个示例都不起作用,但也不产生相应的外部文件。例如,即使它们能够工作,在所有情况下都会生成名称out.elf (即,对于每个n_mps.S输入文件)。
我(不工作)的尝试:
RISCV_EXE_PREFIX = $(RISCV)/bin/riscv32-unknown-elf-
all: %_mps.hex
$_mps.elf: %_mps.o syscalls.c vectors.S
$(RISCV_EXE_PREFIX)gcc -o $@ \
-T link.ld \
-static \
$^ \
-I $(RISCV)/riscv32-unknown-elf/include \
-L $(RISCV)/riscv32-unknown-elf/lib
%_mps.o : %_mps.S
$(RISCV_EXE_PREFIX)gcc -march=rv32imcxpulpv2 -c -w -Os -g -nostdlib \
-I $(RISCV)/riscv32-unknown-elf/include \
-L $(RISCV)/riscv32-unknown-elf/lib \
-lc -lm -lgcc
%_mps.hex: %_mps.elf
$(RISCV_EXE_PREFIX)objcopy --output-target=verilog $< $@
.PHONY:
clean:
rm -rf $(PROGRAM_NAME).elf $(PROGRAM_NAME).hex作出:*没有规则使目标'%_mps.hex',需要‘所有’。停止播放。
发布于 2022-08-16 15:09:25
您可能希望首先使用模式规则将源文件编译为目标文件,然后将对象文件链接到ELF对象:
all : 1_mps.elf 2_mps.elf 3_mps.elf
%_mps.S :
# Create .S
touch $@
%_mps.o : %_mps.S
# Compile .S into .o
echo "$^" > $@
%_mps.elf : %_mps.o
# Link .o into .elf
echo "$^" > $@
.PHONY: all
.PRECIOUS: %_mps.S %_mps.o # Needed because it makes source files with touch.输出:
$ make
# Create .S
touch 1_mps.S
# Compile .S into .o
echo "1_mps.S" > 1_mps.o
# Link .o into .elf
echo "1_mps.o" > 1_mps.elf
# Create .S
touch 2_mps.S
# Compile .S into .o
echo "2_mps.S" > 2_mps.o
# Link .o into .elf
echo "2_mps.o" > 2_mps.elf
# Create .S
touch 3_mps.S
# Compile .S into .o
echo "3_mps.S" > 3_mps.o
# Link .o into .elf
echo "3_mps.o" > 3_mps.elf
$ make
make: Nothing to be done for 'all'.发布于 2022-08-18 11:27:11
我的工作尝试
RISCV ?= ~/.riscv
RISCV_EXE_PREFIX = $(RISCV)/bin/riscv32-unknown-elf-
LINKER_SCRIPT = link.ld
CC = gcc
LFLAGS = -lc -lm -lgcc -nostdlib
all: $(patsubst %.S,%.hex,$(wildcard *_mps.S))
%_mps.hex: %_mps.elf
@echo "@@@@@@@@ BIN2HEX @@@@@@@@"
$(RISCV_EXE_PREFIX)objcopy \
--output-target=verilog $< $@
%_mps.elf: %_mps.o syscalls.c vectors.S
@echo "@@@@@@@@ LINKING @@@@@@@@"
$(RISCV_EXE_PREFIX)$(CC) \
-march=rv32imcxpulpv2 \
-T $(LINKER_SCRIPT) \
-static $^ \
-I $(RISCV)/riscv32-unknown-elf/include \
-L $(RISCV)riscv32-unknown-elf/lib \
$(LFLAGS) \
-g -w \
-o $@
%_mps.o : %_mps.S
@echo "@@@@@@@@ X-COMPILING @@@@@@@@"
$(RISCV_EXE_PREFIX)$(CC) \
-march=rv32imcxpulpv2 \
-c $< \
-g -w -Os
.PHONY:
clean:
@echo "@@@@@@@@ CLEAN @@@@@@@@"
rm -rf *.elf *.hexhttps://stackoverflow.com/questions/73375669
复制相似问题