2010-08-26 9 views
7

क्या किसी को ऐसे टूल के बारे में पता है जो स्रोत फ़ाइलों के लिए निर्देशिका स्कैन करके मेकफ़ाइल उत्पन्न करता है?सरल मेकफ़ाइल पीढ़ी उपयोगिता?

यह अनुभवहीन हो सकता है:

  • बाहरी निर्भरता
  • उपयोग डिफ़ॉल्ट संकलक/लिंकर सेटिंग्स

उत्तर

8

आप एक Makefile है कि आप के लिए यह करता है लिख सकते हैं:

SOURCES=$(shell find . -name "*.cpp") 
OBJECTS=$(SOURCES:%.cpp=%.o) 
TARGET=foo 

.PHONY: all 
all: $(TARGET) 

$(TARGET): $(OBJECTS) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

.PHONY: clean 
clean: 
     rm -f $(TARGET) $(OBJECTS) 

बस अपने स्रोत पदानुक्रम के रूट निर्देशिका में यह जगह है और make चले (आप इस के लिए GNU Make काम करना होगा)।

(ध्यान दें कि मैं Makefile ish में धाराप्रवाह नहीं कर रहा हूँ तो शायद यह आसान किया जा सकता है।)

+2

फ़ाइलों को खोजने के लिए वाइल्डकार्ड फ़ंक्शन भी बनाते हैं। –

+1

+1 चीजों के लिए मानक नामों का उपयोग क्यों न करें। और मानक नियम लक्ष्य के लिए काम करेंगे, विशेष कुछ भी करने की आवश्यकता नहीं है। –

+0

@ मार्टिन: मैंने लक्ष्य के लिए एक निहित नियम का उपयोग करने की कोशिश की लेकिन सफल नहीं हुआ :) यह केवल तभी संभव लगता है जब स्रोत फ़ाइलों में से एक को '$ (TARGET) .cpp' नाम दिया गया हो। "चीजों के लिए मानक नाम" के साथ आपका क्या मतलब है? – Job

3

वहाँ एक बहुत पुरानी स्क्रिप्ट 'makedepend' कहा जाता है कि बहुत बनाने के लिए इस्तेमाल है पता लगाने के लिए कोई जरूरत नहीं सरल मेकफ़ाइल। मैंने तब से लगभग सभी चीज़ों के लिए cmake पर स्विच कर लिया है।

यहां विकी आलेख http://en.wikipedia.org/wiki/Makedepend है, नीचे दिए गए विकल्प की सूची नोट करें जिसमें ऑटोमेक में डिप्लोप और जीसीसी में -एम फ्लैग शामिल है।

संपादित करें: जैसा कि किसी ने मुझे किसी अन्य प्रश्न में इंगित किया है, gcc -MM *.cpp > Makefile एक बेहतर सरल मेकफ़ाइल उत्पन्न करता है। आप केवल अपने CPPFLAGS और पूरे द्विआधारी के निर्माण के लिए एक नियम ... जो फार्म ले जाएगा पहले जोड़ें करने के लिए है:

CPPFLAGS=-Wall 
LDFLAGS=-lm 
all: binary_name 
binary_name: foo.o bar.o baz.o biff.o 
+0

ओपी क्या करता है यह कैसे करता है? AFAIK, 'makedepend' सिर्फ निर्भरताओं को उत्पन्न करता है, फाइलों को बनाने के नियम नहीं। – Job

+0

makedepend का संस्करण मैं वास्तव में एक कार्यात्मक मेकफ़ाइल बनाया के साथ खेल रहा था। – jkerian

+0

99% समय, निहित नियम अंतिम बाइनरी को छोड़कर सबकुछ संभालेंगे। – jkerian

7

CMake यह करता है और यह और भी makefiles और दृश्य स्टूडियो परियोजनाओं बनाता है।

file(GLOB sources *.h *.c *.cxx *.cpp *.hxx) 
add_executable(Foo ${sources}) 

फिर एक साफ निर्देशिका में जाकर टाइप करें:: पर

cmake /path/to/project/ 

makefiles पैदा करेगा कि http://www.cmake.org/

आपको बस इतना करना follwing लाइनों से युक्त एक CMakeLists.txt फ़ाइल पैदा कर रही है की जरूरत है

वह स्वच्छ निर्माण निर्देशिका।

1
  • बाहरी निर्भरता पता लगाने के लिए कोई जरूरत नहीं
  • उपयोग डिफ़ॉल्ट संकलक/लिंकर सेटिंग्स

फिर स्क्रिप्ट क्यों? बशर्ते कि अपने सभी परियोजना स्रोत फ़ाइलों *.cpp कर रहे हैं और मौजूदा निर्देशिका में:

all: $(notdir $(CURDIR)) 
$(notdir $(CURDIR)): $(subst .cpp,.o,$(wildcard *.cpp)) 
     $(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

Makefile वर्तमान निर्देशिका का नाम के नाम पर एक निष्पादन में डिफ़ॉल्ट संकलक/लिंकर सेटिंग्स के साथ सभी स्रोत फ़ाइलों का निर्माण होगा।

अन्यथा, मैं आमतौर पर लोगों को यह सलाह देता हूं कि यह SCons है जहां यह बहुत आसान और सहज है।जोड़ा गया बोनस कि मैन्युअल रूप से clean लक्ष्य कोड करने की कोई आवश्यकता नहीं है, स्रोत/हेडर निर्भरता जांच अंतर्निहित है, यह मूल रूप से रिकर्सिव है और उचित पुस्तकालयों का समर्थन करता है।

5

यह है कि मैं क्या एक साधारण परियोजना के लिए प्रयोग करेंगे है:

CC    = $(CXX) 
CXXFLAGS  += -ansi -pedantic -W -Wall -Werror 
CPPFLAGS  += -I<Dir Where Boost Lives> 


SOURCES   = $(wildcard *.cpp) 
OBJECTS   = $(patsubst %.cpp,%.o,$(SOURCES)) 

all:    myApp 
myApp:   $(OBJECTS) 

केवल प्रतिबंध यह है कि आप एक निष्पादन MyApp कहा जाता है का निर्माण कर रहे है, तो है। फिर स्रोत फ़ाइलों में से एक को myApp.cpp नाम दिया जाना चाहिए (जहां मैं मुख्य डालता हूं)।

+0

+1 एक साधारण टेम्पलेट मेकफ़ाइल से शुरू करना आईएमओ का बुरा विचार नहीं है। मुझे नहीं पता कि तुमने इसे क्यों कम करने का फैसला किया। – StackedCrooked

+0

जीएनयू कम से कम करने के लिए, फ़ंक्शन $ (वाइल्डकार्ड) $ (वाइल्डकार्ड) नहीं है –

0

जैसा कि discussion से जुड़ा हुआ है, HWUT एक उपकरण है जो सुंदर मेकफ़ाइल उत्पन्न कर सकता है, निर्भरताओं की खोज कर रहा है और निर्देशिकाओं में फ़ाइलों को शामिल कर सकता है। विंडोज़ पर आपको मिनीजीडब्ल्यू और सीटैग स्थापित करने की आवश्यकता है। लिनक्स जीसीसी और सीटीएजी के तहत सबसे अधिक संभावना मौजूद है। यह ओपनसोर्स और उपयोग करने के लिए स्वतंत्र है।

विशेष रूप से, खराब समेकन के साथ कुछ बड़ी परियोजनाओं के कुछ पहले से मौजूद मॉड्यूल के लिए यूनिट टेस्ट जेनरेट करते समय, यह feautures आपको आसानी से घंटे या दिन बचाता है।