簡體   English   中英

使用makefile在makefile中編寫依賴項

[英]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

有關更好的解決方法的建議是非常非常受歡迎的; 然而,在我開始使用像CmakeScons這樣的東西之前,我真的想完成這個makefile的Scons

-MM已經生成了Makefile格式的依賴項,因此您可以通過將每個*.cpp的依賴項生成到同一個文件中來簡化這一過程,然后只需執行-include $(DEPS_FILE) 這比使用eval更可維護。

在makefile變量SOURCES的定義行中,搜索cpp文件,你可能需要像這樣重寫:find $(SRC)-name“* .cpp”

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM