সি-সোর্স কোডটিতে "মেক" কমান্ড লাইন আর্গুমেন্ট (-D) থেকে ম্যাক্রো সংজ্ঞা কীভাবে পাস করবেন?


107

আমি সাধারণত "মেক কমান্ড লাইন" থেকে "মেকফিল" বিকল্পটি ব্যবহার করে ম্যাক্রো সংজ্ঞাগুলি পাস করি: -নাম = মান। সংজ্ঞাটি মেকফিলের অভ্যন্তরে প্রবেশযোগ্য।

আমি অনুরূপ সংকলক বিকল্পটি ব্যবহার করে "মেকফিল" থেকে "উত্স কোড" তে ম্যাক্রো সংজ্ঞাগুলিও পাস করি: -নাম = মান (বহু সংকলকগুলিতে সমর্থিত)। এই সংজ্ঞাটি সোর্স কোডে অ্যাক্সেসযোগ্য।

আমার এখন যা দরকার তা হ'ল আমার মেকফিলের ব্যবহারকারীর মেকফিলের কোনও পরিবর্তন না করেই "Make.exe কমান্ডলাইন" থেকে "উত্স কোড" তে স্বেচ্ছাসেবী ম্যাক্রো সংজ্ঞাগুলি পাস করার অনুমতি দেওয়া।

সুতরাং ব্যবহারকারী টাইপ করতে পারেন: মেক -f mymakefile.mk -SomeOPTION var = 5

তারপরে সরাসরি কোড মেইন.সি.টি দেখতে পাবে:

int main()
{
  int i = var;
}

15
ডাউনটা কেন? আমার কাছে একেবারে বৈধ প্রশ্নের মতো মনে হচ্ছে।
টমাস

উত্তর:


99

makeএইভাবে কমান্ড কল করুন :

make CFLAGS=-Dvar=42

এবং $(CFLAGS)মেকফাইলে আপনার সংকলন কমান্ডটি ব্যবহার করতে ভুলবেন না । যেমন @ জর্জেনসেন উল্লেখ করেছেন, ভেরিয়েবল অ্যাসাইনমেন্টটি makeকমান্ডের পরে রাখলে মেকফাইলে CFLAGSইতিমধ্যে সংজ্ঞায়িত মানটি ওভাররাইড হয়ে যায় ।

বিকল্পভাবে আপনি সম্পূর্ণরূপে ওভাররাইডিং এড়ানোর জন্য এই ভেরিয়েবলটিকে আবার ব্যবহার করতে পারেন এবং তার -Dvar=42পরিবর্তে অন্য পরিবর্তনশীলকে সেট করতে পারেন ।CFLAGSCFLAGSCFLAGS


8
আপনি "CFLAGS = $ (CFLAGS) -ওয়াল" ব্যবহার করতে পারবেন না; এটি একটি পুনরাবৃত্ত সংজ্ঞা হবে এবং মেকিং এটির অনুমতি দেয় না। আপনি "CFLAGS: = $ (CFLAGS) -Wall", বা "CFLAGS + = -Wall" ব্যবহার করতে পারেন তবে কমান্ড লাইনে একটি অ্যাসাইনমেন্টের অগ্রাধিকার রয়েছে বলে সেগুলি কাজ করবে না। আপনি "ওভাররাইড সিএফএলএগএস + = -ওয়াল" ব্যবহার করতে পারেন, তবে সাধারণত আমরা আপনাকে অভ্যন্তরীণভাবে বিভিন্ন ভেরিয়েবল চয়ন করার পরামর্শ দিই। জিএনইউ কোডিং স্ট্যান্ডার্ডগুলির জন্য ব্যবহারকারীর জন্য সিএফএলএজিএস ইত্যাদি থাকা দরকার এবং মেকফিলগুলি "স্থানীয়_সিএফএলএজিএস = $ (সিএফএলএজিএস) -ওয়াল" এর মতো আরেকটি পরিবর্তনশীল চয়ন করে।
ম্যাড সায়েন্টিস্ট 30'12

2
কেবলমাত্র @ ম্যাড সায়েন্টিস্ট নোটে যুক্ত করতে, জিএনইউ কোডিং স্ট্যান্ডার্ডগুলিও জানিয়েছে যে $(CFLAGS)শেষ হওয়া উচিত, যাতে কোনও ব্যবহারকারী দ্বারা নির্দিষ্ট কোনও বিকল্প অভ্যন্তরীণভাবে মেকফিল সেটগুলির যে কোনও কিছুকে ওভাররাইড করে। যে যেমন ব্যবহার মানে হবে local_CFLAGS = -Wall $(CFLAGS)। বিপরীতে, যদি আপনি সত্যিই কিছুটা অগ্রাধিকার নিতে চান তবে $(CFLAGS)@ ম্যাডসায়েন্টিস্টের মন্তব্যে এটি পরে রাখুন।
স্যাম

1
এর দ্বারা একাধিক ম্যাক্রো সেট করবেন কীভাবে?
উডি হুয়াং

2
উদাহরণস্বরূপ CFLAGS="-Dvar1=42 -Dvar2=314"
@ উডিহুয়াং

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

কারণ আপনি নিজের মেকফিলের সিএফএলএজিএসকে ওভাররাইড করতে চান না, এবং কেবল পরিবেশটি নয় (যা মেকফিল ভেরিয়েবলগুলির ক্ষেত্রে কম অগ্রাধিকার রয়েছে)।


6

স্বল্প খ্যাতির কারণে, আমি গৃহীত উত্তরের মন্তব্য করতে পারি না।

আমি পূর্বনির্ধারিত পরিবর্তনশীল উল্লেখ করতে চাই CPPFLAGS। এটা তোলে চেয়ে ভাল হইয়া উপস্থাপন করা হতে পারে 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
সব:
    প্রতিধ্বনি OP (বিকল্প)
$ Make -f x.mak 'অপশন = -DPASSTOC = 42'
প্রতিধ্বনি -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

প্রশ্নটি হ'ল মেক কমান্ডলাইন থেকে সরাসরি সি উত্স কোডটিতে "মেকফিল পরিবর্তন না করে" স্বেচ্ছাসেবী সংজ্ঞাগুলি পাঠানো। সুতরাং আমি আমার মেকফিলটি একবারে পরিবর্তন করতে চেয়েছিলাম those স্বেচ্ছাসেবী সংজ্ঞাগুলি তৈরি করতে দেওয়া।
মোহাম্মদজেজ

মেক করার জন্য কাজ করে না। এটি মেক -DMAKE_DEFINE = 11 বলে অবৈধ বিকল্প says
রামকৃষ্ণান কান্নান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.