2011-01-13 138 views
2

我希望这对外面的人很明显。我正在创建一个makefile,我需要一些特殊的编译。我有cuda文件和C++文件都需要分别编译。我希望能够到指定文件,然后用project1:列出了最终输出的依赖关系的指定makefile的依赖关系

CUDA_FILES := file1.cu file2.cu file3.cu 
CPP_FILES := file4.cpp file5.cpp 

# lots of options 

#rules: 
all: project1 

project1: file1.o file2.o file3.o file4.o file5.o 
    $(LD) $(LDLIBS) $^ -o [email protected] 

%.o: %.cu 
    $(CUDA) $(CUDA_ARCH) $(CUDA_OPTIONS) $(CUDA_INCLUDES) -Xcompiler "$(COMPILER OPTIONS" $^ -o [email protected] 

条款行我怎么自动生成文件列表中的对象列表来指定的依赖?

回答

0
CUDA_FILES := $(wildcard *.cu) 
CC_FILES := $(wildcard *.cpp) 

OBJS := $(CUDA_FILES:.cu=.o) $(CC_FILES:.cc=.o) 
1

只需列出目标文件而不是源文件:

$ cat Makefile 
OBJS = a.o b.o 

foo: a.o b.o 
     $(LD) -o [email protected] $^ 
$ make 
cc -c -o a.o a.c 
cc -c -o b.o b.c 
ld -o foo a.o b.o 

编辑:如果你不想遵循这一方法,使用string substitution

OBJS = $(CUDA_FILES:%.cu=%.o) $(CPP_FILES:%.cpp=%.o) 
+0

如果我使用通配符搜索文件该怎么办?目标文件不会出现。 `CUDA_FILES:= $(通配符* .cu)` – 2011-01-13 20:32:50

0

我建议使用更现代的字符串替换函数,如:

dogCpp := dog.cpp dogSays.cpp 
dogObj := $(patsubst %.cpp,%.o,${dogCpp})