2016-01-22 904 views
5

我無法獲得cmake來測試是否已經定義了預處理器。例如:cmake:如何檢查是否定義了預處理器

cmake_minimum_required(VERSION 2.8.9) 
project (cmake-test) 
add_definitions(-DOS=LINUX) 

if(NOT <what condition goes here?>) 
    message(FATAL_ERROR "OS is not defined") 
endif() 

下面的測試不起作用:

if (NOT COMMAND OS) 
if (NOT DEFINED OS) 
if (NOT OS) 

我可以得到它通過使用set(),只是測試了常規cmake變量,然後定義預處理宏來工作。例如:

set(OS LINUX) 
if (OS) 
    add_definitions(-DOS=${OS}) 
else() 
    message(FATAL_ERROR "OS is not defined") 
endif() 

在情況下,你想知道爲什麼我需要測試它如果變量/預處理器是在文件,這是因爲在最終實施這些將來自這是一個外部文件include版在主CMakeFile.txt如:

include(project_defs.txt) 
if (OS) 
    .... 
+0

你是什麼意思的預處理器? CMake沒有一個... – usr1234567

+0

CMake自動定義了描述系統的幾個變量。所以你可以檢查(在'if'命令中)這些變量是否包含與操作系統相關的代碼。請參閱[提供信息的變量](https://cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html#variables-that-provide-information)。 – Tsyvarev

+0

@ usr1234567通過預處理器我的意思是''D'選項定義的'gcc'(與#define相同)的變量。 –

回答

1

通常情況下,被傳遞到編譯器的所有定義由CMake的控制。也就是說,您創建

option(SOMEFEATURE "Feature description" ON) 

set(OS "" CACHE STRING "Select your OS") 

用戶CMake的變量通過cmake -D OS=DOS或CMake的GUI設置它們。然後,您可以使用if()運算符來有條件地將add_definitions()添加到編譯器命令行。

UPDATE:

如果你真的想進入預處理器標誌,還有一個COMPILE_DEFINITIONS target屬性。你可以這樣訪問它:

get_target_property(OUTVAR target COMPILE_DEFINITIONS) 
+1

那麼我提到的第二種方法可能是我猜想的唯一方法。如果'cmake'允許通過'add_definitions'設置測試的東西,那將會很不錯。 –

+0

@MandeepSandhu查看更新的答案。 – arrowd

+0

感謝您的更新。我在'COMPILE_DEFINITIONS'中查找了'add_definitions()'的文檔提到它。然而,我無法獲取指定的定義(我嘗試了使用'get_target_property'的建議,但改爲使用'NOTFOUND')。我使用'cmake 2.8.12.2' –

1

這是通過箭頭完成答案。

我也試過了上面箭頭提到的COMPILE_DEFINITIONS選項,但沒有成功。

繼cmake的文件,至少在3.x版本,事實證明,當你在CMake的調用add_definitions(),它增加了定義到COMPILE_DEFINITIONS 目錄財產。

因此,可以說你要定義以下按您的代碼:

add_definitions(-DOS=LINUX) 

若要檢索與加入變量「MYDEFS」你可以用下面的線C進行定義字符串:

get_directory_property(MYDEFS COMPILE_DEFINITIONS) 
MESSAGE(STATUS "Compile defs contain: " ${MYDEFS}) 

然後你可以檢查是否在${MYDEFS}你正在尋找的定義是否存在。例如

if(MYDEFS MATCHES "^OS=" OR MYDEFS MATCHES ";OS=") 
    MESSAGE(STATUS "OS defined") 
else() 
    # You can define your OS here if desired 
endif()