CMakeLists.txt 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362
  1. #
  2. # A more complex test case
  3. #
  4. SET(CMAKE_BACKWARDS_COMPATIBILITY 1.4)
  5. PROJECT (Complex)
  6. # Choose whether to test CMakeLib.
  7. SET(COMPLEX_TEST_CMAKELIB 1)
  8. IF(CMAKE_TEST_DIFFERENT_GENERATOR)
  9. SET(COMPLEX_TEST_CMAKELIB 0)
  10. ENDIF(CMAKE_TEST_DIFFERENT_GENERATOR)
  11. IF(CMAKE_TEST_SYSTEM_LIBRARIES)
  12. SET(COMPLEX_TEST_CMAKELIB 0)
  13. ENDIF(CMAKE_TEST_SYSTEM_LIBRARIES)
  14. #
  15. # Define a macro
  16. #
  17. MACRO(ASSERT value msg)
  18. IF (NOT ${value})
  19. MESSAGE ("Assertion failure:" ${msg} )
  20. ENDIF (NOT ${value})
  21. ENDMACRO(ASSERT)
  22. # invoke the macro
  23. ASSERT(Complex_BINARY_DIR "The PROJECT command is broken")
  24. #
  25. # Define a var args macro, it must take two or four args
  26. #
  27. MACRO(TEST_ARGC value1 value2)
  28. ADD_DEFINITIONS(${value1} ${value2})
  29. IF (${ARGC} MATCHES 4)
  30. ADD_DEFINITIONS(${ARGV2} ${ARGV3})
  31. ENDIF (${ARGC} MATCHES 4)
  32. ENDMACRO(TEST_ARGC)
  33. # invoke the macro
  34. TEST_ARGC(-DCMAKE_ARGV1 -DCMAKE_ARGV2 -DCMAKE_ARGV3 -DCMAKE_ARGV4)
  35. MACRO(TEST_VAR_ARG fa)
  36. IF("${ARGV}" MATCHES "^1;2;3$")
  37. MESSAGE(STATUS "ARGV works")
  38. ELSE("${ARGV}" MATCHES "^1;2;3$")
  39. MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGV}\" instead of \"1;2;3\"")
  40. ENDIF("${ARGV}" MATCHES "^1;2;3$")
  41. IF("${ARGN}" MATCHES "^2;3$")
  42. MESSAGE(STATUS "ARGN works")
  43. ELSE("${ARGN}" MATCHES "^2;3$")
  44. MESSAGE(FATAL_ERROR "ARGV does not work; got \"${ARGN}\" instead of \"2;3\"")
  45. ENDIF("${ARGN}" MATCHES "^2;3$")
  46. ENDMACRO(TEST_VAR_ARG)
  47. TEST_VAR_ARG(1 2 3)
  48. #
  49. # Use the ansi CXX compile flag for building cmake
  50. #
  51. IF (CMAKE_ANSI_CXXFLAGS)
  52. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_ANSI_CXXFLAGS}")
  53. ENDIF (CMAKE_ANSI_CXXFLAGS)
  54. IF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
  55. IF(NOT CMAKE_COMPILER_IS_GNUCXX)
  56. SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -timplicit_local -no_implicit_include ")
  57. ENDIF(NOT CMAKE_COMPILER_IS_GNUCXX)
  58. ENDIF(CMAKE_SYSTEM MATCHES "OSF1-V.*")
  59. ADD_DEFINITIONS(-DCMAKE_IS_FUN)
  60. ADD_DEFINITIONS(-DCMAKE_IS_REALLY_FUN)
  61. SET(TEST_SEP "a b c")
  62. SEPARATE_ARGUMENTS(TEST_SEP)
  63. #
  64. # Include vars from a file and from a cache
  65. #
  66. IF (EXISTS ${Complex_SOURCE_DIR}/VarTests.cmake)
  67. INCLUDE(${Complex_SOURCE_DIR}/VarTests.cmake)
  68. ENDIF (EXISTS ${Complex_SOURCE_DIR}/VarTests.cmake)
  69. INCLUDE(fileshouldnotbehere OPTIONAL)
  70. LOAD_CACHE(${Complex_SOURCE_DIR}/Cache
  71. EXCLUDE
  72. CACHE_TEST_VAR_EXCLUDED
  73. INCLUDE_INTERNALS
  74. CACHE_TEST_VAR_INTERNAL)
  75. LOAD_CACHE(${Complex_SOURCE_DIR}/Cache READ_WITH_PREFIX foo CACHE_TEST_VAR2)
  76. IF(${fooCACHE_TEST_VAR2} MATCHES bar)
  77. MESSAGE("Load cache worked: ${fooCACHE_TEST_VAR2}")
  78. ELSE(${fooCACHE_TEST_VAR2} MATCHES bar)
  79. MESSAGE(FATAL_ERROR "Load cache with prefix failed: ${fooCACHE_TEST_VAR2}")
  80. ENDIF(${fooCACHE_TEST_VAR2} MATCHES bar)
  81. #
  82. # Specify include and lib dirs
  83. # (BEFORE is for coverage)
  84. #
  85. INCLUDE_DIRECTORIES(
  86. Library
  87. ${Complex_SOURCE_DIR}/../../Source
  88. ${Complex_BINARY_DIR}/../../Source
  89. )
  90. INCLUDE_DIRECTORIES(BEFORE
  91. ${Complex_BINARY_DIR}
  92. )
  93. INCLUDE_DIRECTORIES(SYSTEM Library/SystemDir)
  94. INCLUDE_REGULAR_EXPRESSION("^(cmTest|file|sharedFile|test).*$" "^cmMissing")
  95. LINK_DIRECTORIES(
  96. ${Complex_BINARY_DIR}/Library
  97. )
  98. #
  99. # check for SET CACHE FORCE
  100. #
  101. SET(FORCE_TEST 1 CACHE STRING "a test")
  102. SET(FORCE_TEST 0 CACHE STRING "a test" FORCE)
  103. #
  104. # Lib and exe path
  105. #
  106. SET (LIBRARY_OUTPUT_PATH
  107. ${Complex_BINARY_DIR}/bin/ CACHE INTERNAL
  108. "Single output directory for building all libraries.")
  109. SET (EXECUTABLE_OUTPUT_PATH
  110. ${Complex_BINARY_DIR}/bin/ CACHE INTERNAL
  111. "Single output directory for building all executables.")
  112. MESSAGE (Test " " escape " " semi-colon " " \; \;)
  113. #
  114. # Exec program (TODO: test a result)
  115. # Increase coverage.
  116. #
  117. MESSAGE("\nIgnore this message")
  118. OPTION(NO_EXEC_PROGRAM "Do not test EXEC_PROGRAM" 0)
  119. IF (NOT NO_EXEC_PROGRAM)
  120. EXEC_PROGRAM(${CMAKE_COMMAND} ARGS -E echo NO_EXEC_PROGRAM "${Complex_BINARY_DIR}")
  121. ELSE (NOT NO_EXEC_PROGRAM)
  122. MESSAGE("Set this option ON")
  123. ENDIF (NOT NO_EXEC_PROGRAM)
  124. MARK_AS_ADVANCED(NO_EXEC_PROGRAM)
  125. MARK_AS_ADVANCED(CLEAR NO_EXEC_PROGRAM)
  126. # Execute a process. Add coverage for this command.
  127. EXECUTE_PROCESS(
  128. COMMAND ${CMAKE_COMMAND} -E echo "ABCDEFG"
  129. OUTPUT_VARIABLE TEST_OUT
  130. )
  131. IF("${TEST_OUT}" MATCHES "^ABCDEFG\n$")
  132. ELSE("${TEST_OUT}" MATCHES "^ABCDEFG\n$")
  133. MESSAGE(SEND_ERROR "EXECUTE_PROCESS output test failed: [${TEST_OUT}]")
  134. ENDIF("${TEST_OUT}" MATCHES "^ABCDEFG\n$")
  135. # This test has some problems on UNIX systems. Disabling for now.
  136. #
  137. # EXECUTE_PROCESS(
  138. # COMMAND ${CMAKE_COMMAND} -E echo "ABCDEFG"
  139. # COMMAND /process/does/not/exist
  140. # OUTPUT_QUIET
  141. # ERROR_QUIET
  142. # RESULT_VARIABLE RESULT
  143. # )
  144. # IF("${RESULT}" MATCHES "^0$")
  145. # MESSAGE(SEND_ERROR
  146. # "EXECUTE_PROCESS result test failed with RESULT=[${RESULT}]")
  147. # ELSE("${RESULT}" MATCHES "^0$")
  148. # MESSAGE(STATUS "EXECUTE_PROCESS result test passed with RESULT=[${RESULT}]")
  149. # ENDIF("${RESULT}" MATCHES "^0$")
  150. #
  151. # Create directory.
  152. # The 'complex' executable will then test if this dir exists,
  153. # sadly it won't be able to remove it.
  154. #
  155. MAKE_DIRECTORY("${Complex_BINARY_DIR}/make_dir")
  156. #
  157. # Test FIND_LIBARY
  158. # Create a dummy empty lib
  159. #
  160. CONFIGURE_FILE(
  161. ${Complex_SOURCE_DIR}/Library/dummy
  162. ${Complex_BINARY_DIR}/Library/dummylib.lib
  163. COPYONLY IMMEDIATE)
  164. FOREACH (ext ${CMAKE_SHLIB_SUFFIX};.so;.a;.sl)
  165. CONFIGURE_FILE(
  166. ${Complex_SOURCE_DIR}/Library/dummy
  167. ${Complex_BINARY_DIR}/Library/libdummylib${ext}
  168. COPYONLY IMMEDIATE)
  169. ENDFOREACH (ext)
  170. FIND_LIBRARY(FIND_DUMMY_LIB
  171. dummylib
  172. PATHS
  173. ${Complex_BINARY_DIR}/Library DOC "find dummy lib")
  174. FIND_LIBRARY(FIND_DUMMY_LIB
  175. NAMES dummylib dummylib2
  176. PATHS
  177. ${Complex_BINARY_DIR}/Library DOC "find dummy lib")
  178. #
  179. # Test SET_SOURCE_FILES_PROPERTIES
  180. #
  181. SET_SOURCE_FILES_PROPERTIES(nonexisting_file2
  182. GENERATED
  183. ABSTRACT
  184. WRAP_EXCLUDE
  185. COMPILE_FLAGS "-foo -bar")
  186. GET_SOURCE_FILE_PROPERTY(FILE_HAS_ABSTRACT nonexisting_file2 ABSTRACT)
  187. GET_SOURCE_FILE_PROPERTY(FILE_HAS_WRAP_EXCLUDE nonexisting_file2 WRAP_EXCLUDE)
  188. GET_SOURCE_FILE_PROPERTY(FILE_COMPILE_FLAGS nonexisting_file2 COMPILE_FLAGS)
  189. SET_SOURCE_FILES_PROPERTIES(nonexisting_file3 PROPERTIES
  190. GENERATED 1
  191. ABSTRACT 1
  192. WRAP_EXCLUDE 1
  193. COMPILE_FLAGS "-foo -bar")
  194. GET_SOURCE_FILE_PROPERTY(FILE_HAS_ABSTRACT nonexisting_file3 ABSTRACT)
  195. GET_SOURCE_FILE_PROPERTY(FILE_HAS_WRAP_EXCLUDE nonexisting_file3 WRAP_EXCLUDE)
  196. GET_SOURCE_FILE_PROPERTY(FILE_COMPILE_FLAGS nonexisting_file3 COMPILE_FLAGS)
  197. #
  198. # Test registry (win32)
  199. # Create a file, put its path in a registry key, try to find the file in that
  200. # path using that registry key, then remove the file and the key
  201. #
  202. IF (WIN32)
  203. IF (NOT UNIX)
  204. SET(dir "${Complex_BINARY_DIR}/registry_dir")
  205. SET(file "registry_test_dummy")
  206. SET(hkey "HKEY_CURRENT_USER\\Software\\Kitware\\CMake\\Tests\\Complex;registry_test")
  207. CONFIGURE_FILE(
  208. ${Complex_SOURCE_DIR}/Library/dummy
  209. "${dir}/${file}"
  210. COPYONLY IMMEDIATE)
  211. EXEC_PROGRAM(${CMAKE_COMMAND} ARGS "-E write_regv \"${hkey}\" \"${dir}\"")
  212. FIND_PATH(REGISTRY_TEST_PATH
  213. ${file}
  214. "[${hkey}]" DOC "Registry_Test_Path")
  215. EXEC_PROGRAM(${CMAKE_COMMAND} ARGS "-E delete_regv \"${hkey}\"")
  216. EXEC_PROGRAM(${CMAKE_COMMAND} ARGS "-E remove \"${dir}/${file}\"")
  217. ENDIF (NOT UNIX)
  218. ENDIF (WIN32)
  219. #
  220. # Test a set and a remove
  221. #
  222. SET(REMOVE_STRING a b c d e f)
  223. SET(removeVar1 c e)
  224. REMOVE(REMOVE_STRING ${removeVar1} f)
  225. #
  226. # Test an IF inside a FOREACH.
  227. #
  228. FOREACH(x "a")
  229. IF(${x} MATCHES "a")
  230. # Should always execute.
  231. SET(IF_INSIDE_FOREACH_THEN_EXECUTED 1)
  232. ELSE(${x} MATCHES "a")
  233. # Should never execute.
  234. SET(IF_INSIDE_FOREACH_ELSE_EXECUTED 1)
  235. ENDIF(${x} MATCHES "a")
  236. ENDFOREACH(x)
  237. # test WHILE command
  238. SET (while_var 1)
  239. WHILE (while_var LESS 1000)
  240. SET(while_var ${while_var}0)
  241. ENDWHILE(while_var LESS 1000)
  242. SET(SHOULD_BE_ZERO )
  243. SET(SHOULD_BE_ONE 1)
  244. # test elseif functionality, the mess below tries to catch problem
  245. # of clauses being executed early or late etc
  246. set (RESULT 3)
  247. if (RESULT EQUAL 1)
  248. if (RESULT EQUAL 2)
  249. set (ELSEIF_RESULT 1)
  250. elseif (RESULT EQUAL 3)
  251. set (ELSEIF_RESULT 1)
  252. endif (RESULT EQUAL 2)
  253. elseif (RESULT EQUAL 2)
  254. set (ELSEIF_RESULT 1)
  255. elseif (RESULT EQUAL 3)
  256. if (RESULT EQUAL 2)
  257. set (ELSEIF_RESULT 1)
  258. elseif (RESULT EQUAL 3)
  259. if (NOT ELSEIF_RESULT EQUAL 1)
  260. set (ELSEIF_RESULT 2)
  261. endif (NOT ELSEIF_RESULT EQUAL 1)
  262. endif (RESULT EQUAL 2)
  263. elseif (RESULT EQUAL 4)
  264. if (RESULT EQUAL 2)
  265. set (ELSEIF_RESULT 1)
  266. elseif (RESULT EQUAL 3)
  267. set (ELSEIF_RESULT 1)
  268. endif (RESULT EQUAL 2)
  269. else (RESULT EQUAL 1)
  270. if (RESULT EQUAL 2)
  271. set (ELSEIF_RESULT 1)
  272. elseif (RESULT EQUAL 3)
  273. set (ELSEIF_RESULT 1)
  274. endif (RESULT EQUAL 2)
  275. endif (RESULT EQUAL 1)
  276. if (NOT ELSEIF_RESULT EQUAL 2)
  277. set (ELSEIF_RESULT 0)
  278. endif (NOT ELSEIF_RESULT EQUAL 2)
  279. #
  280. # Configure file
  281. # (plug vars to #define so that they can be tested)
  282. #
  283. CONFIGURE_FILE(
  284. ${Complex_SOURCE_DIR}/cmTestConfigure.h.in
  285. ${Complex_BINARY_DIR}/cmTestConfigure.h)
  286. SET(STRING_WITH_QUOTES "\"hello world\"")
  287. # test CONFIGURE_FILE with ESCAPE_QUOTES on
  288. CONFIGURE_FILE(
  289. ${Complex_SOURCE_DIR}/cmTestConfigureEscape.h.in
  290. ${Complex_BINARY_DIR}/cmTestConfigureEscape.h ESCAPE_QUOTES)
  291. # Test regular expression commands.
  292. STRING(REGEX MATCH "b" RESULT "abc")
  293. IF(NOT RESULT)
  294. MESSAGE(SEND_ERROR "STRING(REGEX MATCH ... ) test failed.")
  295. ENDIF(NOT RESULT)
  296. STRING(REGEX MATCHALL "b" RESULT "abcb")
  297. IF(NOT RESULT)
  298. MESSAGE(SEND_ERROR "STRING(REGEX MATCHALL ... ) test failed.")
  299. ENDIF(NOT RESULT)
  300. STRING(REGEX REPLACE ".([bd])." "[\\1]" RESULT "a(b)c(d)e")
  301. IF("x${RESULT}" MATCHES "^xa\\[b\\]c\\[d\\]e$")
  302. SET(STRING_REGEX_PASSED 1)
  303. ENDIF("x${RESULT}" MATCHES "^xa\\[b\\]c\\[d\\]e$")
  304. IF(NOT STRING_REGEX_PASSED)
  305. MESSAGE(SEND_ERROR
  306. "STRING(REGEX REPLACE ... ) test failed (\"${RESULT}\" v. \"a[b]c[d]e\")")
  307. ENDIF(NOT STRING_REGEX_PASSED)
  308. #
  309. # Create the libs and the main exe
  310. #
  311. ADD_SUBDIRECTORY(Library)
  312. ADD_SUBDIRECTORY(Executable)
  313. SUBDIR_DEPENDS(Executable Library)
  314. EXPORT_LIBRARY_DEPENDENCIES(${Complex_BINARY_DIR}/ComplexLibraryDepends.cmake)
  315. INCLUDE(${Complex_BINARY_DIR}/ComplexLibraryDepends.cmake OPTIONAL)