2016-06-13 68 views
0

我有以下生成文件,我跑编译MEX功能:makefile编译多个MEX功能

SRC:=$(wildcard ./source/*.c) 
    all: $(SRC) 
      for file in $^ ; do \ 
      mex -outdir matlab/ -output [email protected] $$file CC=mpicc CXX=mpicxx COPTIMFLAGS="-O2 -DNDEBUG" LDOPTIMFLAGS="-O2"; \ 
      done 
    .PHONY: clean 
    clean: 
      rm ./matlab/*.mexa64 

代码编译,即使我修改一个所有文件。
我已经创建了一个makefile,只考虑修改后的文件将被编译,而不是全部。 我目前无法找到一种方法来做到这一点。编译所有文件以便对其中一个文件进行最轻微的更改非常耗时,因为我有大约50个文件需要编译。
任何帮助表示赞赏。
让我知道如果我不清楚任何地方。

+1

你读过任何makefile教程吗?另外,你是在用'/ matlab'来代替'./matlab',而'/ source'是用于目的?我的意思是,如果这真的是你的代码,它的工作是正确的:你只是不删除你想删除的东西。 –

+0

源文件和mex文件之间是否存在简单的关联?也就是说,如果你从'foo.c'开始,你会得到'foo.mexa64',而没有其他的东西? – Beta

+0

对不起..我编辑它.. – Pundit

回答

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; 

$?获取修改的所有文件的列表。
比$ @编译他们一个接一个。
比触摸全部都将它们标记为已更新。
完美的作品。
谢谢大家。

2

你是因为:1)您是通过$^变量,它包含了先决条件所有循环重建所有MEX文件的,不只是因为目标已经改变了的人的最后修改,以及2)你正在使用伪目标all,所以Make一直执行规则,试图重建该文件。

您可以通过更改单个字符来解决第一个问题; $?变量包含比目标更新的先决条件列表。但那不会解决第二个问题。更好的方法是免除for回路并使用Make本身:

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"; 
+0

做什么: 'TARGS:= $(patsubst ./source/*.c,./matlab/*.mexa64,$(SRC))' 呢? – Pundit

+0

@Pundit:['patsubst'](http://www.gnu.org/software/make/manual/make.html#Text-Functions)将SRC列表从'./source/foo.c ./ source/bar.c ...'到'./matlab/foo.mexa64 ./matlab/bar.mexa64 ...,并且“TARGS:=”将新列表放到名为'TARGS'的变量中。 – Beta