指定输入源(而不是中间体)作为Makefile中的目标先决条件

时间:2017-06-16 21:27:07

标签: makefile

在阅读Managing Projects with GNU Make的前几章后,我提出了我的第一个非平凡的Makefile

all: libTest.a

libTest.a : Test.o MWE.o Test.dlink.o MWE.dlink.o
    nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^

%.a : %.dlink.o %.o
    nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^

%.dlink.o : %.o
    nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -dlink -o $@ $<

%.o: %.cu
    nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -dc -o $@ -c $<

clean:
    rm -f *.o *.dlink.o

这个Makefile有效但我真的不喜欢将中间文件Test.o MWE.o Test.dlink.o MWE.dlink.o指定为libTest的先决条件。我宁愿指定输入文件Test.cuMWE.cu,或者更好地指定通配符%.u

1 个答案:

答案 0 :(得分:1)

只要您可以准备一个命令(或一组命令)来构建来自libTest.aTest.cu的{​​{1}},您就可以拥有一条规则:

MWE.cu

但这不是使用libTest.a: Test.cu MWE.cu list of commands needed to build the library 的合理方法。你在原始问题中向我们展示的是make - 做事的方式。但是,如果您的整个make规则Makefile在这里是多余的。

您可以做的是自动生成这些先决条件:

%.a : %.dlink.o %.o

如果您不想手动将文件名添加到SOURCES=Test.cu MWE.cu libTest.a: $(SOURCES:%.cu=%.o) $(SOURCES:%.cu=%.dlink.o) nvcc -ccbin g++ -m64 -gencode arch=compute_30,code=sm_30 -lib -o $@ $^ 但更喜欢使用当前目录中提供的所有SOURCES文件,请将*.cu作业替换为:

SOURCES