2012-03-09 22 views
36

Làm cách nào để chuyển macro vào bộ tiền xử lý? Ví dụ, nếu tôi muốn biên dịch một số phần của mã của tôi bởi vì người dùng muốn biên dịch kiểm tra đơn vị, tôi sẽ làm điều này:CMake: Làm cách nào để chuyển các macro tiền xử lý

#ifdef _COMPILE_UNIT_TESTS_ 
    BLA BLA 
#endif //_COMPILE_UNIT_TESTS_ 

Bây giờ tôi cần phải vượt qua giá trị này từ CMake để Preprocessor. Thiết lập một biến không hoạt động, vì vậy làm thế nào tôi có thể thực hiện điều này?

+1

Bạn không thể chuyển macro vào trình biên dịch, các macro được đánh giá bởi trình biên dịch trước khi chúng tới trình biên dịch. –

+1

Xin lỗi vì đã không chính xác! Tôi đang đề cập đến MACROS thông qua để thực hiện biên dịch có điều kiện. – Killrazor

Trả lời

44

add_definitions(-DCOMPILE_UNIT_TESTS) (x CMake's doc) hoặc sửa đổi một trong các biến cờ (CMAKE_CXX_FLAGS, hoặc CMAKE_CXX_FLAGS_<configuration>) hoặc thiết COMPILE_FLAGS biến trên mục tiêu.

Ngoài ra, số nhận dạng bắt đầu bằng dấu gạch dưới theo sau là một chữ hoa được dành riêng cho việc triển khai. Các số nhận dạng có chứa dấu gạch dưới kép. Vì vậy, không sử dụng chúng.

+8

Cũng có thể được thực hiện từ dòng lệnh a la 'cmake .. -DCOMPILE_UNIT_TESTS' – dantswain

+8

@dantswain: Điều đó đặt biến bộ nhớ cache CMake. –

+4

Để thêm định nghĩa chỉ cho các mục tiêu cụ thể, hãy sử dụng [COMPILE_DEFINITIONS] (http://www.cmake.org/cmake/help/cmake-2-8-docs.html#prop_dir:COMPILE_DEFINITIONS). Ví dụ: 'set_target_properties (target1 target2 PROPERTIES COMPILE_DEFINITIONS" COMPILE_UNIT_TESTS ")' – Lesque

15

Nếu bạn có rất nhiều biến preprocessor để cấu hình, bạn có thể sử dụng configure_file:

Tạo một tập tin cấu hình, ví dụ như. config.h.in với

#cmakedefine _COMPILE_UNIT_TESTS_ 
#cmakedefine OTHER_CONSTANT 
... 

sau đó trong CMakeLists.txt của bạn:

set(_COMPILE_UNIT_TESTS_ ON CACHE BOOL "Compile unit tests") # Configurable by user 
set(OTHER_CONSTANT OFF) # Not configurable by user 
configure_file(config.h.in config.h) 

trong thư mục xây dựng, config.h được tạo ra:

#define _COMPILE_UNIT_TESTS_ 
/* #undef OTHER_CONSTANT */ 

Theo đề nghị của robotik, bạn nên thêm một cái gì đó giống như include_directories(${CMAKE_CURRENT_BINARY_DIR}) đến số CMakeLists.txt cho #include "config.h" để làm việc trong C++.

+1

@ robotik gợi ý rằng bạn cần 'include_directories ($ {PROJECT_BINARY_DIR})' hoặc khác CMake sẽ không bea ble để tìm 'config.h' được tạo ra. – drs

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