文件列表中的 Makefile 目标依赖项

问题描述 投票:0回答:1

我有三个源文件:

a
b
c
中的
src1
src2
src3

我有以下 Makefile:

ROOT1=$(shell realpath ./src1)
ROOT2=$(shell realpath ./src2)
ROOT3=$(shell realpath ./src3)

SOURCE_FILES = $(shell cat depsfromfile.list)

.PHONY: compile

compile: .xsim.timestamp
    @echo $(SOURCE_FILES)
    @echo "simulating..."

.xsim.timestamp: $(SOURCE_FILES)
    @echo "compiling source files"
    @touch .xsim.timestamp

.PHONY: clean

clean: 
    @rm -rf .*.timestamp

我正在使用以下

depsfromfile.list
文件:

$(ROOT1)/a
$(ROOT2)/b
$(ROOT3)/c

如您所见,我在

$(ROOT1)
文件中使用
.list
变量。我假设当这些值被分配给
SOURCE_FILES
变量时,
$(ROOT1)
被评估。但是,运行 make 文件会出现以下错误:

make: *** No rule to make target '$(ROOT1)/a', needed by '.xsim.timestamp'.  Stop.

我的目标是从文件中获取源文件列表。请指导我如何实现这一目标。

到目前为止我尝试过的:

我已将行

.xsim.timestamp: $(SOURCE_FILES)
更改为
.xsim.timestamp: $($(SOURCE_FILES))
。现在,make 第一次按预期运行,但没有检测到源文件中的更改。

目录结构如下:

.
+-- src1
|   +-- a
+-- src2
|   +-- b
+-- src3
|   +-- c
+-- Makefile
+-- depsfromfile.list

文件

a
b
c
的内容无关紧要。

如果我在

depsfromfile.list
中硬编码文件的完整路径,一切都会顺利进行。但是,我希望从 Makefile 变量中获取源路径,例如
ROOT1
ROOT2
ROOT3
。这一要求的原因是某些工具使用相同的 flist 作为其输入,并且最好只有一个定义源文件的文件。

makefile gnu-make
1个回答
0
投票

看起来@johnbollinger 的评论给我指明了正确的方向。这个想法是在

sed
命令的帮助下获取源列表文件并生成一个 make 文件。完成后,我们可以将生成的
mk
文件包含到主 make 文件中。更新后的 Makefile 如下:

ROOT1=$(shell realpath ./src1)
ROOT2=$(shell realpath ./src2)
ROOT3=$(shell realpath ./src3)

-include depsfromfile.mk

.xsim.timestamp: depsfromfile.mk $(SOURCE_FILES) 
    @echo "compiling source files"
    @touch .xsim.timestamp

.PHONY: compile
compile: .xsim.timestamp
    @echo "simulating..."

depsfromfile.mk: depsfromfile.list
    @sed 's/^/SOURCE_FILES+=/' depsfromfile.list > depsfromfile.mk

.PHONY: clean
clean: 
    @rm -rf .*.timestamp *.mk
© www.soinside.com 2019 - 2024. All rights reserved.