Makefile用于编译多个mex函数

时间:2016-06-13 22:06:27

标签: c++ matlab makefile

我有以下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个文件要编译 任何帮助表示赞赏 如果我在任何地方都不清楚,请告诉我。

2 个答案:

答案 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;

$?获取所有已修改文件的列表 比$ @一个接一个地编译它们 比触摸所有标记都更新。
工作得很好。
谢谢大家。