basics.cmake 19 KB

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