diff options
author | Brad King <brad.king@kitware.com> | 2008-01-14 14:20:58 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2008-01-14 14:20:58 (GMT) |
commit | 8262ccfd4efddd4928070c637ef7c414633b4b1e (patch) | |
tree | c276e3f4ec61422534586a008739bd668e1b9ce3 /Tests/Preprocess/CMakeLists.txt | |
parent | 2c42f755225c0cb30f04f07c9f5bd23f65ad0bd2 (diff) | |
download | CMake-8262ccfd4efddd4928070c637ef7c414633b4b1e.zip CMake-8262ccfd4efddd4928070c637ef7c414633b4b1e.tar.gz CMake-8262ccfd4efddd4928070c637ef7c414633b4b1e.tar.bz2 |
ENH: Create COMPILE_DEFINITIONS property for targets and source files. Create <config>_COMPILE_DEFINITIONS property as per-configuration version. Add Preprocess test to test the feature. Document limitations on Xcode and VS6 generators.
Diffstat (limited to 'Tests/Preprocess/CMakeLists.txt')
-rw-r--r-- | Tests/Preprocess/CMakeLists.txt | 181 |
1 files changed, 181 insertions, 0 deletions
diff --git a/Tests/Preprocess/CMakeLists.txt b/Tests/Preprocess/CMakeLists.txt new file mode 100644 index 0000000..3631072 --- /dev/null +++ b/Tests/Preprocess/CMakeLists.txt @@ -0,0 +1,181 @@ +project(Preprocess) + +# This test is meant both as a test and as a reference for supported +# syntax on native tool command lines. + +#----------------------------------------------------------------------------- +# Construct a C-string literal to test passing through a definition on +# the command line. We configure the value into a header so it can be +# checked in the executable at runtime. The semicolon is handled +# specially because it needs to be escaped in the COMPILE_DEFINITIONS +# property value to avoid separating definitions but the string value +# must not have it escaped inside the configured header. +set(STRING_EXTRA "") + +if("${CMAKE_GENERATOR}" MATCHES "Make" AND MSVC) + set(NMAKE 1) +endif("${CMAKE_GENERATOR}" MATCHES "Make" AND MSVC) + +if(NOT BORLAND) + # Borland: ; + # The Borland compiler will simply not accept a non-escaped semicolon + # on the command line. If it is escaped \; then the escape character + # shows up in the preprocessing output too. + set(SEMICOLON "\;") +endif(NOT BORLAND) + +if(NOT BORLAND AND NOT WATCOM) + # Borland, WMake: multiple spaces + # The make tool seems to remove extra whitespace from inside + # quoted strings when passing to the compiler. It does not have + # trouble passing to other tools, and the compiler may be directly + # invoked from the command line. + set(STRING_EXTRA "${STRING_EXTRA} ") +endif(NOT BORLAND AND NOT WATCOM) + +if(NOT "${CMAKE_GENERATOR}" MATCHES "Visual Studio") + # VS: , + # Visual Studio will not accept a comma in the value of a definition. + # The comma-separated list of PreprocessorDefinitions in the project + # file seems to be parsed before the content of entries is examined. + set(STRING_EXTRA "${STRING_EXTRA},") +endif(NOT "${CMAKE_GENERATOR}" MATCHES "Visual Studio") + +if(NOT MINGW) + # MinGW: & + # When inside -D"FOO=\"a & b\"" MinGW make wants -D"FOO=\"a "&" b\"" + # but it does not like quoted ampersand elsewhere. + set(STRING_EXTRA "${STRING_EXTRA}&") +endif(NOT MINGW) + +if(NOT MINGW) + # MinGW: | + # When inside -D"FOO=\"a | b\"" MinGW make wants -D"FOO=\"a "|" b\"" + # but it does not like quoted pipe elsewhere. + set(STRING_EXTRA "${STRING_EXTRA}|") +endif(NOT MINGW) + +if(NOT BORLAND AND NOT MINGW AND NOT NMAKE) + # Borland, NMake, MinGW: ^ + # When inside -D"FOO=\"a ^ b\"" they make wants -D"FOO=\"a "^" b\"" + # but do not like quoted carrot elsewhere. In NMake the non-quoted + # syntax works when the flags are not in a make variable. + set(STRING_EXTRA "${STRING_EXTRA}^") +endif(NOT BORLAND AND NOT MINGW AND NOT NMAKE) + +if(NOT BORLAND AND NOT MINGW AND NOT NMAKE) + # Borland, MinGW: < > + # Angle-brackets have funny behavior that is hard to escape. + set(STRING_EXTRA "${STRING_EXTRA}<>") +endif(NOT BORLAND AND NOT MINGW AND NOT NMAKE) + +# General: \" +# Make tools do not reliably accept \\\" syntax: +# - MinGW and MSYS make tools crash with \\\" +# - Borland make actually wants a mis-matched quote \\" +# or $(BACKSLASH)\" where BACKSLASH is a variable set to \\ +# - VS IDE gets confused about the bounds of the definition value \\\" +# - NMake is okay with just \\\" +if(NMAKE OR "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") + set(STRING_EXTRA "${STRING_EXTRA}\\\"") +endif(NMAKE OR "${CMAKE_GENERATOR}" MATCHES "Unix Makefiles") + +# General: # +# MSVC will not accept a # in the value of a string definition on the +# command line. The character seems to be simply replaced by an +# equals =. According to "cl -help" definitions may be specified by +# -DMACRO#VALUE as well as -DMACRO=VALUE. It must be implemented by a +# simple search-and-replace. +# +# The Borland compiler will parse both # and \# as just # but the make +# tool seems to want \# sometimes and not others. +# +# Unix make does not like # in variable settings without extra +# escaping. This could probably be fixed but since MSVC does not +# support it and it is not an operator it is not worthwhile. + +# Compose the final test string. +set(STRING_VALUE "hello `~!@$%*)(_+-=}{][:'.?/ ${STRING_EXTRA}world") + +#----------------------------------------------------------------------------- +# Function-style macro command-line support: +# - Borland does not support +# - MSVC does not support +# - Watcom does not support +# - GCC supports + +# Too few platforms support this to bother implementing. +# People can just configure headers with the macros. + +#----------------------------------------------------------------------------- +# Construct a sample expression to pass as a macro definition. + +set(EXPR "x*y+!(x==(y+1*2))*f(x%2)") + +if(NOT WATCOM) + # Watcom does not support - or / because it parses them as options. + set(EXPR "${EXPR}+y/x-x") +endif(NOT WATCOM) + +#----------------------------------------------------------------------------- + +# Inform the test if the debug configuration is getting built. +# The NDEBUG definition takes care of this for release. +set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -DPREPROCESS_DEBUG") +set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DPREPROCESS_DEBUG") + +# Inform the test if it built from Xcode or VS6 IDE. +if(XCODE) + set(PREPROCESS_XCODE 1) +endif(XCODE) +if("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6") + set(PREPROCESS_VS6 1) + set(VS6 _vs6) +endif("${CMAKE_GENERATOR}" MATCHES "Visual Studio 6") + +# Test old-style definitions. +add_definitions(-DOLD_DEF -DOLD_EXPR=2) + +set(FILE_PATH "${Preprocess_SOURCE_DIR}/file_def.h") +set(TARGET_PATH "${Preprocess_SOURCE_DIR}/target_def.h") + +# Create a list of definition property strings. +set(TARGET_DEFS "TARGET_DEF") +set(FILE_DEFS "FILE_DEF") + +# Add definitions with values. VS6 does not support this. +if(NOT PREPROCESS_VS6) + list(APPEND TARGET_DEFS + "TARGET_STRING=\"${STRING_VALUE}${SEMICOLON}\"" + "TARGET_EXPR=${EXPR}" + "TARGET_PATH=\"${TARGET_PATH}\"" + ) + list(APPEND FILE_DEFS + "FILE_STRING=\"${STRING_VALUE}${SEMICOLON}\"" + "FILE_EXPR=${EXPR}" + "FILE_PATH=\"${FILE_PATH}\"" + ) +endif(NOT PREPROCESS_VS6) + +add_executable(Preprocess preprocess.c preprocess${VS6}.cxx) +set_target_properties(Preprocess PROPERTIES + COMPILE_DEFINITIONS "${TARGET_DEFS}" + DEBUG_COMPILE_DEFINITIONS "TARGET_DEF_DEBUG" + RELEASE_COMPILE_DEFINITIONS "TARGET_DEF_RELEASE" + ) +set_source_files_properties(preprocess.c preprocess${VS6}.cxx PROPERTIES + COMPILE_DEFINITIONS "${FILE_DEFS}" + DEBUG_COMPILE_DEFINITIONS "FILE_DEF_DEBUG" + RELEASE_COMPILE_DEFINITIONS "FILE_DEF_RELEASE" + ) + +# Helper target for running test manually in build tree. +add_custom_target(drive COMMAND Preprocess) + +# Configure the header file with the desired string value. +if(SEMICOLON) + set(STRING_VALUE "${STRING_VALUE};") +endif(SEMICOLON) +configure_file(${Preprocess_SOURCE_DIR}/preprocess.h.in + ${Preprocess_BINARY_DIR}/preprocess.h) +include_directories(${Preprocess_BINARY_DIR}) |