2010-05-31 48 views
13

Tôi đang cố gắng để thiết lập một song song CMake dựa trên xây dựng cho cây nguồn của tôi, nhưng khi tôi phát hànhcmake và xây dựng song song với "làm -jN"

$ cmake . 
$ make -j2 

tôi nhận được một cảnh báo jobserver unavailable: using -j1. Add '+' to parent make rule. Có ai có một ý tưởng nếu nó có thể sửa chữa nó bằng cách nào đó?

Trả lời

1

trông như thế này không phải là một vấn đề cmake nhưng chỉ thực hiện.

+0

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;) –

+7

.... 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? –

+1

Đ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

-1

Chỉ cần từ googling nó trông giống như bạn đang sử dụng distcc (ví dụ here)

+0

Không, tôi không biết. Tôi đoán giải pháp cho vấn đề của tôi nằm ở một nơi nào đó sâu trong CMake, tức là tôi cần thuyết phục nó vượt qua các thông số phù hợp để thực hiện. –

+2

bạn có thể chạy "VERBOSE = 1 make" để xem những gì thực hiện chính xác thực hiện – dimba

22

Trong Makefile được tạo ra, khi gọi vào một phụ làm cho nó cần phải sử dụng $ (MAKE) (không chỉ 'làm') hoặc người nào khác đứng trước dòng với dấu +. Đó là, một quy tắc sẽ trông như thế này:

mysubdir: 
    $(MAKE) -C mysubdir 

hay như thế này:

mysubdir: 
    +make -C mysubdir 

Nếu bạn không làm điều đó một trong hai cách, thực hiện sẽ cung cấp cho bạn cảnh báo đó.

Tôi không biết gì về cmake, vì vậy có thể nó tạo ra Makefiles không chính xác. Hoặc có thể bạn đã làm một cái gì đó không chính xác về kết thúc của bạn.

+1

Tôi nhận được lỗi mặc dù Tôi sử dụng '$ (MAKE) -C mysubdir' Có gì sai ở đây? – Walter

3

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.

+0

Điều này làm việc tuyệt vời ngoại trừ trên Windows, nơi mà cú pháp gây nhầm lẫn và khiến cho lệnh thất bại với lỗi" '+ env' không được công nhận là nội bộ hoặc lệnh bên ngoài. " – taranaki

+0

Tôi muốn nói ... quá nhiều phần mềm hoạt động tốt" ngoại trừ trên Windows ". – ulidtko

Các vấn đề liên quan