我有以下makefile来编译mex函数:
SRC:=$(wildcard ./source/*.c)
all: $(SRC)
for file in $^ ; do \
mex -outdir matlab/ -output $@ $$file CC=mpicc CXX=mpicxx COPTIMFLAGS="-O2 -DNDEBUG" LDOPTIMFLAGS="-O2"; \
done
.PHONY: clean
clean:
rm ./matlab/*.mexa64
即使我修改了一个文件,代码也会编译所有文件 我创建了一个makefile,只考虑修改后的文件将被编译,而不是全部。 我目前无法找到办法做到这一点。编译所有文件以便对其中一个进行最轻微的更改非常耗时,因为我有大约50个文件要编译 任何帮助表示赞赏 如果我在任何地方都不清楚,请告诉我。
答案 0 :(得分:2)
您正在重建所有mex文件,因为1)您正在循环遍历$^
变量,该变量包含所有先决条件,而不仅仅是自目标以来已更改的变量上次修改,2)您正在使用虚假目标all
,因此Make会继续执行规则,尝试重建该文件。
您可以通过更改单个字符来解决第一个问题; $?
变量包含比目标更新的先决条件列表。但这不会解决第二个问题。更好的方法是省略for
循环并使用Make its:
SRC := $(wildcard ./source/*.c)
TARGS := $(patsubst ./source/*.c, ./matlab/*.mexa64, $(SRC))
all: $(TARGS)
./matlab/%.mexa64: ./source/%.c
mex -outdir matlab/ -output all $*.mexa64 CC=mpicc CXX=mpicxx COPTIMFLAGS="-O2 -DNDEBUG" LDOPTIMFLAGS="-O2";
答案 1 :(得分:1)
终于搞定了。感谢@Beta的投入。我用的是$?正如您所建议并将代码修改为以下功能齐全的代码:
SRC:=$(wildcard ./source/*.c)
all: $(SRC)
for file in $? ; do \
mex -outdir matlab/ $$file CC=mpicc CXX=mpicxx COPTIMFLAGS="-O2 -DNDEBUG" LDOPTIMFLAGS="-O2"; \
done
touch all;
$?获取所有已修改文件的列表
比$ @一个接一个地编译它们
比触摸所有标记都更新。
工作得很好。
谢谢大家。