จะส่งผ่านนิยามมาโครจากอาร์กิวเมนต์บรรทัดคำสั่ง“ make” (-D) ไปยังซอร์สโค้ด C ได้อย่างไร


107

ฉันมักจะส่งผ่านคำจำกัดความของมาโครจาก "make command line" ไปยัง "makefile" โดยใช้ตัวเลือก: -Dname = value คำจำกัดความสามารถเข้าถึงได้ภายใน makefile

ฉันยังส่งผ่านนิยามมาโครจาก "makefile" ไปยัง "ซอร์สโค้ด" โดยใช้ตัวเลือกคอมไพเลอร์ที่คล้ายกัน: -Dname = value (รองรับในคอมไพเลอร์จำนวนมาก) คำจำกัดความนี้สามารถเข้าถึงได้ในซอร์สโค้ด

สิ่งที่ฉันต้องการในตอนนี้คืออนุญาตให้ผู้ใช้ makefile ของฉันสามารถส่งผ่านนิยามมาโครโดยพลการจาก "make.exe commandline" ไปยัง "source code" ได้ทันทีโดยไม่ต้องเปลี่ยนแปลงอะไรใน makefile

เพื่อให้ผู้ใช้สามารถพิมพ์: make -f mymakefile.mk -SOMEOPTION var = 5

จากนั้นรหัส main.c โดยตรงสามารถดู var:

int main()
{
  int i = var;
}

15
ทำไมต้องโหวตลง? ดูเหมือนคำถามที่ถูกต้องสำหรับฉัน
โทมัส

คำตอบ:


99

เรียกmakeคำสั่งด้วยวิธีนี้:

make CFLAGS=-Dvar=42

และอย่าลืมใช้$(CFLAGS)ในคำสั่งคอมไพล์ของคุณใน Makefile ดังที่ @ jørgensenกล่าวไว้การวางการกำหนดตัวแปรหลังmakeคำสั่งจะแทนที่CFLAGSค่าที่กำหนดไว้แล้วใน Makefile

หรือคุณสามารถตั้งค่า-Dvar=42ในตัวแปรอีกกว่าCFLAGSแล้วนำมาใช้ในตัวแปรนี้เพื่อหลีกเลี่ยงการเอาชนะสมบูรณ์CFLAGSCFLAGS


8
คุณไม่สามารถใช้ "CFLAGS = $ (CFLAGS) -Wall"; นี่จะเป็นคำจำกัดความแบบวนซ้ำและ make ไม่อนุญาตให้ทำเช่นนี้ คุณสามารถใช้ "CFLAGS: = $ (CFLAGS) -Wall" หรือ "CFLAGS + = -Wall" แต่จะไม่ได้ผลเช่นกันเนื่องจากการมอบหมายในบรรทัดคำสั่งมีลำดับความสำคัญสูงกว่า คุณสามารถใช้ "override CFLAGS + = -Wall" ได้ แต่โดยทั่วไปเราขอแนะนำให้คุณเลือกตัวแปรภายใน มาตรฐานการเข้ารหัส GNU ต้องใช้ CFLAGS และอื่น ๆ สำหรับผู้ใช้และ makefiles เลือกตัวแปรอื่นเช่น "local_CFLAGS = $ (CFLAGS) -Wall"
MadScientist

2
เพียงเพื่อเพิ่มในบันทึกย่อของ @MadScientist มาตรฐานการเข้ารหัส GNU ยังระบุว่า$(CFLAGS)ควรจะมาเป็นลำดับสุดท้ายเพื่อให้ตัวเลือกใด ๆ ที่ผู้ใช้ระบุจะแทนที่สิ่งที่ Makefile ตั้งค่าไว้ภายใน local_CFLAGS = -Wall $(CFLAGS)นั่นก็หมายถึงการใช้เช่น ในทางกลับกันหากมีบางสิ่งที่คุณต้องการให้มีความสำคัญมากกว่านั้นให้ใส่ไว้$(CFLAGS)ในความคิดเห็นของ @MadScientist
แซม

1
จะตั้งค่ามาโครหลายตัวตามนี้ได้อย่างไร?
Woody Huang

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

เนื่องจากคุณต้องการแทนที่ CFLAGS ของ Makefile ของคุณไม่ใช่แค่สภาพแวดล้อมเท่านั้น (ซึ่งมีลำดับความสำคัญต่ำกว่าสำหรับตัวแปร Makefile)


7

เนื่องจากชื่อเสียงต่ำฉันไม่สามารถแสดงความคิดเห็นในคำตอบที่ยอมรับได้

CPPFLAGSผมอยากจะพูดถึงตัวแปรที่กำหนดไว้ล่วงหน้า อาจแสดงถึงความพอดีมากกว่าCFLAGSหรือCXXFLAGSเนื่องจากคู่มือGNU Makeอธิบายไว้ว่า:

แฟล็กพิเศษเพื่อมอบให้กับตัวประมวลผลก่อนหน้า C และโปรแกรมที่ใช้ (คอมไพเลอร์ C และ Fortran)

ตัวอย่างของกฎโดยนัยในตัวที่ใช้ CPPFLAGS

  • n.oทำโดยอัตโนมัติจากn.cสูตรของแบบฟอร์ม:
    • $(CC) $(CPPFLAGS) $(CFLAGS) -c
  • n.oจะทำโดยอัตโนมัติจากn.cc, n.cppหรือn.Cสูตรของรูปแบบ:
    • $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c

หนึ่งจะใช้คำสั่ง make CPPFLAGS=-Dvar=123เพื่อกำหนดมาโครที่ต้องการ

ข้อมูลเพิ่มเติม


1
$ แมว x.mak
ทั้งหมด:
    เสียงสะท้อน $ (OPTION)
$ make -f x.mak 'OPTION = -DPASSTOC = 42'
เสียงสะท้อน -DPASSTOC = 42
-DPASSTOC = 42

-4

ค้นหาไฟล์ C และการใช้งาน Makefile ด้านล่างเพื่อตอบสนองความต้องการของคุณ

foo.c

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

Makefile

all:
    gcc -DMAKE_DEFINE=11 foo.c

คำถามคือการส่งผ่านคำจำกัดความโดยพลการจากบรรทัดคำสั่ง make โดยตรงไปยังซอร์สโค้ด C "โดยไม่ต้องเปลี่ยน makefile" ดังนั้นฉันจึงต้องการเปลี่ยน makefile ของฉันสักครั้งเพื่อให้สามารถสร้างคำจำกัดความเหล่านั้นได้ตามอำเภอใจ
MohamedEzz

ไม่ทำงานสำหรับ make นั่นคือ make -DMAKE_DEFINE = 11 บอกว่าตัวเลือกไม่ถูกต้อง
รามกฤ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.