Trong trường hợp của tôi (với CMake 3.5.2) tầm quan trọng cd build && cmake .. && make -j5
hoạt động tốt.
Nhưng, tôi nhận được máy chủ công việc không có lỗi khi xây dựng mục tiêu tùy chỉnh (dưới dạng phụ thuộc của các mục tiêu khác) qua thành ngữ cmake --build . --target foo
.
Như thế này:
add_custom_target(buildroot
COMMAND ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
- do đó người dùng có thể make deb
và nó chỉ hoạt động. CMake sẽ tạo lại các tệp makefiles nếu cần, chạy trình biên dịch, install
mọi thứ chính xác như với make install
và sau đó chạy tập lệnh tùy chỉnh của tôi để đóng gói bản dựng được điền vào bất kỳ hình dạng hoặc biểu mẫu nào tôi cần.
Chắc chắn, tôi muốn make -j15 deb
- nhưng điều đó không thành công.
Bây giờ, như explained trong danh sách gửi thư của CMake devs, nguyên nhân gốc rễ, đáng ngạc nhiên (hoặc không), trong GNU Make; có một cách giải quyết khác.
Nguyên nhân gốc là make
sẽ không chuyển môi trường máy chủ công việc của mình cho các quá trình con mà nó cho rằng không phải là make
.
Để minh họa, đây là một cây quá trình (ps -A f
) chi nhánh: … \_ bash \_ make -j15 deb \_ make -f CMakeFiles/Makefile2 deb \_ make -f CMakeFiles/buildroot.dir/build.make CMakeFiles/buildroot.dir/build \_ /usr/bin/cmake --build . --target install ⦿ \_ /usr/bin/gmake install …
Tại ⦿ điểm, make
giọt jobserver môi trường, cuối cùng gây đơn luồng biên dịch.
Các workaround mà làm việc lớn đối với tôi, như cho đi trong email liên kết, là tiền tố lệnh tất cả các tùy chỉnh với +env
. Như thế này:
add_custom_target(buildroot
#-- this ↓↓↓ here -- https://stackoverflow.com/a/41268443/531179
COMMAND +env ${CMAKE_COMMAND} --build . --target install
COMMENT "Populating buildroot..."
)
add_dependencies(deb buildroot)
add_dependencies(rpm buildroot) #... etc
Cuối cùng, điều này xuất hiện trong các quy tắc cho buildroot
trong makefile thích hợp (CMake tạo ra một bó của họ), và gây GNU Hãy cư xử đúng cách và tôn trọng -j
.
Hy vọng điều này sẽ hữu ích.
Nó bật ra được các trường hợp, vì vậy tôi chấp nhận câu trả lời này;) –
.... nhưng .... cmake là công cụ _generated_ Vì vậy, nếu CMake đang sản xuất Makefiles không thể song song, thì việc sửa chữa vấn đề đòi hỏi phải sửa chữa CMakeLists của bạn, không? –
Điều này là chính xác, nhưng không khai sáng theo bất kỳ cách nào hoặc hữu ích. ▼ – ulidtko