我試圖將我的整個項目轉換爲單個Makefile,但如果this紙我看到亂丟所有搜索結果,只要我有遞歸makefile問題。但是,我遇到了一個相當根本的問題,我不知道如何解決。我想爲每個Makefile模塊定義一對常見但不相同的變量。要做到這一點,我創建了一個Makefile.var
文件第一:具有作用域變量的全局Makefile
# ============================================================================
# Common aliases for local dirs
# ============================================================================
# Every make module must define WORKING_DIR :=
BIN = $(WORKING_DIR)/bin
OBJ = $(WORKING_DIR)/obj
SRC = $(WORKING_DIR)/src
DEP = $(WORKING_DIR)/obj
INC = $(WORKING_DIR)/include
INCLUDES = -I$(INC)
ALL_SRCS = $(wildcard $(SRC)/*.C)
ALL_INCS = $(wildcard $(INC)/*.h)
ALL_OBJS = $(subst $(SRC),$(OBJ),$(ALL_SRCS:%.C=%.o))
ALL_DEPS = $(subst $(SRC),$(DEP),$(ALL_SRCS:%.C=%.d))
這是在第一次在主文件中包括了Makefile.var
文件。在此之後,包含後續的makefile模塊。這是我的主人Makefile
:
include MakeModules/Makefile.var
include MakeModules/Makefile.tools
clean: $(CLEAN_LIST)
all: $(MAKE_LIST)
最後,這裏是一個模塊的樣子。爲了方便起見,我將複製並粘貼相同的模塊兩次,然後調整第二個實例的名稱。這是Makefile.tools
:
# ============================================================================
# queuing (QUE)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing
QUE_TARGET := libqueue.so
-include $(DEP)/*.d
$(QUE_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o [email protected] $(ALL_OBJS)
que-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que-clean
MAKE_LIST += $(QUE_TARGET)
# ============================================================================
# queuing2 (QUE2)
# ============================================================================
WORKING_DIR := $(TOP)/tools/queuing2
QUE2_TARGET := libqueue2.so
-include $(DEP)/*.d
$(QUE2_TARGET): $(ALL_OBJS)
$(CPP) $(CFLAGS) -shared -o [email protected] $(ALL_OBJS)
que2-clean:
-rm -f $(OBJ)/*.o $(DEP)/*.d
CLEAN_LIST += que2-clean
MAKE_LIST += $(QUE2_TARGET)
正如你所看到的,Makefile.tools
使用從Makefile.var
基礎上,WORKING_DIR
價值導出的變量。那麼,這實際上並不工作,因爲make
所做的兩階段讀數。變量WORKING_DIR
將僅採用最後一次已知的分配,並且ALL_OBJS
對於所有規則都是相同的值,無論它們位於何處。這意味着只有最後定義的模塊實際上具有正確的規則。
有沒有一種方法可以訪問常見的BIN, OBJ, SRC, ...
變量到每個模塊,而不僅僅是使用新的前綴c/ping一遍又一遍?也就是說,我可以將變量定義範圍限定在Makefile部分,然後在保留舊規則的同時更改它?我有一種瘙癢的感覺,這是不可能的,但如果我錯過了一些很好的技巧,這將很好地包裹起來,這將是非常好的。否則,這個全局Makefile的東西並不是真的可行(有一些常用變量的TONS用於從WORKING_DIR
派生值,這些變量的範圍是先前的遞歸構造)。
不要在規則的主體中重複使用'$ ALL_OBJS'。用「所有先決條件」'$ ^'代替自動變量,我相信這些規則將以您期望的方式開始工作。 (這也是一個通用的「良好生成文件」的經驗法則。)爲'OBJ' /'DEP'/etc解決這個問題。在規則體中使用更復雜(但只是一點點)。 –
這是一個很好的觀點,現在我已經改變了它。它稍微減少了問題,但它仍然不會改變在每個模塊之前定義所有這些額外的東西的需要。爲了知道某些東西依賴於哪些對象,我必須找到它的來源,這意味着我必須找到它的src目錄,這意味着我需要工作目錄。其中每一個都是每個模塊的新變量,前綴不同。 – Suedocode