QMake

2010-08-31 13 views
13

से एक प्रोग्राम/स्क्रिप्ट चला रहा है हमारे पास काफी बड़ा कोड-बेस है। कोड का विशाल बहुमत मेकफ़ाइल बनाने के लिए qmake का उपयोग करके संकलित किया जाता है। हालांकि, कुछ उप-परियोजनाएं हैं जो बैच फ़ाइलों को चलाकर या अन्य प्रोग्राम चलाकर उत्पादित होती हैं।QMake

मैं qmake का उपयोग करके संकलित सब कुछ प्राप्त करने में सक्षम होना चाहता हूं, लेकिन मैं समझ नहीं सकता कि क्यूमेक को आसानी से स्क्रिप्ट चलाने के लिए कैसे प्राप्त किया जाए।

एक बात है कि मैं कोशिश की है मेरे समर्थक फ़ाइल में QMAKE_EXTRA_TARGETS उपयोग कर रहा है, इसलिए जैसे:

# do the real work here 
# ... 
# create placeholder.cpp so qmake and nmake are happy 
echo // dummy >> placeholder.cpp 
:

TEMPLATE = lib 
SOURCES = placeholder.cpp 
CONFIG += no_link staticlib 
batch_runner.target = placeholder.cpp 
batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS = batch_runner 

मैं तो इतना तरह बैच फ़ाइल उपज placeholder.cpp करना होगा

यह ठीक काम करता प्रतीत होता है। मुसीबत यह है कि यह कुछ हकी है। अगर मैं batch_runner.target निर्दिष्ट नहीं करता हूं (यानी मैं इसे खाली छोड़ देता हूं) या SOURCES में placeholder.cpp नहीं डालता है तो बैच फ़ाइल कभी नहीं चलती है। ऐसा इसलिए है क्योंकि qmake batch_runner.com मेकफ़ाइल में किसी भी अन्य निर्भरता के लिए कार्रवाई नहीं कर रहा है।

क्या मेकफ़ाइल बनाने के लिए क्यूमेक प्राप्त करने का कोई बेहतर तरीका है कि मेकफ़ाइल निष्पादित होने पर एक स्क्रिप्ट चलती है?

उत्तर

14

ऐसा लगता है कि QMAKE_POST_LINK बात की इस तरह के लिए अच्छी तरह से काम करता है।

ऐसा लगता है कि यह काम पूरा हो गया है। my_batch_file.bat चलाता है जब nmake चलता है (क्यूमेक रन के बजाए) और मुझे प्लेसहोल्डर लक्ष्य या फ़ाइलों के साथ कुछ भी मज़ेदार करने की आवश्यकता नहीं है।

यह काफी संभावना है कि मुझे 'CONFIG' में सूचीबद्ध सभी वस्तुओं की आवश्यकता नहीं है।

TEMPLATE = aux 
OBJECTS_DIR = ./ 
DESTDIR = ./ 

first.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += first 
QMAKE_CLEAN += batch_output.obj 

टेम्पलेट aux मूल रूप से एक makefile जो जब एक लक्ष्य निर्धारित किए बिना चलाने के कुछ नहीं करता है का उत्पादन:

TEMPLATE = lib 
TARGET = 
CONFIG += no_link target_predeps staticlib 

QMAKE_POST_LINK = my_batch_file.bat 
QMAKE_CLEAN  += batch_output.obj 
6

system() command आज़माएं। उदाहरण के लिए:

system(pwd) 
+1

दिलचस्प। यह काम करता है, लेकिन 'nmake' चलाने के बजाए 'qmake' चलाए जाने पर आदेश चलाया जाता है। इसे वास्तव में चलाने के बजाए तीन बार दौड़ना भी होता है। –

+1

आपको यह सुनिश्चित करने के लिए कुछ गुंजाइश जोड़नी पड़ सकती है कि यह केवल एक बार चलती है। –

+0

मैंने अभी उदाहरण के लिए दायरा जोड़ा है ताकि कमांड केवल एक बार चलाया जा सके जब qmake चलाया जाता है। – pixelgrease

