basics.cmake 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. # -----------------------------------------------------------------------------
  2. # Copyright (c) 2014 GarageGames, LLC
  3. #
  4. # Permission is hereby granted, free of charge, to any person obtaining a copy
  5. # of this software and associated documentation files (the "Software"), to
  6. # deal in the Software without restriction, including without limitation the
  7. # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
  8. # sell copies of the Software, and to permit persons to whom the Software is
  9. # furnished to do so, subject to the following conditions:
  10. #
  11. # The above copyright notice and this permission notice shall be included in
  12. # all copies or substantial portions of the Software.
  13. #
  14. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  15. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  16. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  17. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  18. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  19. # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
  20. # IN THE SOFTWARE.
  21. # -----------------------------------------------------------------------------
  22. project("Torque3DEngine")
  23. if( CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 8 )
  24. set( TORQUE_CPU_X64 ON )
  25. elseif( CMAKE_CXX_SIZEOF_DATA_PTR EQUAL 4 )
  26. set( TORQUE_CPU_X32 ON )
  27. endif()
  28. if(NOT TORQUE_TEMPLATE)
  29. set(TORQUE_TEMPLATE "Full" CACHE STRING "the template to use")
  30. endif()
  31. if(NOT TORQUE_APP_DIR)
  32. set(TORQUE_APP_DIR "${CMAKE_SOURCE_DIR}/My Projects/${TORQUE_APP_NAME}")
  33. endif()
  34. if(NOT projectOutDir)
  35. set(projectOutDir "${TORQUE_APP_DIR}/game")
  36. endif()
  37. if(NOT projectSrcDir)
  38. set(projectSrcDir "${TORQUE_APP_DIR}/source")
  39. endif()
  40. set(libDir "${CMAKE_SOURCE_DIR}/Engine/lib")
  41. set(srcDir "${CMAKE_SOURCE_DIR}/Engine/source")
  42. set(cmakeDir "${CMAKE_SOURCE_DIR}/Tools/CMake")
  43. # hide some things
  44. mark_as_advanced(CMAKE_INSTALL_PREFIX)
  45. mark_as_advanced(CMAKE_CONFIGURATION_TYPES)
  46. # output folders
  47. #set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${projectOutDir}/game)
  48. #set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${projectOutDir}/game)
  49. #set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${projectOutDir}/game)
  50. ###############################################################################
  51. ### Source File Handling
  52. ###############################################################################
  53. # finds and adds sources files in a folder
  54. macro(addPath dir)
  55. set(tmp_files "")
  56. set(glob_config GLOB)
  57. if(${ARGC} GREATER 1 AND "${ARGV1}" STREQUAL "REC")
  58. set(glob_config GLOB_RECURSE)
  59. endif()
  60. file(${glob_config} tmp_files
  61. ${dir}/*.cpp
  62. ${dir}/*.c
  63. ${dir}/*.cc
  64. ${dir}/*.h
  65. #${dir}/*.asm
  66. )
  67. LIST(APPEND ${PROJECT_NAME}_files "${tmp_files}")
  68. LIST(APPEND ${PROJECT_NAME}_paths "${dir}")
  69. #message(STATUS "addPath ${PROJECT_NAME} : ${tmp_files}")
  70. endmacro()
  71. # adds a file to the sources
  72. macro(addFile filename)
  73. LIST(APPEND ${PROJECT_NAME}_files "${filename}")
  74. #message(STATUS "addFile ${PROJECT_NAME} : ${filename}")
  75. endmacro()
  76. # finds and adds sources files in a folder recursively
  77. macro(addPathRec dir)
  78. addPath("${dir}" "REC")
  79. endmacro()
  80. ###############################################################################
  81. ### Definition Handling
  82. ###############################################################################
  83. macro(__addDef def config)
  84. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  85. if(TARGET ${PROJECT_NAME})
  86. #message(STATUS "directly applying defs: ${PROJECT_NAME} with config ${config}: ${def}")
  87. if("${config}" STREQUAL "")
  88. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS ${def})
  89. else()
  90. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS $<$<CONFIG:${config}>:${def}>)
  91. endif()
  92. else()
  93. if("${config}" STREQUAL "")
  94. list(APPEND ${PROJECT_NAME}_defs_ ${def})
  95. else()
  96. list(APPEND ${PROJECT_NAME}_defs_ $<$<CONFIG:${config}>:${def}>)
  97. endif()
  98. #message(STATUS "added definition to cache: ${PROJECT_NAME}_defs_: ${${PROJECT_NAME}_defs_}")
  99. endif()
  100. endmacro()
  101. # adds a definition: argument 1: Nothing(for all), _DEBUG, _RELEASE, <more build configurations>
  102. macro(addDef def)
  103. set(def_configs "")
  104. if(${ARGC} GREATER 1)
  105. foreach(config ${ARGN})
  106. __addDef(${def} ${config})
  107. endforeach()
  108. else()
  109. __addDef(${def} "")
  110. endif()
  111. endmacro()
  112. # this applies cached definitions onto the target
  113. macro(_process_defs)
  114. if(DEFINED ${PROJECT_NAME}_defs_)
  115. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY COMPILE_DEFINITIONS ${${PROJECT_NAME}_defs_})
  116. #message(STATUS "applying defs to project ${PROJECT_NAME}: ${${PROJECT_NAME}_defs_}")
  117. endif()
  118. endmacro()
  119. ###############################################################################
  120. ### Source Library Handling
  121. ###############################################################################
  122. macro(addLibSrc libPath)
  123. set(cached_project_name ${PROJECT_NAME})
  124. include(${libPath})
  125. project(${cached_project_name})
  126. endmacro()
  127. ###############################################################################
  128. ### Linked Library Handling
  129. ###############################################################################
  130. macro(addLib libs)
  131. foreach(lib ${libs})
  132. # check if we can build it ourselfs
  133. if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  134. addLibSrc("${CMAKE_CURRENT_SOURCE_DIR}/libraries/${lib}.cmake")
  135. endif()
  136. # then link against it
  137. # two possibilities: a) target already known, so add it directly, or b) target not yet known, so add it to its cache
  138. if(TARGET ${PROJECT_NAME})
  139. target_link_libraries(${PROJECT_NAME} "${lib}")
  140. else()
  141. list(APPEND ${PROJECT_NAME}_libs ${lib})
  142. endif()
  143. endforeach()
  144. endmacro()
  145. # this applies cached definitions onto the target
  146. macro(_process_libs)
  147. if(DEFINED ${PROJECT_NAME}_libs)
  148. target_link_libraries(${PROJECT_NAME} "${${PROJECT_NAME}_libs}")
  149. endif()
  150. endmacro()
  151. ###############################################################################
  152. ### Include Handling
  153. ###############################################################################
  154. macro(addInclude incPath)
  155. if(TARGET ${PROJECT_NAME})
  156. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${incPath}")
  157. else()
  158. list(APPEND ${PROJECT_NAME}_includes ${incPath})
  159. endif()
  160. endmacro()
  161. # this applies cached definitions onto the target
  162. macro(_process_includes)
  163. if(DEFINED ${PROJECT_NAME}_includes)
  164. set_property(TARGET ${PROJECT_NAME} APPEND PROPERTY INCLUDE_DIRECTORIES "${${PROJECT_NAME}_includes}")
  165. endif()
  166. endmacro()
  167. ###############################################################################
  168. macro(_postTargetProcess)
  169. _process_includes()
  170. _process_defs()
  171. _process_libs()
  172. endmacro()
  173. # adds a path to search for libs
  174. macro(addLibPath dir)
  175. link_directories(${dir})
  176. endmacro()
  177. # creates a proper filter for VS
  178. macro(generateFilters relDir)
  179. foreach(f ${${PROJECT_NAME}_files})
  180. # Get the path of the file relative to ${DIRECTORY},
  181. # then alter it (not compulsory)
  182. file(RELATIVE_PATH SRCGR ${relDir} ${f})
  183. set(SRCGR "${PROJECT_NAME}/${SRCGR}")
  184. # Extract the folder, ie remove the filename part
  185. string(REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRCGR ${SRCGR})
  186. # do not have any ../ dirs
  187. string(REPLACE "../" "" SRCGR ${SRCGR})
  188. # Source_group expects \\ (double antislash), not / (slash)
  189. string(REPLACE / \\ SRCGR ${SRCGR})
  190. #STRING(REPLACE "//" "/" SRCGR ${SRCGR})
  191. #message(STATUS "FILE: ${f} -> ${SRCGR}")
  192. source_group("${SRCGR}" FILES ${f})
  193. endforeach()
  194. endmacro()
  195. # creates a proper filter for VS
  196. macro(generateFiltersSpecial relDir)
  197. foreach(f ${${PROJECT_NAME}_files})
  198. # Get the path of the file relative to ${DIRECTORY},
  199. # then alter it (not compulsory)
  200. file(RELATIVE_PATH SRCGR ${relDir} ${f})
  201. set(SRCGR "torque3d/${SRCGR}")
  202. # Extract the folder, ie remove the filename part
  203. string(REGEX REPLACE "(.*)(/[^/]*)$" "\\1" SRCGR ${SRCGR})
  204. # do not have any ../ dirs
  205. string(REPLACE "../" "" SRCGR ${SRCGR})
  206. IF("${SRCGR}" MATCHES "^torque3d/My Projects/.*$")
  207. string(REPLACE "torque3d/My Projects/${PROJECT_NAME}/" "" SRCGR ${SRCGR})
  208. string(REPLACE "/source" "" SRCGR ${SRCGR})
  209. endif()
  210. # Source_group expects \\ (double antislash), not / (slash)
  211. string(REPLACE / \\ SRCGR ${SRCGR})
  212. #STRING(REPLACE "//" "/" SRCGR ${SRCGR})
  213. IF(EXISTS "${f}" AND NOT IS_DIRECTORY "${f}")
  214. #message(STATUS "FILE: ${f} -> ${SRCGR}")
  215. source_group("${SRCGR}" FILES ${f})
  216. endif()
  217. endforeach()
  218. endmacro()
  219. # macro to add a static library
  220. macro(finishLibrary)
  221. # more paths?
  222. if(${ARGC} GREATER 0)
  223. foreach(dir ${ARGV0})
  224. addPath("${dir}")
  225. endforeach()
  226. endif()
  227. # now inspect the paths we got
  228. set(firstDir "")
  229. foreach(dir ${${PROJECT_NAME}_paths})
  230. if("${firstDir}" STREQUAL "")
  231. set(firstDir "${dir}")
  232. endif()
  233. endforeach()
  234. generateFilters("${firstDir}")
  235. # set per target compile flags
  236. if(TORQUE_CXX_FLAGS_${PROJECT_NAME})
  237. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_${PROJECT_NAME}}")
  238. else()
  239. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_LIBS}")
  240. endif()
  241. if(TORQUE_STATIC)
  242. add_library("${PROJECT_NAME}" STATIC ${${PROJECT_NAME}_files})
  243. else()
  244. add_library("${PROJECT_NAME}" SHARED ${${PROJECT_NAME}_files})
  245. endif()
  246. # omg - only use the first folder ... otherwise we get lots of header name collisions
  247. #foreach(dir ${${PROJECT_NAME}_paths})
  248. addInclude("${firstDir}")
  249. #endforeach()
  250. _postTargetProcess()
  251. endmacro()
  252. # macro to add an executable
  253. macro(finishExecutable)
  254. # now inspect the paths we got
  255. set(firstDir "")
  256. foreach(dir ${${PROJECT_NAME}_paths})
  257. if("${firstDir}" STREQUAL "")
  258. set(firstDir "${dir}")
  259. endif()
  260. endforeach()
  261. generateFiltersSpecial("${firstDir}")
  262. # set per target compile flags
  263. if(TORQUE_CXX_FLAGS_${PROJECT_NAME})
  264. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_${PROJECT_NAME}}")
  265. else()
  266. set_source_files_properties(${${PROJECT_NAME}_files} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_EXECUTABLES}")
  267. endif()
  268. add_executable("${PROJECT_NAME}" WIN32 ${${PROJECT_NAME}_files})
  269. addInclude("${firstDir}")
  270. _postTargetProcess()
  271. endmacro()
  272. macro(setupVersionNumbers)
  273. set(TORQUE_APP_VERSION_MAJOR 1 CACHE INTEGER "")
  274. set(TORQUE_APP_VERSION_MINOR 0 CACHE INTEGER "")
  275. set(TORQUE_APP_VERSION_PATCH 0 CACHE INTEGER "")
  276. set(TORQUE_APP_VERSION_TWEAK 0 CACHE INTEGER "")
  277. mark_as_advanced(TORQUE_APP_VERSION_TWEAK)
  278. MATH(EXPR TORQUE_APP_VERSION "${TORQUE_APP_VERSION_MAJOR} * 1000 + ${TORQUE_APP_VERSION_MINOR} * 100 + ${TORQUE_APP_VERSION_PATCH} * 10 + ${TORQUE_APP_VERSION_TWEAK}")
  279. set(TORQUE_APP_VERSION_STRING "${TORQUE_APP_VERSION_MAJOR}.${TORQUE_APP_VERSION_MINOR}.${TORQUE_APP_VERSION_PATCH}.${TORQUE_APP_VERSION_TWEAK}")
  280. #message(STATUS "version numbers: ${TORQUE_APP_VERSION} / ${TORQUE_APP_VERSION_STRING}")
  281. endmacro()
  282. macro(setupPackaging)
  283. INCLUDE(CPack)
  284. # only enable zips for now
  285. set(CPACK_BINARY_NSIS OFF CACHE INTERNAL "" FORCE)
  286. set(CPACK_BINARY_ZIP ON CACHE INTERNAL "" FORCE)
  287. set(CPACK_SOURCE_ZIP OFF CACHE INTERNAL "" FORCE)
  288. SET(CPACK_GENERATOR "ZIP")
  289. SET(CPACK_PACKAGE_VENDOR "${PROJECT_NAME}")
  290. SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "${PROJECT_NAME}")
  291. SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY 1)
  292. SET(CPACK_OUTPUT_FILE_PREFIX "${TORQUE_APP_DIR}/packages/${PROJECT_NAME}")
  293. SET(CPACK_PACKAGE_INSTALL_DIRECTORY "")
  294. #SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/ReadMe.txt")
  295. #SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/Copyright.txt")
  296. SET(CPACK_PACKAGE_VERSION_MAJOR "${TORQUE_APP_VERSION_MAJOR}")
  297. SET(CPACK_PACKAGE_VERSION_MINOR "${TORQUE_APP_VERSION_MINOR}")
  298. SET(CPACK_PACKAGE_VERSION_PATCH "${TORQUE_APP_VERSION_PATCH}")
  299. #SET(CPACK_PACKAGE_EXECUTABLES "${PROJECT_NAME}" "${PROJECT_NAME}")
  300. SET(CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${TORQUE_APP_VERSION_STRING}")
  301. #SET(CPACK_SOURCE_STRIP_FILES "")
  302. endmacro()
  303. # always static for now
  304. set(TORQUE_STATIC ON)
  305. #option(TORQUE_STATIC "enables or disable static" OFF)
  306. if(WIN32)
  307. set(TORQUE_CXX_FLAGS_EXECUTABLES "/wd4018 /wd4100 /wd4121 /wd4127 /wd4130 /wd4244 /wd4245 /wd4389 /wd4511 /wd4512 /wd4800 /wd4995 " CACHE TYPE STRING)
  308. mark_as_advanced(TORQUE_CXX_FLAGS_EXECUTABLES)
  309. set(TORQUE_CXX_FLAGS_LIBS "/W0" CACHE TYPE STRING)
  310. mark_as_advanced(TORQUE_CXX_FLAGS_LIBS)
  311. 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:fast /fp:except- /GR /Zc:wchar_t-" )
  312. if( TORQUE_CPU_X32 )
  313. set(TORQUE_CXX_FLAGS_COMMON_DEFAULT "${TORQUE_CXX_FLAGS_COMMON_DEFAULT} /arch:SSE2")
  314. endif()
  315. set(TORQUE_CXX_FLAGS_COMMON ${TORQUE_CXX_FLAGS_COMMON_DEFAULT} CACHE TYPE STRING)
  316. mark_as_advanced(TORQUE_CXX_FLAGS_COMMON)
  317. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORQUE_CXX_FLAGS_COMMON}")
  318. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS}")
  319. set(CMAKE_EXE_LINKER_FLAGS "/LARGEADDRESSAWARE")
  320. #set(STATIC_LIBRARY_FLAGS "/OPT:NOREF")
  321. # Force static runtime libraries
  322. if(TORQUE_STATIC)
  323. FOREACH(flag
  324. CMAKE_C_FLAGS_RELEASE
  325. CMAKE_C_FLAGS_RELWITHDEBINFO
  326. CMAKE_C_FLAGS_DEBUG
  327. CMAKE_C_FLAGS_DEBUG_INIT
  328. CMAKE_CXX_FLAGS_RELEASE
  329. CMAKE_CXX_FLAGS_RELWITHDEBINFO
  330. CMAKE_CXX_FLAGS_DEBUG
  331. CMAKE_CXX_FLAGS_DEBUG_INIT)
  332. STRING(REPLACE "/MD" "/MT" "${flag}" "${${flag}}")
  333. SET("${flag}" "${${flag}} /EHsc")
  334. ENDFOREACH()
  335. endif()
  336. else()
  337. # TODO: improve default settings on other platforms
  338. set(TORQUE_CXX_FLAGS_EXECUTABLES "" CACHE TYPE STRING)
  339. mark_as_advanced(TORQUE_CXX_FLAGS_EXECUTABLES)
  340. set(TORQUE_CXX_FLAGS_LIBS "" CACHE TYPE STRING)
  341. mark_as_advanced(TORQUE_CXX_FLAGS_LIBS)
  342. set(TORQUE_CXX_FLAGS_COMMON "" CACHE TYPE STRING)
  343. mark_as_advanced(TORQUE_CXX_FLAGS)
  344. set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORQUE_CXX_FLAGS}")
  345. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CXX_FLAGS}")
  346. endif()
  347. if(UNIX)
  348. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${projectOutDir}")
  349. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${projectOutDir}")
  350. SET(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG "${projectOutDir}")
  351. set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG "${projectOutDir}")
  352. endif()
  353. # fix the debug/release subfolders on windows
  354. if(MSVC)
  355. FOREACH(CONF ${CMAKE_CONFIGURATION_TYPES})
  356. # Go uppercase (DEBUG, RELEASE...)
  357. STRING(TOUPPER "${CONF}" CONF)
  358. #SET("CMAKE_ARCHIVE_OUTPUT_DIRECTORY_${CONF}" "${projectOutDir}")
  359. SET("CMAKE_RUNTIME_OUTPUT_DIRECTORY_${CONF}" "${projectOutDir}")
  360. ENDFOREACH()
  361. endif()