2014-09-12

Pattern rule in Makefile

最近看到一個Makefile的寫法如下:

.cpp.o: dummy
$(CXX) $(CFLAGS) -c $(SDLFLAGS) $(INCLUDE) $< -o $@

剛開始還找不到每個.cpp編譯的target,後來才發現應該是這個target。

在Makefile裡可以使用pattern rule,'%'代表的是nonempty substring,所以'%.cpp'代表的是所有結尾是'.cpp'的檔案。因此target可以寫成'%.o: %.cpp',這代表任一個'.o'的target,其dependency為同名的'.cpp',例如'abc.o: abc.cpp''test.o: test.cpp'

上面程式碼中的寫法'.cpp.o'等同'%.o: %.cpp',只是使用suffix rule來表示。因為'.cpp''.o'為Makefile認得的檔案,因此可以用suffix rule來表示。

至於'$<''$@'則為automatic variable。'$@'表示target的檔案名稱,而'$<'表示第一個dependency的檔案名稱。

如此一來這個target總算解析完成,Makefile真是博大精深。

Reference
[1] HowTo Write Generic Makefiles
[2] Defining and Redefining Pattern Rules
[3] Old-Fashioned Suffix Rules


Post a Comment