अधिकांश उत्तर आश्चर्यजनक रूप से जटिल या गलत हैं। हालाँकि सरल और मजबूत उदाहरण कहीं और पोस्ट किए गए हैं [ कोडरेव्यू ]। निश्चित रूप से ग्नू प्रीप्रोसेसर द्वारा उपलब्ध कराए गए विकल्प थोड़े भ्रमित करने वाले हैं। हालाँकि, बिल्ड टारगेट से सभी डाइरेक्टरीज़ -MM
को डॉक्यूमेंट किया गया है, न कि बग [ gpp ]:
डिफ़ॉल्ट रूप से सीपीपी मुख्य इनपुट फ़ाइल का नाम लेता है, किसी भी
निर्देशिका घटकों को हटाता है और किसी भी फ़ाइल प्रत्यय जैसे '.c' को हटाता है , और प्लेटफ़ॉर्म के सामान्य ऑब्जेक्ट प्रत्यय को जोड़ता है।
(कुछ नया) -MMD
विकल्प शायद वही है जो आप चाहते हैं। एक पूर्णता का एक उदाहरण के लिए जो कई src dirs का समर्थन करता है और कुछ टिप्पणियों के साथ dirs का निर्माण करता है। बिल्ड डायर के बिना एक सरल संस्करण के लिए [ कोडरेव्यू ] देखें ।
CXX = clang++
CXX_FLAGS = -Wfatal-errors -Wall -Wextra -Wpedantic -Wconversion -Wshadow
# Final binary
BIN = mybin
# Put all auto generated stuff to this build dir.
BUILD_DIR = ./build
# List of all .cpp source files.
CPP = main.cpp $(wildcard dir1/*.cpp) $(wildcard dir2/*.cpp)
# All .o files go to build dir.
OBJ = $(CPP:%.cpp=$(BUILD_DIR)/%.o)
# Gcc/Clang will create these .d files containing dependencies.
DEP = $(OBJ:%.o=%.d)
# Default target named after the binary.
$(BIN) : $(BUILD_DIR)/$(BIN)
# Actual target of the binary - depends on all .o files.
$(BUILD_DIR)/$(BIN) : $(OBJ)
# Create build directories - same structure as sources.
mkdir -p $(@D)
# Just link all the object files.
$(CXX) $(CXX_FLAGS) $^ -o $@
# Include all .d files
-include $(DEP)
# Build target for every single object file.
# The potential dependency on header files is covered
# by calling `-include $(DEP)`.
$(BUILD_DIR)/%.o : %.cpp
mkdir -p $(@D)
# The -MMD flags additionaly creates a .d file with
# the same name as the .o file.
$(CXX) $(CXX_FLAGS) -MMD -c $< -o $@
.PHONY : clean
clean :
# This should remove all generated files.
-rm $(BUILD_DIR)/$(BIN) $(OBJ) $(DEP)
यह विधि काम करती है क्योंकि यदि किसी एकल लक्ष्य के लिए कई निर्भरता रेखाएँ हैं, तो निर्भरताएँ बस शामिल हो जाती हैं, जैसे:
a.o: a.h
a.o: a.c
./cmd
के बराबर है:
a.o: a.c a.h
./cmd
जैसा कि उल्लेख किया गया है: एकल लक्ष्य के लिए मेकफाइल कई निर्भरता लाइनें?