คำเตือนที่บังคับใช้ใน submake ในการดำเนินการ make แบบขนาน

เมื่อฉันรัน make -j3 เพื่อสร้างแบบขนาน ฉันจะได้รับ

warning: -jN forced in submake: disabling jobserver mode.

ในเอกสารประกอบ ฉันพบว่ามีการส่งคำเตือน

หาก make ตรวจพบเงื่อนไขข้อผิดพลาดที่เกี่ยวข้องกับการประมวลผลแบบขนานบนระบบที่ผู้ผลิตย่อยสามารถสื่อสารได้

เงื่อนไขข้อผิดพลาดเหล่านี้คืออะไร? ฉันจะทำอย่างไรเพื่อรักษาหรือระงับข้อความแสดงข้อผิดพลาด?

makefile ถูกสร้างขึ้นจาก CMake ดังนั้นฉันจึงไม่สามารถ (=ฉันไม่ต้องการ) แก้ไข makefile ได้


person usr1234567    schedule 18.07.2014    source แหล่งที่มา
comment
คุณจะรันลูก Makefile ใน CMakeLists.txt ของคุณได้อย่างไร   -  person anton_rh    schedule 18.03.2020
comment
ฉันคิดว่ามีเพียง CMake เท่านั้นที่เรียก make และ submake แต่หลังจากคำถามของคุณ ฉันไม่แน่ใจ 100% อีกต่อไป   -  person usr1234567    schedule 18.03.2020


คำตอบ (4)


โดยปกติแล้วข้อความนี้จะเกิดขึ้นหากคุณเรียก make จาก Makefile ของคุณ ไม่ใช่โดยตัวแปร $(MAKE)

ตัวอย่าง:

เปลี่ยน

foo:
     cd foo/ && make foo

to

foo:
     cd foo && $(MAKE) foo
person arved    schedule 18.07.2014
comment
ฉันไม่ได้เขียน makefile ด้วยตัวเอง แต่ CMake สร้างขึ้นโดยอัตโนมัติ - person usr1234567; 06.07.2015
comment
cmake มักจะทำสิ่งนี้ถูกต้อง บางทีคุณอาจเรียก make จาก CMakeLists.txt - person arved; 06.07.2015
comment
ในกรณีของฉัน นี่คือวิธีที่ฉันเรียกผู้ผลิตย่อย ฉันมีฟังก์ชัน sub_make = $(MAKE) -C $(TOPDIR)/subdir/$(1) $(2) แล้วฉันก็ทำเช่น $(call subproject,all). มันก็เป็น $(MAKE) อย่างที่คุณพูด และฉันยังคงได้รับคำเตือน - person Hi-Angel; 15.09.2020
comment
เอาล่ะ ฉันเข้าใจเหตุผลแล้ว ปรากฎว่าด้วยเหตุผลบางอย่าง $(MAKE) การโทรจะไม่ทำงานเท่าที่ควรหากคุณโทรจากฟังก์ชัน Make ในกรณีเช่นนี้ ฟังก์ชันจะต้องมีสัญลักษณ์ @+ หลังเครื่องหมายเท่ากับ จากตัวอย่างก่อนหน้าของฉัน เพื่อให้มันใช้งานได้ ฉันต้องประกาศให้เป็น sub_make = @+$(MAKE) -C $(TOPDIR)/subdir/$(1) $(2) - person Hi-Angel; 16.09.2020

สิ่งนี้เกี่ยวข้องกับคุณสมบัติการสร้างแบบมัลติเธรด มันเกิดขึ้นเมื่อมีการสร้างแบบมัลติเธรดอื่นภายในกระบวนการสร้างที่เป็นแบบมัลติเธรดอยู่แล้ว เนื่องจากมีการผลิตแบบมัลติเธรดระดับที่สอง การซิงโครไนซ์ภายในจึงไม่พร้อมใช้งาน

สามารถแก้ไขได้ด้วยพารามิเตอร์ -j

make -j 1

โค้ดด้านบนจะหลีกเลี่ยงหลายเธรด และจะลบคำเตือน

ขอย้ำอีกครั้งว่าเราสามารถใช้พารามิเตอร์ -j ใน makefile ได้เช่นกัน

target:
    $(MAKE) -j 1 -C ${SUBDIR} $@

กฎข้างต้นจะไม่วางเธรดสำหรับ submake และจะหลีกเลี่ยงคำเตือน

person shuva    schedule 12.05.2017
comment
ขอบคุณสำหรับการแบ่งปันข้อมูลเชิงลึกเหล่านี้ แต่ด้วย CMake จะสร้าง Makefiles และฉันไม่สามารถควบคุมมันได้ เนื่องจากดูเหมือนว่าจะได้รับการแก้ไขในอัปสตรีม CMake และ/หรือ GNU ฉันจึงพอใจกับหัวข้อนี้ - person usr1234567; 13.05.2017

คุณเรียก make -j3 สำหรับ Makefile ระดับบนสุด ซึ่งหมายความว่าสามารถสร้างเป้าหมายได้สูงสุด 3 เป้าหมายพร้อมกัน (make ใช้ 3 เธรดในการสร้าง) Makefile ระดับบนสุดของคุณ (สร้างโดย CMake) เรียกใช้ make อื่น (ซึ่งเรียกว่า sub-make) และในการร้องขอนี้ มีการใช้ตัวเลือก -jN อีกตัวหนึ่ง ดังนั้นแทนที่จะใช้เซิร์ฟเวอร์งานทั่วไปสำหรับทั้งสอง makes sub-make จะใช้ N เธรดอื่นเพื่อสร้างเป้าหมาย ดังนั้นจึงใช้เธรดทั้งหมดถึง 3 + N เธรดในการสร้าง นี่คือสิ่งที่คำเตือนนี้เกี่ยวกับ

หากต้องการเปิดใช้งานเซิร์ฟเวอร์งานทั่วไปสำหรับ make หลักและ make ย่อย มีข้อกำหนด 2 ประการ:

  • ต้องไม่ส่งตัวเลือกที่ชัดเจน -jN ไปยังผู้ผลิตย่อย เรียก sub-make โดยไม่มีอาร์กิวเมนต์นี้
  • ยี่ห้อย่อยจะต้องถูกเรียกโดยใช้นิพจน์ $(MAKE) (ไม่ใช่แค่ make ธรรมดา) หรือสามารถเพิ่มคำนำหน้า + ก่อนคำสั่ง make ได้ ดูคำตอบนี้สำหรับรายละเอียด

หากเป็นไปตามข้อกำหนดทั้งสอง เมื่อคุณรัน make -jN สำหรับ Makefile ระดับบนสุดของคุณ ระดับบนสุด make และรายการย่อย make จะใช้ N threads เหมือนกันสำหรับการสร้าง

person anton_rh    schedule 18.03.2020

ด้วย GNU make (4.0) และ CMake (2.8.6 และ 3.3) เวอร์ชันใหม่กว่า ฉันไม่สามารถทำซ้ำคำเตือนได้อีกต่อไป หนึ่งในนั้นได้รับการแก้ไขในระหว่างนี้

person usr1234567    schedule 16.11.2015