"स्रोत" कमांड लाइन तर्क (-D) से C स्रोत कोड तक मैक्रो परिभाषा कैसे पास करें?


107

मैं आमतौर पर विकल्प का उपयोग करते हुए "मेक लाइन" से "मेकफाइल" तक मैक्रो परिभाषाओं को पास करता हूं: -डैम = मान। परिभाषा मेकफिल के अंदर उपलब्ध है।

मैं इसी तरह के संकलक विकल्प का उपयोग करके "मेकफाइल" से "स्रोत कोड" तक मैक्रो परिभाषाओं को भी पास करता हूं: -Dname = मूल्य (कई संकलक में समर्थित)। स्रोत कोड में यह परिभाषा सुलभ है।

अब मुझे क्या चाहिए, मेरे मेकफाइल के उपयोगकर्ता को "मेकिंग। कमांडलाइन" से "सोर्स कोड" तक मनमानी मैक्रो परिभाषाओं को पास करने में सक्षम होने की अनुमति है, बिना मेकफाइल में कुछ भी बदलने के लिए।

इसलिए उपयोगकर्ता टाइप कर सकता है: make -f mymakefile.mk -SOMEOPTION var = 5

फिर सीधे कोड main.c var देख सकते हैं:

int main()
{
  int i = var;
}

15
क्यों होता है पतन? मुझे पूरी तरह से वैध प्रश्न लगता है।
थॉमस

जवाबों:


99

makeइस तरह से कॉल कमांड:

make CFLAGS=-Dvar=42

और $(CFLAGS)Makefile में अपने संकलित कमांड का उपयोग करना सुनिश्चित करें । जैसा कि @ jrrgensen ने उल्लेख किया है, makeकमांड के बाद वैरिएबल असाइनमेंट डालने से CFLAGSपहले से ही मेकफाइल परिभाषित मूल्य को ओवरराइड करेगा ।

वैकल्पिक रूप से आप -Dvar=42दूसरे चर में सेट कर सकते हैं CFLAGSऔर फिर CFLAGSपूरी तरह से ओवरराइडिंग से बचने के लिए इस चर का पुन: उपयोग करें CFLAGS


8
आप "CFLAGS = $ (CFLAGS) -Wall" का उपयोग नहीं कर सकते हैं; यह एक पुनरावर्ती परिभाषा होगी और इसे इसकी अनुमति नहीं देता है। आप "CFLAGS: = $ (CFLAGS) -Wall", या "CFLAGS + = -Wall" का उपयोग कर सकते हैं, लेकिन वे या तो काम नहीं करेंगे, क्योंकि कमांड लाइन पर एक असाइनमेंट की उच्च मिसाल है। आप "ओवरराइड CFLAGS + = -Wall" का उपयोग कर सकते हैं, लेकिन आमतौर पर हम आपको आंतरिक रूप से अलग-अलग चर चुनने की सलाह देते हैं। GNU कोडिंग मानकों के लिए उपयोगकर्ता के लिए CFLAGS आदि की आवश्यकता होती है, और मेकफाइल्स एक अन्य चर का चयन करते हैं, जैसे "local_CFLAGS = $ (CFLAGS) -Wall"।
मैडिसटिसिस्ट

2
बस @MadScientist नोट में जोड़ने के लिए, GNU कोडिंग मानक भी कहते हैं कि $(CFLAGS)अंतिम आना चाहिए, ताकि उपयोगकर्ता द्वारा निर्दिष्ट कोई भी विकल्प आंतरिक रूप से मेकफाइल सेट के कुछ भी ओवरराइड कर सके। इसका मतलब है कि उदाहरण के लिए local_CFLAGS = -Wall $(CFLAGS)। इसके विपरीत, अगर वहाँ कुछ है जो आप वास्तव में पूर्वता लेना चाहते हैं, तो इसे बाद $(CFLAGS)में रखें, जैसा कि @MadScientist टिप्पणी में है।
सैम

1
इसके द्वारा कई मैक्रोज़ कैसे सेट करें?
वुडी हुआंग

2
@WoodyHuang उदाहरण के लिएCFLAGS="-Dvar1=42 -Dvar2=314"
ouah

1
CPPFLAGSइससे बेहतर फिट का प्रतिनिधित्व कर सकता है CFLAGSया CXXFLAGS: stackoverflow.com/a/53527858/2278206
psq

11

बस उसके लिए एक विशिष्ट चर का उपयोग करें।

$ cat Makefile 
all:
    echo foo | gcc $(USER_DEFINES) -E -xc - 

$ make USER_DEFINES="-Dfoo=one"
echo foo | gcc -Dfoo=one -E -xc - 
...
one

$ make USER_DEFINES="-Dfoo=bar"
echo foo | gcc -Dfoo=bar -E -xc - 
...
bar

$ make 
echo foo | gcc  -E -xc - 
...
foo

10

इस तरह से कॉल करें

make CFLAGS=-Dvar=42

क्योंकि आप अपने Makefile के CFLAGS को ओवरराइड करना चाहते हैं, न कि केवल पर्यावरण (जिसमें Makefile चर के संबंध में कम प्राथमिकता है)।


6

कम प्रतिष्ठा के कारण, मैं स्वीकृत उत्तर पर टिप्पणी नहीं कर सकता।

मैं पूर्वनिर्धारित चर का उल्लेख करना चाहूंगा CPPFLAGS। यह GNU मेक मैनुअल के रूप में वर्णित के बाद से CFLAGSया इससे बेहतर फिट का प्रतिनिधित्व कर सकता है :CXXFLAGS

सी पूर्वप्रक्रमक और इसे (सी और फोरट्रान संकलक) का उपयोग करने वाले कार्यक्रमों को देने के लिए अतिरिक्त झंडे।

अंतर्निहित अंतर्निहित नियमों के उदाहरण जो उपयोग करते हैं CPPFLAGS

  • n.on.cफ़ॉर्म की एक रेसिपी से स्वचालित रूप से बनाया जाता है :
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.oसे स्वचालित रूप से किया जाता है n.cc, n.cppया n.Cप्रपत्र की एक नुस्खा के साथ:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

एक make CPPFLAGS=-Dvar=123वांछित मैक्रो को परिभाषित करने के लिए कमांड का उपयोग करेगा ।

और जानकारी


1
$ बिल्ली x.mak
सब:
    इको $ (विकल्प)
$ मेक -f x.mak 'विकल्प = -DPASSTOC = 42'
echo -DPASSTOC = 42
-DPASSTOC = 42

-4

अपनी आवश्यकताओं को पूरा करने के लिए नीचे सी फ़ाइल और मेकफाइल कार्यान्वयन का पता लगाएं

foo.c

 main ()
    {
        int a = MAKE_DEFINE;
        printf ("MAKE_DEFINE value:%d\n", a);
    }

makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

सवाल यह है कि मेकलाइन से सीधे सी सोर्स कोड में "बिना मेकफाइल बदले" से मनमानी परिभाषाएं पारित की जाएं। इसलिए मैं एक बार अपने मेकफाइल को बदलना चाहता था, ताकि उन मनमाने परिभाषाओं को बनाया जा सके।
मोहम्मदीज

बनाने के लिए काम नहीं करता है। यह है कि -DMAKE_DEFINE = 11 अमान्य विकल्प कहता है।
रामकृष्णन कन्नन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.