2012-07-10 43 views
14

Tôi sử dụng cmake để biên dịch chéo. Trong tệp chuỗi công cụ của tôi có một dòngBiên dịch chéo CMake: Cờ C từ tệp chuỗi công cụ bị bỏ qua

SET(CMAKE_C_FLAGS "-std=gnu99") 

Biến này không được đặt lại trong CMakeLists.txt.

Khi tôi chạy cmake -DCMAKE_TOOLCHAIN_FILE=toolchain.cmake .. cờ này bị bỏ qua.

Để chi tiết hơn: Dòng flags.cmake hiển thị dòng trống C_FLAGS =. Nhưng trong CMakeOutput.log Tôi có thể tìm thấy một dòng Build flags: -std=gnu99.

Tôi phát hiện ra rằng lần chạy thứ hai là cmake .. (cùng một hoặc không có tệp chuỗi công cụ được chỉ định) sẽ khắc phục sự cố này.

Nhưng tại sao nó không được thiết lập lần đầu tiên tôi chạy cmake ??

EDIT: Added MNWE

CMakeLists.txt:

cmake_minimum_required(VERSION 2.6) 
project(myproject) 

SET(files src/main.c) 

add_executable(myexec ${files}) 

avr.cmake:

SET(CMAKE_SYSTEM_NAME Generic) 

SET(CMAKE_C_COMPILER avr-gcc) 

SET(CMAKE_C_FLAGS "-std=gnu99") 
+0

Cảm ơn bạn! Tôi đã có vấn đề chính xác này. – DouglasHeriot

Trả lời

14

Tôi đã tìm thấy một giải pháp tạm thời bằng cách thay thế các dòng

SET(CMAKE_C_FLAGS "-std=gnu99") 

bởi

SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE) 
+0

Nó hoạt động, cảm ơn bạn (tôi đã thêm dòng ngay sau chỉ dẫn "dự án") –

7

Tôi chỉ muốn thêm một số thông tin cơ bản (được thảo luận ví dụ tại đây how to setup cmake_c/xx_flags per toolchain?).

Tóm lại, biến số CMAKE_<LANG>_FLAGS được lưu trong bộ nhớ cache bằng thiết kế trong các tập lệnh CMake<Lang>Information.cmake (nghĩa là bạn có thể thay đổi chúng trong ứng dụng GUI của CMake sau bước cấu hình).

Vì vậy, bạn phải - nếu đặt chúng trong tệp Toolchain - hãy đặt chúng trong bộ nhớ cache trước. Kịch bản riêng của CMake (được thực thi sau tệp Toolchain) không có kèm theo FORCE, vì vậy nó sẽ không ghi đè lên nó nữa.

Hãy xem vào CMakeCInformation.cmake (từ share \ cmake-2.8 \ Modules):

set(CMAKE_C_FLAGS_INIT "$ENV{CFLAGS} ${CMAKE_C_FLAGS_INIT}") 
# avoid just having a space as the initial value for the cache 
if(CMAKE_C_FLAGS_INIT STREQUAL " ") 
    set(CMAKE_C_FLAGS_INIT) 
endif() 
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS_INIT}" CACHE STRING 
    "Flags used by the compiler during all build types.") 

Như bạn thấy, cách chính thức để làm điều đó sẽ được sử dụng để tiêm CMAKE_C_FLAGS_INIT cờ bổ sung. Vấn đề là, những thay đổi sau này trong tệp Toolchain sẽ không được nhận ra (bộ đệm sẽ không bị ghi đè, xem ở trên).

Đưa tất cả điều này vào tài khoản, giải pháp tạm thời của bạn là lựa chọn đúng đắn.Để có thực sự chắc chắn - vì các tập tin toolchain được phân tách hai lần trong Configuration/quá trình Generation - thậm chí bạn có thể thêm một cuộc gọi UNSET trước khi thiết CMAKE_C_FLAGS trong tập tin toolchain của bạn:

UNSET(CMAKE_C_FLAGS CACHE) 
SET(CMAKE_C_FLAGS "-std=gnu99" CACHE STRING "" FORCE) 

Một giải pháp thường được tìm thấy là sử dụng cái gì đó như :

add_definitions(" -std=gnu99") 

để tiêm cờ biên dịch (nhưng đây không phải là định nghĩa cấu hình xây dựng, như định nghĩa biến). Xem thêm CMake clang and c++0x

Với CMake 2.8.12 đã có lệnh mới được giới thiệu, vì vậy bạn có thể làm (không dự thi, chỉ để hiển thị các khả năng):

add_compile_options("$<$<CONFIG:RELASE>:-std=gnu99>") 
add_compile_options("$<$<CONFIG:DEBUG>:-std=gnu99 -g3>") 

Xem What is the modern method for setting general compile flags in CMake?CMake generator expression, differentiate C/C++ code để biết thêm về vấn đề này.

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