Peringatan dipaksakan dalam submake dalam eksekusi paralel make

Ketika saya menjalankan make -j3 untuk membangun secara paralel, saya mengerti

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

Dalam dokumentasi saya menemukan peringatan dikeluarkan

if make mendeteksi kondisi kesalahan terkait pemrosesan paralel pada sistem tempat sub-buatan dapat berkomunikasi.

Apa sajakah kondisi kesalahan ini? Apa yang dapat saya lakukan untuk menyembuhkannya atau menyembunyikan pesan kesalahan tersebut?

Makefile dihasilkan dari CMake, jadi saya tidak bisa (=Saya tidak mau) mengedit makefile.


person usr1234567    schedule 18.07.2014    source sumber
comment
Bagaimana Anda menjalankan Makefile anak di CMakeLists.txt Anda?   -  person anton_rh    schedule 18.03.2020
comment
Saya rasa hanya CMake yang memanggil make dan submake. Tapi setelah pertanyaan Anda saya tidak lagi yakin 100%.   -  person usr1234567    schedule 18.03.2020


Jawaban (4)


Biasanya pesan ini muncul jika Anda memanggil make dari Makefile Anda bukan dengan variabel $(MAKE)

Contoh:

Mengubah

foo:
     cd foo/ && make foo

to

foo:
     cd foo && $(MAKE) foo
person arved    schedule 18.07.2014
comment
Saya tidak menulis makefile sendiri, ini dibuat secara otomatis oleh CMake. - person usr1234567; 06.07.2015
comment
cmake biasanya melakukan ini dengan benar, mungkin Anda memanggil make dari CMakeLists.txt - person arved; 06.07.2015
comment
Nah, dalam kasus saya, inilah tepatnya yang saya sebut submake. Saya memiliki fungsi sub_make = $(MAKE) -C $(TOPDIR)/subdir/$(1) $(2), dan kemudian saya melakukannya mis. $(call subproject,all). Jadi $(MAKE) seperti yang Anda katakan. Dan saya tetap mendapat peringatan itu. - person Hi-Angel; 15.09.2020
comment
Oke, Saya sudah menemukan alasannya. Ternyata, karena alasan tertentu, panggilan $(MAKE) tidak akan berfungsi sebagaimana mestinya jika Anda memanggilnya dari fungsi Make. Dalam kasus seperti ini, fungsi harus memiliki simbol @+ setelah tanda kesetaraan. Jadi, berdasarkan contoh saya sebelumnya, untuk membuatnya berfungsi saya harus mendeklarasikannya sebagai sub_make = @+$(MAKE) -C $(TOPDIR)/subdir/$(1) $(2) - person Hi-Angel; 16.09.2020

Hal ini terkait dengan fitur pembuatan multi-thread. Hal ini terjadi ketika ada proses make multi-thread lain di dalam proses make yang sudah multi-thread. Karena ada pembuatan multi-utas tingkat kedua, sinkronisasi internal tidak tersedia.

Hal ini dapat diperbaiki dengan parameter -j.

make -j 1

Kode di atas akan menghindari banyak thread dan akan menghapus peringatan.

Sekali lagi, kita juga bisa menggunakan parameter -j di makefile.

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

Aturan di atas tidak akan memunculkan thread untuk submake dan akan menghindari peringatan.

person shuva    schedule 12.05.2017
comment
Terima kasih telah berbagi wawasan ini. Tetapi dengan CMake menghasilkan Makefile dan saya tidak memiliki kendali atas mereka. Karena tampaknya sudah diperbaiki di CMake upstream dan/atau GNU, saya setuju dengan topik ini. - person usr1234567; 13.05.2017

Anda memanggil make -j3 untuk Makefile tingkat atas, yang berarti hingga 3 target dapat dibuat secara bersamaan (make menggunakan 3 thread untuk membangun). Makefile tingkat atas Anda (dihasilkan oleh CMake) menjalankan make lainnya (yang disebut sub-make). Dan dalam pemanggilan ini opsi -jN lain digunakan. Jadi, daripada menggunakan server kerja umum untuk kedua make, sub-make menggunakan N thread lain untuk membangun targetnya. Jadi totalnya hingga 3 + N thread digunakan untuk membangun. Jadi inilah inti dari peringatan ini.

Untuk mengaktifkan server pekerjaan umum untuk make dan sub-make induk, ada 2 persyaratan:

  • Opsi -jN eksplisit tidak boleh diteruskan ke sub-make. Panggil sub-make tanpa argumen ini.
  • Sub-make harus dipanggil menggunakan ekspresi $(MAKE) (bukan sekadar make). Alternatifnya, awalan + dapat ditambahkan sebelum perintah make. Lihat jawaban ini untuk detailnya.

Jika kedua persyaratan terpenuhi, maka, saat Anda menjalankan make -jN untuk Makefile tingkat atas, make induk dan make turunan menggunakan N thread yang sama untuk membangun.

person anton_rh    schedule 18.03.2020

Dengan versi GNU make (4.0) dan CMake (2.8.6 dan 3.3) yang lebih baru, saya tidak dapat lagi mereproduksi peringatan tersebut. Sementara itu, salah satunya telah diperbaiki.

person usr1234567    schedule 16.11.2015