คำถามติดแท็ก gnu-make

1
Makefile นี้ทำให้โปรแกรม C โดยไม่ต้องระบุคอมไพเลอร์ได้อย่างไร
ผมก็ใช้ Makefile จากหนังสือ " การเขียนโปรแกรมขั้นสูงลินุกซ์ (2001)" [code] มันแปลกสำหรับฉันที่เห็นว่าGNU make ทำการคอมไพล์โค้ดอย่างถูกต้องโดยไม่ต้องระบุคอมไพเลอร์ใน Makefile มันเหมือนการอบไม่มีสูตรใด ๆ ! นี่เป็นรหัสขั้นต่ำ: test.c int main(){} Makefile all: test และทำให้ได้ผลจริง ๆ ! นี่คือคำสั่งที่รัน: cc test.c -o test ฉันไม่พบสิ่งที่มีประโยชน์ในเอกสาร เป็นไปได้อย่างไร? PS หมายเหตุเพิ่มเติมหนึ่ง: แม้ภาษาจะไม่ได้ระบุ; เพราะtest.cใช้ได้ GNU ใช้make ccหากมีอยู่test.cppหรือtest.cc(เมื่อไม่มีtest.c) ก็ใช้g++(และไม่c++)
41 linux  make  gcc  gnu-make 

