2012-06-29 63 views
16

Tôi muốn buộc CMake sử dụng "Makefiles Unix" máy phát điện từ bên trong CMakeLists.txt.cmake: Chọn trình tạo trong CMakeLists.txt

Đây là lệnh tôi sử dụng ngay bây giờ.

cmake -G "Unix Makefiles" . 

Tôi muốn nó được này.

cmake . 

Khi chạy trên cửa sổ có cài đặt VC và chuỗi công cụ tùy chỉnh.

Tôi hy vọng có thể đặt bộ tạo trong tệp CMakeLists.txt.

Có thể giống như thế này.

set(CMAKE_GENERATOR "Unix Makefiles") 

Trả lời

2

Đây không phải là điều tôi nhận được khi chạy cùng lệnh, cmake sẽ tìm trình biên dịch gcc/tiện ích. Nếu PATH không được thiết lập chính xác, nó sẽ thất bại với một cái gì đó như:

 
D:\Development\build>cmake -G "Unix Makefiles" ..\source 
CMake Error: CMake was unable to find a build program corresponding to "Unix Makefiles". CMAKE_MAKE_PROGRAM is not set. 
    You probably need to select a different build tool. 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_C_COMPILER_ENV_VAR 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_C_COMPILER 
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCCompiler.cmake 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_CXX_COMPILER_ENV_VAR 
CMake Error: Error required internal CMake variable not set, cmake may be not be built correctly. 
Missing variable is: 
CMAKE_CXX_COMPILER 
CMake Error: Could not find cmake module file:D:/Development/build/CMakeFiles/CMakeCXXCompiler.cmake 
CMake Error: CMAKE_C_COMPILER not set, after EnableLanguage 
CMake Error: CMAKE_CXX_COMPILER not set, after EnableLanguage 
-- Configuring incomplete, errors occurred! 

khi gcc/mingw đang ở trong đường dẫn thì mọi thứ hoạt động tốt. Vậy bạn có thể cung cấp thêm thông tin về biến PATH hoặc phiên bản CMAKE của bạn không?

+0

Bởi vì tôi đang sử dụng một tùy chỉnh công cụ chuỗi, và tôi có VC++ cài đặt, tôi không thể dựa vào CMake lựa chọn một máy phát điện. Tôi cũng không chỉ định điều gì trên dòng lệnh để người dùng dễ dàng sao chép và xây dựng dự án. – Ted

+1

Ok ... xin lỗi tôi đã hiểu nhầm câu hỏi của bạn.Trong trường hợp đó, tôi sẽ khuyên bạn nên đặt một CMakeCache.txt vào thư mục, mà chủ yếu là trống nhưng đối với biến CMAKE_GENERATOR. Hoặc bạn có thể có tệp bộ nhớ cache đó trong kho lưu trữ nguồn của bạn và chuyển nó cùng với tùy chọn -C cmake. – Frank

7

Dường như với tôi rằng biến số CMAKE_GENERATOR được đặt quá muộn nếu được đặt trong CMakeLists.txt. Nếu bạn sử dụng (thậm chí vào đầu CMakeLists.txt)

set(CMAKE_GENERATOR "Ninja") 
message("generator is set to ${CMAKE_GENERATOR}") 

bạn có thể nhìn thấy trong một cái gì đó ra như

% cmake ../source 
-- The C compiler identification is GNU 4.9.2 
... 
-- Detecting CXX compile features - done 
generator is set to Ninja 
-- Configuring done 
-- Generating done 
-- Build files have been written to: /tmp/build 

Vì vậy, các biến được chỉ đặt ở cuối của các thủ tục thế hệ. Nếu bạn sử dụng một cái gì đó giống như

set(CMAKE_GENERATOR "Ninja" CACHE INTERNAL "" FORCE) 

trong CMakeLists.txt, sau đó trong thời gian đầu tiên của cmake ../source (không -G) phát mặc định được sử dụng. Tuy nhiên, biến số CMAKE_GENERATOR được lưu trong bộ nhớ cache. Vì vậy, nếu bạn chạy lại cmake ../source sau đó, nó sẽ sử dụng trình tạo như được chỉ định trong biến số CMAKE_GENERATOR trong bộ nhớ cache.

Đây chắc chắn không phải là giải pháp thanh lịch nhất, mặc dù ;-) Có thể sử dụng một tập tin batch để thực sự sẽ thực hiện cmake -G generator cho người sử dụng ...

+0

Tôi muốn họ cho phép người dùng đặt tất cả cấu hình trong 'CMakeLists.txt'. Điểm là gì nếu bạn cần một '.bat' trên nó? – Royi

+1

Hình như [câu trả lời của Ivan] (https://gitlab.kitware.com/cmake/cmake/issues/17231) thực hiện điều gì đó rất gần với điều này - biến được cấu hình trong tệp cấu hình cmake có nguồn gốc trước thực tế ' CMakeLists.txt' được tải. –

8

Đây là những gì làm việc cho tôi - tạo ra một tập tin gọi là PreLoad.cmake trong dir dự án của bạn có chứa này:

set (CMAKE_GENERATOR "Unix Makefiles" CACHE INTERNAL "" FORCE)

+2

Dường như hành vi 'Preload.cmake' không được ghi lại trong tài liệu về nguyên tắc" chính thức "; xem [ticket 17231] (https://gitlab.kitware.com/cmake/cmake/issues/17231) - nhưng tốt để biết! –

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