basics.cmake 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  1. if(CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8 )
  2. set( TORQUE_CPU_X64 ON)
  3. elseif( CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 4 )
  4. set (TORQUE_CPU_X32 ON)
  5. endif()
  6. if(NOT TORQUE_APP_DIR)
  7. set(TORQUE_APP_DIR "${CMAKE_SOURCE_DIR}")
  8. endif()
  9. set(libDir "${CMAKE_SOURCE_DIR}/engine/lib")
  10. set(srcDir "${CMAKE_SOURCE_DIR}/engine/source")
  11. set(cmakeDir "${CMAKE_SOURCE_DIR}/tools/CMake")
  12. # hide some things
  13. mark_as_advanced(CMAKE_INSTALL_PREFIX)
  14. mark_as_advanced(CMAKE_CONFIGURATION_TYPES)
  15. ###############################################################################
  16. ### Source File Handling
  17. ###############################################################################
  18. # finds and adds sources files in a folder
  19. macro(addPath dir)
  20. set(tmp_files "")
  21. set(glob_config GLOB)
  22. if(${ARGC} GREATER 1 AND "${ARGV1}" STREQUAL "REC")
  23. set(glob_config GLOB_RECURSE)
  24. endif()
  25. set(mac_files "")
  26. if(APPLE)
  27. set(mac_files ${dir}/*.mm ${dir}/*.m)
  28. endif()
  29. file(${glob_config} tmp_files
  30. ${dir}/*.cpp
  31. ${dir}/*.c
  32. ${dir}/*.cc
  33. ${dir}/*.h
  34. #${dir}/*.neon.asm
  35. #${dir}/*.asm
  36. ${mac_files}
  37. #${dir}/*.asm
  38. )
  39. foreach(entry ${BLACKLIST})
  40. list(REMOVE_ITEM tmp_files ${dir}/${entry})
  41. endforeach()
  42. LIST(APPEND ${PROJECT_NAME}_files "${tmp_files}")
  43. LIST(APPEND ${PROJECT_NAME}_paths "${dir}")
  44. #message(STATUS "addPath ${PROJECT_NAME} : ${tmp_files}")
  45. endmacro()
  46. # adds a file to the sources
  47. macro(addFile filename)
  48. LIST(APPEND ${PROJECT_NAME}_files "${filename}")
  49. #message(STATUS "addFile ${PROJECT_NAME} : ${filename}")
  50. endmacro()
  51. # finds and adds sources files in a folder recursively
  52. macro(addPathRec dir)
  53. addPath("${dir}" "REC")
  54. endmacro()
  55. ###############################################################################
  56. ### Definition Handling
  57. ###############################################################################
  58. macro(__addDef def config)
  59. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  60. if(TARGET ${PROJECT_NAME})
  61. #message(STATUS "directly applying defs: ${PROJECT_NAME} with config ${config}: ${def}")
  62. if("${config}" STREQUAL "")
  63. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS ${def})
  64. else()
  65. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:${config}>:${def}>)
  66. endif()
  67. else()
  68. if("${config}" STREQUAL "")
  69. list(APPEND ${PROJECT_NAME}_defs_ ${def})
  70. else()
  71. list(APPEND ${PROJECT_NAME}_defs_ $<$<CONFIG:${config}>:${def}>)
  72. endif()
  73. #message(STATUS "added definition to cache: ${PROJECT_NAME}_defs_: ${${PROJECT_NAME}_defs_}")
  74. endif()
  75. endmacro()
  76. # adds a definition: argument 1: Nothing(for all), _DEBUG, _RELEASE, <more build configurations>
  77. macro(addDef def)
  78. set(def_configs "")
  79. if(${ARGC} GREATER 1)
  80. foreach(config ${ARGN})
  81. __addDef(${def} ${config})
  82. endforeach()
  83. else()
  84. __addDef(${def} "")
  85. endif()
  86. endmacro()
  87. # this applies cached definitions onto the target
  88. macro(_process_defs)
  89. if(DEFINED ${PROJECT_NAME}_defs_)
  90. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS ${${PROJECT_NAME}_defs_})
  91. #message(STATUS "applying defs to project ${PROJECT_NAME}: ${${PROJECT_NAME}_defs_}")
  92. endif()
  93. endmacro()
  94. ###############################################################################
  95. ### Source Library Handling
  96. ###############################################################################
  97. macro(addLibSrc libPath)
  98. set(cached_project_name ${PROJECT_NAME})
  99. include(${libPath})
  100. project(${cached_project_name})
  101. endmacro()
  102. ###############################################################################
  103. ### Linked Library Handling
  104. ###############################################################################
  105. macro(addLib libs)
  106. foreach(lib ${libs})
  107. # check if we can build it ourselfs
  108. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  109. addLibSrc("${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  110. endif()
  111. # then link against it
  112. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  113. if(TARGET ${PROJECT_NAME})
  114. target_link_libraries(${PROJECT_NAME} "${lib}")
  115. else()
  116. list(APPEND ${PROJECT_NAME}_libs ${lib})
  117. endif()
  118. endforeach()
  119. endmacro()
  120. #addLibRelease will add to only release builds
  121. macro(addLibRelease libs)
  122. foreach(lib ${libs})
  123. # check if we can build it ourselfs
  124. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  125. addLibSrc("${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  126. endif()
  127. # then link against it
  128. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  129. if(TARGET ${PROJECT_NAME})
  130. target_link_libraries(${PROJECT_NAME} optimized "${lib}")
  131. else()
  132. list(APPEND ${PROJECT_NAME}_libsRelease ${lib})
  133. endif()
  134. endforeach()
  135. endmacro()
  136. #addLibDebug will add to only debug builds
  137. macro(addLibDebug libs)
  138. foreach(lib ${libs})
  139. # check if we can build it ourselfs
  140. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  141. addLibSrc("${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  142. endif()
  143. # then link against it
  144. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  145. if(TARGET ${PROJECT_NAME})
  146. target_link_libraries(${PROJECT_NAME} debug "${lib}")
  147. else()
  148. list(APPEND ${PROJECT_NAME}_libsDebug ${lib})
  149. endif()
  150. endforeach()
  151. endmacro()
  152. # this applies cached definitions onto the target
  153. macro(_process_libs)
  154. if(DEFINED ${PROJECT_NAME}_libs)
  155. target_link_libraries(${PROJECT_NAME} "${${PROJECT_NAME}_libs}")
  156. endif()
  157. if(DEFINED ${PROJECT_NAME}_libsRelease)
  158. target_link_libraries(${PROJECT_NAME} optimized "${${PROJECT_NAME}_libsRelease}")
  159. endif()
  160. if(DEFINED ${PROJECT_NAME}_libsDebug)
  161. target_link_libraries(${PROJECT_NAME} debug "${${PROJECT_NAME}_libsDebug}")
  162. endif()
  163. endmacro()
  164. # apple frameworks
  165. macro(addFramework framework)
  166. if (APPLE)
  167. addLib("-framework ${framework}")
  168. endif()
  169. endmacro()
  170. ###############################################################################
  171. ### Include Handling
  172. ###############################################################################
  173. macro(addInclude incPath)
  174. if(TARGET ${PROJECT_NAME})
  175. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${incPath}")
  176. else()
  177. list(APPEND ${PROJECT_NAME}_includes ${incPath})
  178. endif()
  179. endmacro()
  180. # this applies cached definitions onto the target
  181. macro(_process_includes)
  182. if(DEFINED ${PROJECT_NAME}_includes)
  183. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${${PROJECT_NAME}_includes}")
  184. endif()
  185. endmacro()
  186. ###############################################################################
  187. macro(_postTargetProcess)
  188. _process_includes()
  189. _process_defs()
  190. _process_libs()
  191. endmacro()
  192. # adds a path to search for libs
  193. macro(addLibPath dir)
  194. link_directories(${dir})
  195. endmacro()
  196. # creates a proper filter for VS
  197. macro(generateFilters relDir)
  198. foreach(f ${${PROJECT_NAME}_files})
  199. # Get the path of the file relative to ${DIRECTORY},
  200. # then alter it (not compulsory)
  201. file(RELATIVE_PATH SRCGR ${relDir} ${f})
  202. set(SRCGR "${PROJECT_NAME}/${SRCGR}")
  203. # Extract the folder, ie remove the filename part
  204. string(REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRCGR ${SRCGR})
  205. # do not have any ../ dirs
  206. string(REPLACE "../" "" SRCGR ${SRCGR})
  207. # Source_group expects \\ (double antislash), not / (slash)
  208. string(REPLACE / \\ SRCGR ${SRCGR})
  209. #STRING(REPLACE "//" "/" SRCGR ${SRCGR})
  210. #message(STATUS "FILE: ${f} -> ${SRCGR}")
  211. source_group("${SRCGR}" FILES ${f})
  212. endforeach()
  213. endmacro()
  214. # creates a proper filter for VS
  215. macro(generateFiltersSpecial relDir)
  216. foreach(f ${${PROJECT_NAME}_files})
  217. # Get the path of the file relative to ${DIRECTORY},
  218. # then alter it (not compulsory)
  219. file(RELATIVE_PATH SRCGR ${relDir} ${f})
  220. set(SRCGR "torque2d/${SRCGR}")
  221. # Extract the folder, ie remove the filename part
  222. string(REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRCGR ${SRCGR})
  223. # do not have any ../ dirs
  224. string(REPLACE "../" "" SRCGR ${SRCGR})
  225. IF("${SRCGR}" MATCHES "^torque2d/Projects/.*$")
  226. string(REPLACE "torque2d/Projects/${PROJECT_NAME}/" "" SRCGR ${SRCGR})
  227. string(REPLACE "/source" "" SRCGR ${SRCGR})
  228. endif()
  229. # Source_group expects \\ (double antislash), not / (slash)
  230. string(REPLACE / \\ SRCGR ${SRCGR})
  231. #STRING(REPLACE "//" "/" SRCGR ${SRCGR})
  232. IF(EXISTS "${f}" AND NOT IS_DIRECTORY "${f}")
  233. #message(STATUS "FILE: ${f} -> ${SRCGR}")
  234. source_group("${SRCGR}" FILES ${f})
  235. endif()
  236. endforeach()
  237. endmacro()
  238. # macro to add a static library
  239. macro(finishLibrary)
  240. # more paths?
  241. if(${ARGC} GREATER 0)
  242. foreach(dir ${ARGV0})
  243. addPath("${dir}")
  244. endforeach()
  245. endif()
  246. # now inspect the paths we got
  247. set(firstDir "")
  248. foreach(dir ${${PROJECT_NAME}_paths})
  249. if("${firstDir}" STREQUAL "")
  250. set(firstDir "${dir}")
  251. endif()
  252. endforeach()
  253. generateFilters("${firstDir}")
  254. # set per target compile flags
  255. if(TORQUE_CXX_FLAGS_${PROJECT_NAME})
  256. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_${PROJECT_NAME}}")
  257. else()
  258. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_LIBS}")
  259. endif()
  260. if(TORQUE_STATIC)
  261. add_library("${PROJECT_NAME}" STATIC ${${PROJECT_NAME}_files})
  262. else()
  263. add_library("${PROJECT_NAME}" SHARED ${${PROJECT_NAME}_files})
  264. endif()
  265. # omg - only use the first folder ... otherwise we get lots of header name collisions
  266. #foreach(dir ${${PROJECT_NAME}_paths})
  267. addInclude("${firstDir}")
  268. #endforeach()
  269. _postTargetProcess()
  270. endmacro()
  271. # macro to add an executable
  272. macro(finishExecutable)
  273. # now inspect the paths we got
  274. set(firstDir "")
  275. foreach(dir ${${PROJECT_NAME}_paths})
  276. if("${firstDir}" STREQUAL "")
  277. set(firstDir "${dir}")
  278. endif()
  279. endforeach()
  280. generateFiltersSpecial("${firstDir}")
  281. # set per target compile flags
  282. if(TORQUE_CXX_FLAGS_${PROJECT_NAME})
  283. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_${PROJECT_NAME}}")
  284. else()
  285. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_EXECUTABLES}")
  286. endif()
  287. if (APPLE)
  288. set(ICON_FILE "${projectSrcDir}/torque.icns")
  289. set_source_files_properties(${ICON_FILE} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
  290. add_executable("${PROJECT_NAME}" MACOSX_BUNDLE ${ICON_FILE} ${${PROJECT_NAME}_files})
  291. else()
  292. add_executable("${PROJECT_NAME}" WIN32 ${${PROJECT_NAME}_files})
  293. endif()
  294. addInclude("${firstDir}")
  295. _postTargetProcess()
  296. endmacro()
  297. macro(setupVersionNumbers)
  298. set(TORQUE_APP_VERSION_MAJOR 1 CACHE STRING "")
  299. set(TORQUE_APP_VERSION_MINOR 0 CACHE STRING "")
  300. set(TORQUE_APP_VERSION_PATCH 0 CACHE STRING "")
  301. set(TORQUE_APP_VERSION_TWEAK 0 CACHE STRING "")
  302. mark_as_advanced(TORQUE_APP_VERSION_TWEAK)
  303. MATH(EXPR TORQUE_APP_VERSION "${TORQUE_APP_VERSION_MAJOR} * 1000 + ${TORQUE_APP_VERSION_MINOR} * 100 + ${TORQUE_APP_VERSION_PATCH} * 10 + ${TORQUE_APP_VERSION_TWEAK}")
  304. set(TORQUE_APP_VERSION_STRING "${TORQUE_APP_VERSION_MAJOR}.${TORQUE_APP_VERSION_MINOR}.${TORQUE_APP_VERSION_PATCH}.${TORQUE_APP_VERSION_TWEAK}")
  305. #message(STATUS "version numbers: ${TORQUE_APP_VERSION} / ${TORQUE_APP_VERSION_STRING}")
  306. endmacro()
  307. macro(setupPackaging)
  308. INCLUDE(CPack)
  309. # only enable zips for now
  310. set(CPACK_BINARY_NSIS OFF CACHE INTERNAL "" FORCE)
  311. set(CPACK_BINARY_ZIP ON CACHE INTERNAL "" FORCE)
  312. set(CPACK_SOURCE_ZIP OFF CACHE INTERNAL "" FORCE)
  313. SET(CPACK_GENERATOR "ZIP")
  314. SET(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}")
  315. SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_NAME}")
  316. SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1)
  317. SET(CPACK_OUTPUT_FILE_PREFIX "${TORQUE_APP_DIR}/packages/${PROJECT_NAME}")
  318. SET(CPACK_PACKAGE_INSTALL_DIRECTORY "")
  319. #SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
  320. #SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
  321. SET(CPACK_PACKAGE_VERSION_MAJOR "${TORQUE_APP_VERSION_MAJOR}")
  322. SET(CPACK_PACKAGE_VERSION_MINOR "${TORQUE_APP_VERSION_MINOR}")
  323. SET(CPACK_PACKAGE_VERSION_PATCH "${TORQUE_APP_VERSION_PATCH}")
  324. #SET(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "${PROJECT_NAME}")
  325. SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${TORQUE_APP_VERSION_STRING}")
  326. #SET(CPACK_SOURCE_STRIP_FILES "")
  327. endmacro()
  328. # always static for now
  329. set(TORQUE_STATIC ON)
  330. #option(TORQUE_STATIC "enables or disable static" OFF)
  331. if(WIN32)
  332. set(TORQUE_CXX_FLAGS_EXECUTABLES "/wd4800 /wd4100 /wd4127 /wd4127 /wd4512" CACHE STRING "")
  333. mark_as_advanced(TORQUE_CXX_FLAGS_EXECUTABLES)
  334. set(TORQUE_CXX_FLAGS_LIBS "/W0" CACHE STRING "")
  335. mark_as_advanced(TORQUE_CXX_FLAGS_LIBS)
  336. set(TORQUE_CXX_FLAGS_COMMON_DEFAULT "-DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS /MP /O2 /Ob2 /Oi /Ot /Oy /GT /Zi /W4 /nologo /GF /EHsc /GS- /Gy- /Qpar- /fp:precise /fp:except- /GR /Zc:wchar_t-" )
  337. if( TORQUE_CPU_X32 )
  338. set(TORQUE_CXX_FLAGS_COMMON_DEFAULT "${TORQUE_CXX_FLAGS_COMMON_DEFAULT}")
  339. endif()
  340. set(TORQUE_CXX_FLAGS_COMMON ${TORQUE_CXX_FLAGS_COMMON_DEFAULT} CACHE STRING "")
  341. mark_as_advanced(TORQUE_CXX_FLAGS_COMMON)
  342. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORQUE_CXX_FLAGS_COMMON}")
  343. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS}")
  344. set(CMAKE_EXE_LINKER_FLAGS "")
  345. #set(STATIC_LIBRARY_FLAGS "/OPT:NOREF")
  346. # Force static runtime libraries
  347. if(TORQUE_STATIC)
  348. FOREACH(flag
  349. CMAKE_C_FLAGS_RELEASE
  350. CMAKE_C_FLAGS_RELWITHDEBINFO
  351. CMAKE_C_FLAGS_DEBUG
  352. CMAKE_C_FLAGS_DEBUG_INIT
  353. CMAKE_CXX_FLAGS_RELEASE
  354. CMAKE_CXX_FLAGS_RELWITHDEBINFO
  355. CMAKE_CXX_FLAGS_DEBUG
  356. CMAKE_CXX_FLAGS_DEBUG_INIT)
  357. STRING(REPLACE "/MD" "/MT" "${flag}" "${${flag}}")
  358. SET("${flag}" "${${flag}} /EHsc")
  359. ENDFOREACH()
  360. endif()
  361. else()
  362. # TODO: improve default settings on other platforms
  363. set(TORQUE_CXX_FLAGS_EXECUTABLES "" CACHE STRING "")
  364. mark_as_advanced(TORQUE_CXX_FLAGS_EXECUTABLES)
  365. set(TORQUE_CXX_FLAGS_LIBS "" CACHE STRING "")
  366. mark_as_advanced(TORQUE_CXX_FLAGS_LIBS)
  367. set(TORQUE_CXX_FLAGS_COMMON "" CACHE STRING "")
  368. mark_as_advanced(TORQUE_CXX_FLAGS)
  369. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORQUE_CXX_FLAGS}")
  370. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS}")
  371. endif()
  372. if(UNIX AND NOT APPLE)
  373. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${TORQUE_APP_DIR}")
  374. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${TORQUE_APP_DIR}")
  375. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${TORQUE_APP_DIR}")
  376. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${TORQUE_APP_DIR}")
  377. endif()
  378. if(APPLE)
  379. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE "${TORQUE_APP_DIR}")
  380. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE "${TORQUE_APP_DIR}")
  381. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${TORQUE_APP_DIR}")
  382. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${TORQUE_APP_DIR}")
  383. endif()
  384. # fix the debug/release subfolders on windows
  385. if(MSVC)
  386. SET("CMAKE_RUNTIME_OUTPUT_DIRECTORY" "${TORQUE_APP_DIR}")
  387. FOREACH(CONF ${CMAKE_CONFIGURATION_TYPES})
  388. # Go uppercase (DEBUG, RELEASE...)
  389. STRING(TOUPPER "${CONF}" CONF)
  390. #SET("CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONF}" "${TORQUE_APP_DIR}")
  391. SET("CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONF}" "${TORQUE_APP_DIR}")
  392. ENDFOREACH()
  393. endif()