คำถามติดแท็ก makefile

makefile เป็นไฟล์อินพุตสำหรับภาษา / เครื่องมือสร้างบิลด์ มันระบุเป้าหมายและการอ้างอิงพร้อมกับคำสั่งที่เกี่ยวข้องเพื่อดำเนินการ (สูตรอาหาร aka) เพื่ออัปเดตเป้าหมาย

12
ตรวจสอบว่ามีโปรแกรมจาก Makefile หรือไม่
ฉันจะตรวจสอบได้อย่างไรว่าโปรแกรมสามารถเรียกใช้จาก Makefile ได้หรือไม่? (นั่นคือโปรแกรมควรมีอยู่ในเส้นทางหรือมิฉะนั้นสามารถเรียกใช้ได้) สามารถใช้เพื่อตรวจสอบว่ามีการติดตั้งคอมไพเลอร์ใดบ้าง เช่นคำถามนี้แต่ไม่ถือว่าเชลล์ต้นแบบเข้ากันได้กับ POSIX
115 makefile  gnu-make 

10
คุณสามารถสร้าง Makefiles ที่ถูกต้องโดยไม่มีอักขระแท็บได้หรือไม่?
target: dependencies command1 command2 ในระบบของฉัน (Mac OS X) makeดูเหมือนว่าจะกำหนดให้ Makefiles มีอักขระแท็บที่นำหน้าเนื้อหาของแต่ละcommandบรรทัดหรือแสดงข้อผิดพลาดทางไวยากรณ์ นี่เป็นสิ่งที่น่ารำคาญเมื่อสร้างหรือแก้ไข Makefiles เพราะฉันตั้งค่าตัวแก้ไขให้เป็น all-space-all-the-time คุณสามารถสร้าง Makefiles ที่ถูกต้องโดยไม่มีอักขระแท็บได้หรือไม่?



12
วิธีป้องกัน“ ข้อผิดพลาดไดเรกทอรีมีอยู่แล้ว” ใน makefile เมื่อใช้ mkdir
ฉันต้องการสร้างไดเร็กทอรีใน makefile ของฉันและฉันไม่ต้องการให้ "ไดเร็กทอรีมีข้อผิดพลาด" ซ้ำแล้วซ้ำเล่าแม้ว่าฉันจะเพิกเฉยได้ง่ายๆก็ตาม ฉันใช้ mingw / msys เป็นหลัก แต่ต้องการบางอย่างที่ใช้ได้กับเชลล์ / ระบบอื่น ๆ ด้วย ฉันลองแล้ว แต่ไม่ได้ผลมีความคิดอะไรไหม? ifeq (,$(findstring $(OBJDIR),$(wildcard $(OBJDIR) ))) -mkdir $(OBJDIR) endif

4
จะส่งอาร์กิวเมนต์ไปยัง Makefile จากบรรทัดคำสั่งได้อย่างไร
จะส่งอาร์กิวเมนต์ไปยัง Makefile จากบรรทัดคำสั่งได้อย่างไร ฉันเข้าใจว่าฉันทำได้ $ make action VAR="value" $ value ด้วย Makefile VAR = "default" action: @echo $(VAR) ฉันจะมีพฤติกรรมต่อไปนี้ได้อย่างไร? $ make action value value เหรอ? เกี่ยวกับ $make action value1 value2 value1 value2

6
จะส่งผ่านนิยามมาโครจากอาร์กิวเมนต์บรรทัดคำสั่ง“ make” (-D) ไปยังซอร์สโค้ด C ได้อย่างไร
ฉันมักจะส่งผ่านคำจำกัดความของมาโครจาก "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 = …
107 c  macros  makefile 


8
กฎ GNU Makefile สร้างเป้าหมายสองสามรายการจากไฟล์ต้นฉบับเดียว
ฉันกำลังพยายามทำสิ่งต่อไปนี้ มีโปรแกรมหนึ่งเรียกมันfoo-binว่าใช้ในอินพุตไฟล์เดียวและสร้างไฟล์เอาต์พุตสองไฟล์ กฎ Makefile โง่สำหรับสิ่งนี้คือ: file-a.out file-b.out: input.in foo-bin input.in file-a.out file-b.out อย่างไรก็ตามสิ่งนี้ไม่ได้บอกmakeแต่อย่างใดว่าเป้าหมายทั้งสองจะถูกสร้างขึ้นพร้อมกัน เป็นเรื่องปกติเมื่อทำงานmakeแบบอนุกรม แต่อาจทำให้เกิดปัญหาหากมีใครพยายามmake -j16หรือทำอะไรที่บ้าบอพอ ๆ กัน คำถามคือมีวิธีเขียนกฎ Makefile ที่เหมาะสมสำหรับกรณีดังกล่าวหรือไม่? เห็นได้ชัดว่ามันจะสร้าง DAG แต่อย่างใดคู่มือการสร้าง GNU ไม่ได้ระบุวิธีจัดการกรณีนี้ การรันโค้ดเดียวกันสองครั้งและสร้างผลลัพธ์เพียงผลลัพธ์เดียวนั้นไม่เป็นปัญหาเนื่องจากการคำนวณต้องใช้เวลา (คิดว่า: ชั่วโมง) การส่งออกไฟล์เพียงไฟล์เดียวก็ค่อนข้างยากเช่นกันเนื่องจากมักใช้เป็นอินพุตไปยัง GNUPLOT ซึ่งไม่ทราบวิธีจัดการไฟล์ข้อมูลเพียงเศษเสี้ยว
106 makefile 

