首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile:用于先决条件文件的Regexp模式

Makefile:用于先决条件文件的Regexp模式
EN

Stack Overflow用户
提问于 2022-08-16 14:28:05
回答 2查看 65关注 0票数 1

我正试图为asm文件的交叉编译编写一个制作配方。问题是,我想使用regex作为输出目标的makefile先决条件,因为这些程序集文件是以某种程度上的自动方式生成的。

因此,它们的名称遵循以下模式:

代码语言:javascript
复制
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文档中找到这个有点动态的规则定义的适当处理方法,但是我有点迷路了,我需要一些帮助。

那么,我如何定义一个前提条件,并将输出文件命名为这样呢?

到目前为止,我已经尝试使用通配符和%模式,但没有成功。

例如:

代码语言:javascript
复制
out.elf : %_mps.S, vectors.S, syscalls.c
      ... gcc cross-compiler invocation here...
代码语言:javascript
复制
out.elf : *_mps.S, vectors.S, syscalls.c
      ... gcc cross-compiler invocation here...

当然,这两个示例都不起作用,但也不产生相应的外部文件。例如,即使它们能够工作,在所有情况下都会生成名称out.elf (即,对于每个n_mps.S输入文件)。

我(不工作)的尝试:

代码语言:javascript
复制
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',需要‘所有’。停止播放。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-16 15:09:25

您可能希望首先使用模式规则将源文件编译为目标文件,然后将对象文件链接到ELF对象:

代码语言:javascript
复制
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.

输出:

代码语言:javascript
复制
$ 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'.
票数 0
EN

Stack Overflow用户

发布于 2022-08-18 11:27:11

我的工作尝试

代码语言:javascript
复制
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 *.hex
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73375669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档