[英]Writing dependencies in makefile, with makefile
基於一些SO問題 - 以及一些進一步的參考 - 我正在嘗試構建一個能夠:
$(SRC)
給出目錄,找到要編譯的.cpp
文件; .cpp
,生成.o
對象; .o
生成.so
共享對象。 make文件應該做的是:
$(SRC)
給出目錄,找到要編譯的.cpp
文件; -MM
編譯器的標志為每個.cpp
構建依賴列表; $(eval ...)
注釋/添加每個依賴項; .o
和.so
文件。 到目前為止我有什么 :我已經完成了所有的事情,除了讓它工作(:我得到的錯誤表明存在,某種程度上,空標簽''
作為依賴:
$ make make: *沒有規則來制作目標
', needed by
/home/rubens/bin/label.o'。 停止。
所以,這是我還無法運行的makefile:
# Directories
SRC := process init
BIN := $(HOME)/bin
LIB := watershed
LIBPATH := $(WATERSHED)/lib
INC := $(WATERSHED)/include $(XERCES)/include
# Paths
MPICPP := mpic++
SOURCES := $(shell find $(SRC) -name '*.cpp')
OBJECTS := $(addprefix $(BIN)/, $(notdir $(SOURCES:.cpp=.o)))
SHARED := $(OBJECTS:.o=.so)
# Flags
CFLAGS := -std=c++0x -O2 -Wall -fPIC
CFLAGS += $(foreach inc, $(INC), -I $(inc))
LFLAGS :=
LFLAGS += $(foreach lib, $(LIB), -l $(lib))
LFLAGS += $(foreach path, $(LIBPATH), -L $(lib))
# Rules
$(SHARED): | bindir
%.o:
@echo $@ -- [$<][$^][$*]
@echo $(MPICPP) $(CFLAGS) -c $< -o $@
%.so: %.o
@echo $(MPICPP) $(LFLAGS) -shared $< -o $@
bindir:
@mkdir -p $(BIN)
# Utilities
.PHONY: all clean
all: $(SHARED)
clean:
@rm -f $(OBJECTS) $(SHARED)
# Dependencies
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//')
endef
$(foreach src, $(SOURCES), $(eval $(call dependencies, $(src))))
確切似乎是錯誤的地方 :它似乎是由依賴關系生成步驟引起的,因為當我刪除任何空行時,將輸出管道輸出到grep
,如下所示:
define dependencies
$(addprefix $(BIN)/, $(notdir $(1:.cpp=.o))): \
$(shell $(MPICPP) $(CFLAGS) -MM $(1) | sed 's/^.*\.o:[ ]*//' | \
grep -v ^$)
endef
錯誤以某種方式轉換為依賴關系的空列表; 我能夠看到列表實際上是空的,規則%.o:
的echo
%.o:
- 唯一不為空的變量是$@
和$*
。
/home/rubens/bin/label.o - [] [] [/ home / rubens / bin / label]
mpic ++ -std = c ++ 0x -O2 -Wall -fPIC -I / home / rubens / libwatershed / include -I /home/rubens/xerces-c-3.1.1/include -c -o / home / rubens / bin /label.o
mpic ++ -l watershed -L -shared /home/rubens/bin/label.o -o /home/rubens/bin/label.so
有關更好的解決方法的建議是非常非常受歡迎的; 然而,在我開始使用像Cmake
或Scons
這樣的東西之前,我真的想完成這個makefile的Scons
。
-MM
已經生成了Makefile
格式的依賴項,因此您可以通過將每個*.cpp
的依賴項生成到同一個文件中來簡化這一過程,然后只需執行-include $(DEPS_FILE)
。 這比使用eval更可維護。
在makefile變量SOURCES的定義行中,搜索cpp文件,你可能需要像這樣重寫:find $(SRC)-name“* .cpp”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.