4
“ ทั้งหมด” หมายถึงอะไรใน makefile?
ฉันอ่านบทแนะนำเกี่ยวกับ Makefiles แต่สำหรับฉันแล้วยังไม่ชัดเจนว่าเป้าหมาย "ทั้งหมด" หมายถึงอะไรและทำหน้าที่อะไร ความคิดใด ๆ ?
105 makefile 

4
CFLAGS กับ CPPFLAGS
ฉันเข้าใจว่า CFLAGS (หรือ CXXFLAGS สำหรับ C ++) มีไว้สำหรับคอมไพเลอร์ในขณะที่ CPPFLAGS ถูกใช้โดยตัวประมวลผลล่วงหน้า แต่ฉันยังไม่เข้าใจความแตกต่าง ฉันจำเป็นต้องระบุพา ธ รวมสำหรับไฟล์ส่วนหัวที่มาพร้อมกับ #include - เนื่องจาก #include เป็นคำสั่งของตัวประมวลผลก่อนตัวประมวลผลล่วงหน้า (CPPFLAGS) เป็นสิ่งเดียวที่ฉันสนใจหรือไม่ ฉันต้องให้เส้นทางการรวมเพิ่มเติมแก่คอมไพเลอร์ภายใต้สถานการณ์ใด โดยทั่วไปหากตัวประมวลผลก่อนค้นหาและรวมไฟล์ส่วนหัวที่จำเป็นเหตุใดจึงจำเป็นต้องแจ้งเกี่ยวกับไดเร็กทอรีรวมพิเศษ CFLAGS ใช้อะไรได้บ้าง? (ในกรณีของฉันฉันพบว่าทั้งสองอย่างนี้อนุญาตให้ฉันรวบรวมโปรแกรมของฉันได้ซึ่งทำให้เกิดความสับสน ... ฉันสามารถใช้ CFLAGS หรือ CPPFLAGS เพื่อบรรลุเป้าหมายของฉัน (ในบริบทอัตโนมัติอย่างน้อยที่สุด) อะไรให้อะไร)

2
วิธีใช้คำสั่งเชลล์ใน Makefile
ฉันพยายามใช้ผลลัพธ์ของlsคำสั่งอื่น ๆ (เช่น echo, rsync): all: <Building, creating some .tgz files - removed for clarity> FILES = $(shell ls) echo $(FILES) แต่ฉันได้รับ: make FILES = Makefile file1.tgz file2.tgz file3.tgz make: FILES: No such file or directory make: *** [all] Error 1 ฉันได้พยายามใช้echo $$FILES, echo ${FILES}และecho $(FILES)มีโชคไม่
102 bash  makefile  echo 

9
สร้างไดเร็กทอรีโดยใช้ make file
ฉันเป็นมือใหม่มากสำหรับ makefiles และฉันต้องการสร้างไดเร็กทอรีโดยใช้ makefile ไดเร็กทอรีโปรเจ็กต์ของฉันเป็นแบบนี้ +--Project +--output +--source +Testfile.cpp +Makefile ฉันต้องการใส่อ็อบเจ็กต์ทั้งหมดและเอาต์พุตลงในโฟลเดอร์เอาต์พุตตามลำดับ ฉันต้องการสร้างโครงสร้างโฟลเดอร์ซึ่งจะเป็นเช่นนี้หลังจากรวบรวม +--Project +--output +--debug (or release) +--objs +Testfile.o +Testfile (my executable file) +--source +Testfile.cpp +Makefile ฉันลองใช้หลายตัวเลือก แต่ไม่สำเร็จ โปรดช่วยฉันสร้างไดเรกทอรีโดยใช้ make file ฉันโพสต์ Makefile ของฉันเพื่อการพิจารณาของคุณ #--------------------------------------------------------------------- # Input dirs, names, files #--------------------------------------------------------------------- OUTPUT_ROOT := output/ TITLE_NAME := TestProj ifdef DEBUG TITLE_NAME …


16
แสดงรายการเป้าหมาย / เป้าหมายใน GNU ที่มีตัวแปรในนิยาม
ฉันมี makefile ขนาดใหญ่พอสมควรที่สร้างเป้าหมายจำนวนมากได้ทันทีโดยคำนวณชื่อจากตัวแปร (เช่น foo $ (VAR): $ (PREREQS)) มีวิธีใดบ้างที่ทำให้ gnu สามารถมั่นใจได้ว่าจะพ่นรายการเป้าหมายออกมาหลังจากขยายตัวแปรเหล่านี้แล้ว? ฉันต้องการที่จะได้รับเป้าหมายสำหรับ makefile aribitrary ฉันกำลังพยายามเขียนฟังก์ชันที่สมบูรณ์สำหรับเชลล์ของฉัน
100 makefile  gnu-make 

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