2016-01-22 26 views
5

Ich kann cmake nicht testen, ob ein Präprozessor definiert wurde oder nicht. ZB:cmake: Wie überprüft man, ob der Präprozessor definiert ist

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() 

Die folgenden Tests nicht funktionieren:

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

ich es mithilfe set() zu arbeiten und die Prüfung nur für einen regelmäßigen cmake Variable und dann die Definition der Präprozessormakro. ZB:

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

Falls Sie sich fragen, warum ich es testen müssen, wenn die Variable/Präprozessor in der gleichen Datei ist, dann ist es, weil in der letzten Durchführung dieser aus einer externen Datei kommen, die ist include ed im Haupt CMakeFile.txt Eg:

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

Was meinst du mit Pre-Prozessor? CMake hat keinen ... – usr1234567

+0

CMake definiert automatisch mehrere Variablen, die das System beschreiben.Sie können also diese Variablen (in 'if'-Befehl) prüfen, um OS-abhängigen Code einzuschließen. Siehe [Variablen, die Informationen bereitstellen] (https://cmake.org/cmake/help/v3.0/manual/cmake-variables.7.html#variables-that-provide-information). – Tsyvarev

+0

@ usr1234567 von Pre-Prozessor Ich meine eine Variable definiert durch die '-D-Option zu' gcc' (das gleiche wie '# define'). –

Antwort

1

Normalerweise werden alle Definitionen, die an den Compiler übergeben werden, werden durch CMake gesteuert. Das heißt, Sie eine CMake Variable mit

option(SOMEFEATURE "Feature description" ON) 

oder

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

Benutzer stellt sie über cmake -D OS=DOS oder in der CMake GUI erstellen. Dann können Sie den Operator if() unter der Bedingung add_definitions() an die Compiler-Befehlszeile verwenden.

UPDATE:

Wenn Sie wirklich Präprozessor Flags zugreifen möchten, gibt es eine COMPILE_DEFINITIONS Zieleigenschaft. Sie können auf diese Weise darauf zugreifen:

get_target_property(OUTVAR target COMPILE_DEFINITIONS) 
+1

Also ist der zweite Ansatz, den ich erwähnt habe, wahrscheinlich der einzige Weg, dies zu tun, denke ich. Es wäre schön gewesen, wenn 'cmake' Tests erlauben würde, die über' add_definitions' gesetzt werden. –

+0

@MandeepSandhu Siehe aktualisierte Antwort. – arrowd

+0

Danke für das Update. Ich habe in den 'COMPILE_DEFINITIONS' nachgeschaut, wie die Dokumente für' add_definitions() 'es erwähnen. Allerdings konnte ich die angegebenen Definitionen nicht abrufen (Ich habe Ihren Vorschlag, 'get_target_property' zu verwenden, aber stattdessen' NOTFOUND' verwendet). Ich benutze 'cmake 2.8.12.2' –

1

Dies ist die Antwort von arrowd abzuschließen.

Ich versuchte auch die COMPILE_DEFINITIONS -Option wie oben erwähnt von arrowd erfolglos.

Im Anschluss an die Dokumentation von CMake, zumindest für Version 3.x, stellt sich heraus, dass, wenn Sie add_definitions() in CMake nennen es die Definitionen der COMPILE_DEFINITIONS Verzeichnis Eigenschaft hinzufügt.

Daher lässt, sagen Sie folgende wie pro Ihren Code definieren:

add_definitions(-DOS=LINUX) 

Um die Zeichenfolge mit den Definitionen abrufen in die Variable hinzugefügt „MYDEFS“ können Sie die folgenden Zeilen in CMake verwenden können:

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

Dann können Sie überprüfen, ob in ${MYDEFS} die Definition, nach der Sie suchen, existiert oder nicht. Zum Beispiel

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