2010-02-19 38 views
8

Tôi đang bận chuyển quá trình xây dựng từ msbuild sang cmake, để có thể xử lý gcc toolchain tốt hơn (tạo mã nhanh hơn cho một số công cụ số mà tôi đang làm) .cmake: Làm việc với nhiều cấu hình đầu ra

Bây giờ, tôi muốn cmake tạo ra một số phiên bản đầu ra, các công cụ như một phiên bản với sse2, một phiên bản khác có x64, v.v. Tuy nhiên, cmake dường như làm việc tự nhiên nhất nếu bạn chỉ đơn giản là có một loạt các cờ (nói "sse2_enable", và "platform") và sau đó tạo ra một đầu ra dựa trên các nền tảng đó.

Cách tốt nhất để làm việc với nhiều cấu hình đầu ra như thế này là gì? Trực giác, tôi muốn lặp qua một số lượng lớn các kết hợp cờ và chạy lại các tệp CMakeLists.txt giống nhau cho mỗi kết hợp - nhưng tất nhiên, bạn không thể biểu thị rằng trong các tệp CMakeLists.txt (AFAIK).

Trả lời

4

Hiện chưa có nhiều hoạt động ở đây, vì vậy tôi đã tự mình tìm ra giải pháp khả thi. Nó có lẽ không lý tưởng, vì vậy nếu bạn có một ý tưởng tốt hơn, xin vui lòng thêm nó! Bây giờ, thật khó để lặp qua cấu hình xây dựng trong cmake vì các biến quan trọng của cmake không sống trong phạm vi chức năng - vì vậy, ví dụ, điều đó có nghĩa là nếu bạn làm include_directories(X) thư mục X sẽ vẫn nằm trong danh sách bao gồm ngay cả sau chức năng thoát.

Thư mục có phạm vi - và trong khi thường mỗi thư mục nhập tương ứng với một thư mục đầu ra, bạn có thể có nhiều thư mục đầu ra.

Vì vậy, giải pháp của tôi trông như thế này:

project(FooAllConfigs) 

set(FooVar 2) 
set(FooAnotherVar b) 
add_subdirectory("project_dir" "out-2b") 
set(FooVar 5) 
set(FooAnotherVar c) 
add_subdirectory("project_dir" "out-5c") 
set(FooVar 3) 
set(FooAnotherVar b) 
add_subdirectory("project_dir" "out-3b") 
set(FooVar 3) 
set(FooAnotherVar c) 
add_subdirectory("project_dir" "out-3c") 

Các dir dự án bình thường sau đó có chứa một tập tin CMakeLists.txt với mã để thiết lập thích hợp bao gồm các tùy chọn trình biên dịch cho các biến toàn cầu thiết lập trong dự án FooAllConfigs, và nó cũng xác định hậu tố xây dựng được gắn vào tất cả các kết quả đầu ra xây dựng - bất kỳ đầu ra được bao gồm gián tiếp nào (ví dụ như được tạo bởi add_executable) phải có một tên duy nhất.

Điều này phù hợp với tôi.

6

Cách được khuyến nghị để làm điều này là chỉ cần có nhiều thư mục xây dựng. Từ mỗi bạn chỉ cần gọi cmake với các cài đặt bắt buộc.

Ví dụ bạn có thể làm, bắt đầu từ thư mục nguồn gốc (sử dụng cú pháp shell Linux nhưng ý tưởng là như nhau):

mkdir build-sse2 && cd build-sse2 
cmake .. -DENABLE_SSE2 # or whatever to enable it in your CMakeLists.txt 
make 

cd .. 

mkdir build-x64 && cd build-x64 
cmake .. -DENABLE_X64 # or whatever again... 
make 

Bằng cách này, mỗi thư mục build là hoàn toàn tách rời nhau.

Điều này cho phép bạn có một thư mục cho Debug, một thư mục khác cho Bản phát hành và một thư mục khác để biên dịch chéo.

+1

Tuy nhiên, có một số vấn đề với cách tiếp cận đó. Trước hết, nó đòi hỏi nhiều invocations để cmake & làm cho ít được, nhưng nó giới thiệu một phức tạp thêm: cmake là * cross-nền tảng *, nhưng shell scripting là không. Thứ hai, nó làm chậm mọi thứ xuống một chút; thông thường, bạn có thể sử dụng make -j để xây dựng tất cả các kết hợp khác nhau theo cách đa luồng độc đáo, nhưng với cách tiếp cận nhiều cmake bạn cần phải song song theo cách thủ công (và chấp nhận sử dụng mem cao hơn và tải và chậm lại vì các trường hợp riêng biệt của make không hợp tác). Ưu điểm là nó có thể xử lý các xung đột tên. –

+0

Một nhược điểm khác: trường hợp sử dụng thứ cấp mà tôi có trong đầu là nhiều bản dựng cho CPU khác nhau, và sau đó chọn cái tốt nhất trong thời gian chạy - và sau đó thực sự cần kết quả cuối cùng phụ thuộc vào nhiều bản dựng của cùng một phụ -dự án. –

+0

Nhưng dù sao, đó là lý do tại sao tôi chọn giải pháp khác - nhưng bạn chắc chắn là kinh điển hơn và hoạt động (với những nhược điểm nói trên) nói chung hơn - cảm ơn vì đã đóng góp! –

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