1

आप एक ही makefile से भी, कई विभिन्न लक्ष्यों को चलाने के लिए subdirs विन्यास इस्तेमाल कर सकते हैं। यह आपके अतिरिक्त लक्ष्यों के साथ विशेष रूप से अच्छी तरह से काम कर सकता है, क्योंकि सबडियर कॉन्फ़िगरेशन मेकफ़ाइल में चलाने के लिए एक विशिष्ट लक्ष्य निर्दिष्ट कर सकता है (विवरण के लिए undocumented qmake देखें)। इस मामले में, मैं सभी "नियमित" निर्माण आदेशों को एक .pro फ़ाइल में डालता हूं, बाहरी निर्माण आदेश दूसरे में, और subdirs .pro फ़ाइल उन सभी को बनाने के लिए। मैंने इस तरह कुछ भी परीक्षण नहीं किया है, लेकिन यह काम करना चाहिए।

regular.pro:

SOURCES += main.cpp 
TARGET = regular.exe 

external.pro:

batch_runner.commands = my_batch_file.bat 
QMAKE_EXTRA_TARGETS += batch_runner 

other_runner.commands = other_batch_file.bat 
QMAKE_EXTRA_TARGETS += other_runner 

do_it_all.pro:

TEMPLATE = subdirs 
CONFIG += ordered 

regular.file = regular.pro 
SUBDIRS += regular 

batch.file = external.pro 
batch.target = batch_runner 
SUBDIRS += batch 

other.file = external.pro 
other.target = other_runner 
SUBDIRS += other 
+0

यह वही समस्या है जिसे मैंने अपने मूल प्रश्न में उल्लिखित किया है। अतिरिक्त लक्ष्य तब तक नहीं चलेगा जब तक कि लक्ष्य निर्दिष्ट नहीं किया जाता है (आप केवल आदेश निर्दिष्ट नहीं कर सकते हैं) और .target को मेकफ़ाइल के किसी अन्य भाग द्वारा वास्तव में आवश्यक होने की आवश्यकता है, अन्यथा यह नहीं चलेगा। –

5

यहाँ एक और उपाय है।OBJECTS_DIR और DESTDIR चर को वर्तमान निर्देशिका में सेट किया गया है ताकि यह सुनिश्चित किया जा सके कि qmake debug और release निर्देशिकाएं बनाता है (उन्हें ./ पर सेट करना और केवल . पर नहीं, कम से कम विंडोज़ पर सेट करना महत्वपूर्ण है)। फिर, QMAKE_EXTRA_TARGETS का उपयोग करते हुए, जब हम लक्ष्य के बिना मेकफ़ाइल आक्रमण करते हैं तो कस्टम आदेश चलाने के लिए हम लक्ष्य first को फिर से परिभाषित करते हैं।

यह थोड़ा हैकी है लेकिन यह काम पूरा हो जाता है।

अलावा: आप तीन makefiles (Makefile, Makefile.Debug, Makefile.Release) की पीढ़ी को रोकने के लिए चाहते हैं, आप

CONFIG -= debug_and_release 

जोड़ सकते हैं हालांकि, अगर आप कैसे makefile है पर इस और आधार का उपयोग "मूलभूत निर्देशिका के" subdirs "* .pro फ़ाइल, ... द्वारा नकली, हमेशा मैन्युअल रूप से बुलाया जाता है,)," लक्ष्य बनाने के लिए कोई नियम ... "त्रुटियों से बचने के लिए नकली debug और release लक्ष्य बनाना आवश्यक हो सकता है। उदाहरण के लिए:

release.target = release 
release-clean.target = release-clean 
release-install.target = release-install 
[...] 
debug.target = debug 
debug-clean.target = debug-clean 
debug-install.target = debug-install 
[...] 
QMAKE_EXTRA_TARGETS += release release-clean release-install [...] 
QMAKE_EXTRA_TARGETS += debug debug-clean debug-install [...] 
संबंधित मुद्दे