2
ฉันจะหารายการรหัสข้อผิดพลาด 'ทำ' ได้จากที่ใด
ฉันพยายามรวบรวมโปรแกรมที่เขียนใน Fortran โดยใช้make(ฉันมีMakefileและในขณะที่อยู่ในไดเรกทอรีที่มีMakefileฉันพิมพ์คำสั่ง$ make targetโดยที่ "เป้าหมาย" คือข้อกำหนดคุณสมบัติเป้าหมายเฉพาะระบบอยู่ในMakefileของฉัน ทดสอบกับการแก้ไขต่าง ๆ ของการกำหนดเป้าหมายของฉันฉันมักจะได้รับความหลากหลายของข้อผิดพลาดเมื่อพยายามที่จะเรียกร้องmakeเพื่อให้ไม่กี่ตัวอย่าง. make[1]: Entering directory /bin/sh: line 0: test: too many arguments ./dpp angfrc.f > angfrc.tmp.f /bin/sh: ./dpp: Permission denied make[1]: *** [angfrc.o] Error 126 make[1]: Leaving directory make: *** [cmu60] Error 2 และ make[1]: Entering directory /bin/sh: line 0: test: too …

3
อย่าหยุดทำการสร้างหากคำสั่งล้มเหลว แต่ตรวจสอบสถานะออก
ฉันกำลังพยายามสั่ง GNU ทำให้ 3.81 ไม่หยุดถ้าคำสั่งล้มเหลว (ดังนั้นฉันจึงนำหน้าคำสั่งด้วย-) แต่ฉันต้องการตรวจสอบสถานะการออกจากคำสั่งถัดไปและพิมพ์ข้อความที่ให้ข้อมูลเพิ่มเติม อย่างไรก็ตาม Makefile ของฉันด้านล่างล้มเหลว: $ cat Makefile all: -/bin/false ([ $$? -eq 0 ] && echo "success!") || echo "failure!" $ $ make /bin/false make: [all] Error 1 (ignored) ([ $? -eq 0 ] && echo "success!") || echo "failure!" success! เหตุใด Makefile ด้านบนจึงแสดงว่า …
22 make  gnu-make 

3
วิธีแสดงการขึ้นต่อกันที่กำหนดใน makefile เป็นแผนผัง
ปัญหา ฉันต้องการดูการอ้างอิงสำหรับหนึ่งหรือมากกว่าหนึ่งเป้าหมายของ makefile ดังนั้นฉันกำลังมองหาโปรแกรมที่สามารถแยกวิเคราะห์ makefiles แล้วจะแสดงการอ้างอิงในรูปแบบต้นไม้บางอย่าง (เยื้อง, ascii-art, ... ) หรือเป็นกราฟ (dot, ... ) คล้ายคลึงกัน มีโปรแกรมที่ทำสิ่งนี้สำหรับสถานการณ์อื่น ๆ : pactreeหรือcashreeสามารถแสดงการขึ้นต่อกันของชุดซอฟต์แวร์ในรูปแบบตามลำดับในแผนผังเช่นรูปแบบ ascii หรือเป็นdotกราฟ gcc -M source_file.c แสดงการขึ้นต่อกันของไฟล์ต้นฉบับ C เป็นกฎการสร้าง pstreeแสดงการเป็นตัวแทน ASCII ของต้นไม้กระบวนการ ความคืบหน้า ค้นหาเว็บที่ผมพบความช่วยเหลือเล็ก ๆ น้อย ๆ นั่นทำให้ฉันต้องลอง make --always-make --silent --dry-run some_target | \ grep --extended-regexp 'Considering target file|Trying rule prerequisite' …

1
การ จำกัด GNU ‑ ทำเพื่อ POSIX สร้างพฤติกรรม
มีวิธีที่รู้จักกันในการทำให้ Linux makeปฏิเสธการใช้ GNU โดยไม่ตั้งใจหรือไม่ทำส่วนขยายเฉพาะใน Makefile เมื่อแก้ไขหรือใช้ Makefile ใน Linux อื่น ๆ ฉันหมายถึงการ จำกัด GNU ‑ ทำตัวตามที่makeระบุใน POSIXและปฏิเสธ GNU ใด ๆ ‑ สร้างส่วนขยายเฉพาะหรือไม่ .POSIXเป้าหมายพิเศษไม่เพียงพอตามที่“ 4.9 พิเศษ Built-in ชื่อเป้าหมาย (gnu.org) ” man page ไม่ได้กล่าวถึงตัวเลือกบรรทัดคำสั่งสำหรับสิ่งนี้ การใช้makeยูทิลิตี้อื่นอาจเป็นตัวเลือก - อัปเดต 2018-10-19 - ฉันยังไม่ได้พบคำตอบที่ตรงไปยังคำถามของฉัน แต่ที่นี่เป็นอย่างน้อยเอกสารเกี่ยวกับปัญหานี้เอกสารซึ่งไม่ได้อยู่ในเวลาที่ฉันมีคำถามนี้: สอนเกี่ยวกับพกพา Makefiles (nullprogram.com)
12 make  gnu-make 

2
สัญลักษณ์% ใน Makefile หมายถึงอะไร
ฉันกำลังเล่นรอบกับ makefiles และฉันมาข้าม.o%หรือ.c% จากสิ่งที่ฉันเข้าใจมันระบุไฟล์cหรือoทั้งหมด แต่ทำไมงานนี้: %.o: %.c $(CC) -c $^ -o $@ และนี่ใช้ไม่ได้ SOURCE := $(wildcard *.c) $(SOURCE:.c=.o): SOURCE $(CC) -c $^ -o $@ นิพจน์ทั้งสองระบุไฟล์ทั้งหมด ดังนั้น% .o:สัญลักษณ์ในไฟล์ make จะทำอย่างไร
11 make  gnu-make 

2
ฉันจะใช้ไฟล์จาก HTTP เป็นสิ่งที่จำเป็นต้องมีใน GNU ได้อย่างไร
ฉันต้องการใช้ไฟล์จากเวิลด์ไวด์เว็บเป็นข้อกำหนดเบื้องต้นใน makefiles ของฉัน: local.dat: http://example.org/example.gz curl -s $< | gzip -d | transmogrify >$@ ฉันแค่ต้องการ "ส่งผ่าน" หากไฟล์รีโมตใหม่กว่าไฟล์โลคัลเช่นเดียวกับที่ทำให้ใช้งานได้ตามปกติ ฉันไม่ต้องการเก็บตัวอย่าง example.gz ที่เก็บไว้ชั่วคราว- ไฟล์มีขนาดใหญ่และฉันไม่ต้องการข้อมูลดิบ ฉันต้องการหลีกเลี่ยงการดาวน์โหลดไฟล์ทั้งหมด เป้าหมายคือการประมวลผลสองสามขนานพร้อมกันโดยใช้-jแฟล็ก make วิธีที่สะอาดในการแก้ปัญหานี้คืออะไร? ฉันสามารถนึกถึงวิธีไปสองสามวิธี: เก็บไฟล์ดัมมี่ที่ว่างเปล่าออกไปอัพเดตทุกครั้งที่เป้าหมายถูกสร้างขึ้นใหม่ ปลั๊กอินบางตัวที่ใช้ระบบปลั๊กอินใหม่ของ GNU make (ซึ่งฉันไม่รู้อะไรเลย) วิธีการที่ไม่เชื่อเรื่องพระเจ้าที่เมาท์เซิร์ฟเวอร์ HTTP ในระบบไฟล์โลคอล ก่อนที่จะขุดเพิ่มเติมฉันต้องการคำแนะนำตัวอย่างที่ดีกว่า!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.