我有三个源文件:
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 作为其输入,并且最好只有一个定义源文件的文件。
看起来@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