【发布时间】:2016-08-01 01:56:16
【问题描述】:
我有一堆文件 (*.txt),我使用 python 脚本分析并从中生成代码 (*.cpp)。代码生成完成后,我希望将生成的代码编译成目标文件 (*.o)。
我想使用 gnu-make 来设置它。我的问题是我想不出一个有效的 Makefile 语法来完成这个。
这里有一些额外的细节让这更难:
由于我一开始不知道存在多少 *.txt 文件,所以我想使用 shell find 命令来发现它们。
files := $(shell find $(TXT_FILE_DIR) -type f -name '*.txt')
但是,我仍然希望 gnu-make 的精细依赖功能在这里工作。也就是说,如果任何 txt 文件发生更改,我希望 make 自动发现这些更改,并且仅发现这些更改,并为它们生成新的 .cpp 文件并将它们重新编译为 .o 文件。
我正在寻找一种解决方案,其中make 可以并行运行(并尊重 -j 标志)并调用将 *.txt 文件转换为 *.cpp 文件的 python 脚本。
我的操作系统是 Linux。
[新信息]
感谢 Grexis,感谢您的回答!但是,因为我在 src 和 dst-paths 之间的映射有点奇怪,所以我实际上正在寻找不同的解决方案。
以下是翻译我的 src 和 dst 路径时“奇怪”的示例:
$(TXT_DIR)/a/XXX.*XXX/b/c/file1.txt -> $(CPP_DIR)/a/YYY/b/c/file1.cpp
$(TXT_DIR)/a/XXX.*XXX/b/c/file2.txt -> $(CPP_DIR)/a/YYY/b/c/file2.cpp
$(TXT_DIR)/b/XXX.*XXX/c/d/file3.txt -> $(CPP_DIR)/b/YYY/c/d/file3.cpp
注意这里的路径被操纵了两次。因此,两者:
-
$(TXT_DIR)替换为$(CPP_DIR)和 - 正则表达式
XXX.*XXX替换为固定字符串YYY
但是,由于在 gnu-make 中很难进行多个字符串替换,例如,gnu-make 一次只支持单个 % (stem) 字符串替换,我认为我必须使用更高级的 gnu -make 语法。因此,我正在寻找一种方法来定义“每个 .txt -> .cpp 对的不同配方”。我尝试了以下方法:
cleanPath = $(shell echo $(1) | sed s/XXX.*XXX/YYY/g)
txt2cpp = $(subst $(TXT_DIR),$(CPP_DIR),$(patsubst %.txt,%.cpp,$(call cleanPath,$(1))))
txt2obj = $(subst $(TXT_DIR),$(OBJ_DIR),$(patsubst %.txt,%.o,$(call cleanPath,$(1))))
define analyse =
$(2): $(1)
python.py $(2) $(3)
endef
txt_files := $(shell find $(TXT_DIR) -type f -name '*.txt')
cpps := $(foreach file,$(txt_files),$(eval $(call analyse,$(file),$(call txt2cpp,$(file)),$(call txt2obj,$(file)))))
all: $(cpps)
但是,我的 python.py 脚本似乎从未被调用过。这是为什么呢?
如果我在shell-命令中包含对python.py 的调用,例如$(shell python.py $(2) $(3)),则实际上调用了python.py 脚本。然而,使用shell-command 使得并行性变得不可能。不幸的是,不能并行执行python.py 脚本对我来说不是一个选项。
【问题讨论】:
标签: gnu-make