CMakeLists.txt 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. project(${TORQUE_APP_NAME})
  2. # Enable ObjectiveC compilation when compiling for Apple platforms
  3. if (APPLE)
  4. enable_language(OBJC)
  5. endif (APPLE)
  6. ################# Helper Function Calls ###################
  7. forwardDef(TORQUE_OPENGL)
  8. forwardDef(TORQUE_D3D11)
  9. forwardDef(TORQUE_ADVANCED_LIGHTING)
  10. forwardDef(TORQUE_BASIC_LIGHTING)
  11. set(TORQUE_SDL ON) # we need sdl to do our platform interop
  12. forwardDef(TORQUE_SDL)
  13. if(TORQUE_TESTING)
  14. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_TESTS_ENABLED)
  15. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} "_VARIADIC_MAX=10")
  16. endif()
  17. # On Windows we disable CRT Security warnings - this comes from recommendations to use non-portable functions.
  18. if (WIN32)
  19. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} _CRT_SECURE_NO_WARNINGS WIN32)
  20. endif (WIN32)
  21. if (APPLE)
  22. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} __MACOSX__)
  23. elseif (UNIX)
  24. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} __linux__)
  25. endif (APPLE)
  26. ################# Set Engine Linkages ###################
  27. # When on Windows, we need to link against winsock and windows codecs
  28. if (WIN32)
  29. set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES} ${TORQUE_PLATFORM_WIN_SOURCES})
  30. endif (WIN32)
  31. # Linux requires X11 & freetype
  32. if (UNIX AND NOT APPLE)
  33. set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES} ${TORQUE_PLATFORM_X11_SOURCES})
  34. find_package(Freetype REQUIRED)
  35. set(TORQUE_INCLUDE_DIRECTORIES ${TORQUE_INCLUDE_DIRECTORIES} ${FREETYPE_INCLUDE_DIRS})
  36. endif (UNIX AND NOT APPLE)
  37. ################# Collect Source Files ###################
  38. # Handle app
  39. torqueAddSourceDirectories("app" "app/net")
  40. # Handle console
  41. torqueAddSourceDirectories("console")
  42. torqueAddSourceDirectories("console/torquescript")
  43. set(TORQUE_INCLUDE_DIRECTORIES ${TORQUE_INCLUDE_DIRECTORIES} "ts/vhacd")
  44. # Handle Platform
  45. torqueAddSourceDirectories("platform" "platform/threads" "platform/async"
  46. "platform/input" "platform/output")
  47. torqueAddSourceDirectories("platform/nativeDialogs")
  48. # Handle T3D
  49. torqueAddSourceDirectories( "T3D" "T3D/AI" "T3D/assets" "T3D/decal" "T3D/examples" "T3D/fps" "T3D/fx"
  50. "T3D/gameBase" "T3D/gameBase/std"
  51. "T3D/lighting"
  52. "T3D/physics"
  53. # "T3D/components" "T3D/sceneComponent" "T3D/systems" "T3D/gameOBjects"
  54. "T3D/sfx" "T3D/turret" "T3D/vehicles")
  55. # Handle TS
  56. torqueAddSourceDirectories("ts" "ts/collada" "ts/assimp" "ts/loader" "ts/arch")
  57. # Handle SFX - OpenAL is handled as a module later on
  58. torqueAddSourceDirectories("sfx" "sfx/media" "sfx/null")
  59. if(TORQUE_SFX_OPENAL AND NOT TORQUE_DEDICATED)
  60. torqueAddSourceDirectories("sfx/openal")
  61. if(WIN32)
  62. torqueAddSourceDirectories("sfx/openal/win32")
  63. elseif(UNIX AND NOT APPLE)
  64. torqueAddSourceDirectories("sfx/openal/linux")
  65. elseif(APPLE)
  66. torqueAddSourceDirectories("sfx/openal/mac")
  67. endif()
  68. endif()
  69. # Handle GFX
  70. torqueAddSourceDirectories("gfx" "gfx/Null" "gfx/test" "gfx/bitmap" "gfx/bitmap/loaders" "gfx/bitmap/loaders/ies"
  71. "gfx/util" "gfx/video" "gfx/sim" )
  72. # add the stb headers
  73. set(TORQUE_INCLUDE_DIRECTORIES ${TORQUE_INCLUDE_DIRECTORIES} "gfx/bitmap/loaders/stb")
  74. if (TORQUE_OPENGL)
  75. torqueAddSourceDirectories("gfx/gl" "gfx/gl/sdl" "gfx/gl/tGL")
  76. endif (TORQUE_OPENGL)
  77. if (WIN32 AND TORQUE_D3D11)
  78. torqueAddSourceDirectories("gfx/D3D11")
  79. endif (WIN32 AND TORQUE_D3D11)
  80. # Handle core
  81. torqueAddSourceDirectories("core" "core/stream" "core/strings" "core/util"
  82. "core/util/journal" "core/util/zip" "core/util/zip/compressors")
  83. # Handle GUI
  84. torqueAddSourceDirectories("gui" "gui/buttons" "gui/containers" "gui/controls" "gui/core"
  85. "gui/game" "gui/shiny" "gui/utility" "gui/3d")
  86. # Handle postFX
  87. torqueAddSourceDirectories("postFx")
  88. # Handle Windowmanager
  89. torqueAddSourceDirectories("windowManager" "windowManager/torque" "windowManager/sdl")
  90. # Handle scene
  91. torqueAddSourceDirectories("scene" "scene/culling" "scene/zones" "scene/mixin")
  92. # Handle math
  93. torqueAddSourceDirectories("math" "math/util")
  94. # Handle persistence
  95. torqueAddSourceDirectories("persistence/taml" "persistence/taml/binary" "persistence/taml/xml")
  96. # Handle Cinterface
  97. torqueAddSourceDirectories("cinterface")
  98. # Handle util
  99. torqueAddSourceDirectories("util" "util/messaging")
  100. # Handle assets
  101. torqueAddSourceDirectories("assets")
  102. # Handle Sim
  103. torqueAddSourceDirectories("sim")
  104. # Handle module
  105. torqueAddSourceDirectories("module")
  106. # Handle forest
  107. torqueAddSourceDirectories("forest" "forest/ts")
  108. if(TORQUE_OPENGL)
  109. torqueAddSourceDirectories("forest" "forest/glsl")
  110. endif(TORQUE_OPENGL)
  111. if(TORQUE_D3D11)
  112. torqueAddSourceDirectories("forest" "forest/hlsl")
  113. endif(TORQUE_D3D11)
  114. # Handle shadergen
  115. torqueAddSourceDirectories("shaderGen")
  116. if (WIN32 AND TORQUE_D3D11)
  117. torqueAddSourceDirectories("shaderGen/HLSL")
  118. endif (WIN32 AND TORQUE_D3D11)
  119. if (TORQUE_OPENGL)
  120. torqueAddSourceDirectories("shaderGen/GLSL")
  121. endif (TORQUE_OPENGL)
  122. # Handle terrain
  123. torqueAddSourceDirectories("terrain")
  124. # Handle theora
  125. if (TORQUE_THEORA)
  126. torqueAddSourceDirectories("core/ogg")
  127. torqueAddSourceDirectories("gui/theora")
  128. endif(TORQUE_THEORA)
  129. if (WIN32 AND TORQUE_D3D11)
  130. torqueAddSourceDirectories("terrain/hlsl")
  131. endif (WIN32 AND TORQUE_D3D11)
  132. if (TORQUE_OPENGL)
  133. torqueAddSourceDirectories("terrain/glsl")
  134. endif (TORQUE_OPENGL)
  135. # Handle Materials
  136. torqueAddSourceDirectories("materials")
  137. # Handle collision
  138. torqueAddSourceDirectories("collision")
  139. # Handle lighting
  140. torqueAddSourceDirectories("lighting" "lighting/common"
  141. "lighting/shadowMap")
  142. if (TORQUE_ADVANCED_LIGHTING)
  143. torqueAddSourceDirectories("lighting/advanced")
  144. if (WIN32 AND TORQUE_D3D11)
  145. torqueAddSourceDirectories("lighting/advanced/hlsl")
  146. endif (WIN32 AND TORQUE_D3D11)
  147. if (TORQUE_OPENGL)
  148. torqueAddSourceDirectories("lighting/advanced/glsl")
  149. endif (TORQUE_OPENGL)
  150. endif (TORQUE_ADVANCED_LIGHTING)
  151. if (TORQUE_BASIC_LIGHTING)
  152. torqueAddSourceDirectories("lighting/basic" "lighting/basic/shadowMap")
  153. endif (TORQUE_BASIC_LIGHTING)
  154. # Handle environment
  155. torqueAddSourceDirectories("environment")
  156. # Handle renderInstance
  157. torqueAddSourceDirectories("renderInstance")
  158. # Handle i18n
  159. torqueAddSourceDirectories("i18n")
  160. # Begin handling platform specific stuff
  161. # Handle Platform POSIX
  162. if (UNIX)
  163. torqueAddSourceDirectories("platformPOSIX")
  164. if(NOT APPLE)
  165. if (TORQUE_CPU_X32 OR TORQUE_CPU_X64)
  166. torqueAddSourceDirectories("platformX86UNIX")
  167. endif (TORQUE_CPU_X32 OR TORQUE_CPU_X64)
  168. endif(NOT APPLE)
  169. endif (UNIX)
  170. # Handle platformMac
  171. if (APPLE)
  172. torqueAddSourceDirectories("platformMac")
  173. endif (APPLE)
  174. # Handle platformWin32
  175. if (WIN32)
  176. torqueAddSourceDirectories("platformWin32" "platformWin32/videoInfo")
  177. endif (WIN32)
  178. # Handle platformSDL
  179. torqueAddSourceDirectories("platformSDL" "platformSDL/threads")
  180. # Handle platformX11
  181. if (UNIX AND NOT APPLE)
  182. torqueAddSourceDirectories("platformX11")
  183. endif (UNIX AND NOT APPLE)
  184. if(TORQUE_TESTING)
  185. torqueAddSourceDirectories("testing")
  186. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_SHARED SDL_MAIN_HANDLED)
  187. endif(TORQUE_TESTING)
  188. # Add the collected files to our engine group
  189. source_group(TREE "${CMAKE_SOURCE_DIR}/Engine/source" PREFIX "Engine" FILES ${TORQUE_SOURCE_FILES})
  190. file(GLOB_RECURSE TORQUE_APP_GAME_SOURCES "${TORQUE_APP_ROOT_DIRECTORY}/source/*.cpp" "${TORQUE_APP_ROOT_DIRECTORY}/source/*.h")
  191. source_group(TREE "${TORQUE_APP_ROOT_DIRECTORY}/source" PREFIX "Source Files" FILES ${TORQUE_APP_GAME_SOURCES})
  192. set(TORQUE_INCLUDE_DIRECTORIES ${TORQUE_INCLUDE_DIRECTORIES} "${TORQUE_APP_ROOT_DIRECTORY}/source")
  193. ################# Engine Module Handling ###################
  194. set(TORQUE_MODULE_PATHS "${CMAKE_SOURCE_DIR}/Tools/CMake/modules" "${TORQUE_APP_GAME_DIRECTORY}/data")
  195. if (NOT "${TORQUE_MODULE_USER_PATH}" STREQUAL "")
  196. list(APPEND TORQUE_MODULE_PATHS "${TORQUE_MODULE_USER_PATH}")
  197. endif()
  198. ################# MODULE LIBRARIES ###################
  199. set(TORQUE_LIBRARY_BASE_PATH "${TORQUE_APP_GAME_DIRECTORY}/data")
  200. message(STATUS "Checking base path: ${TORQUE_LIBRARY_BASE_PATH}")
  201. set(MODULE_SUBDIRS_INCLUDED "")
  202. if (EXISTS "${TORQUE_LIBRARY_BASE_PATH}")
  203. # List all immediate subdirectories of the base path for debugging
  204. file(GLOB MODULE_SUBDIRS "${TORQUE_LIBRARY_BASE_PATH}/*")
  205. foreach (MODULE_SUBDIR ${MODULE_SUBDIRS})
  206. if (EXISTS "${MODULE_SUBDIR}/source/libs/libs.cmake")
  207. message(STATUS "Adding subdirectory: ${MODULE_SUBDIR}/libs")
  208. # Handle spaces in paths (if needed)
  209. string(REPLACE " " "_" MODULE_BINARY_SUBDIR "${MODULE_SUBDIR}/libs")
  210. # Explicitly specify source and binary directories
  211. include("${MODULE_SUBDIR}/source/libs/libs.cmake")
  212. cmake_path(GET MODULE_SUBDIR STEM LAST_ONLY LAST_DIR_WORD)
  213. set(MODULE_SUBDIRS_INCLUDED ${MODULE_SUBDIRS_INCLUDED} ${LAST_DIR_WORD})
  214. endif()
  215. endforeach()
  216. else()
  217. message(WARNING "Base path ${TORQUE_LIBRARY_BASE_PATH} does not exist.")
  218. endif()
  219. # Before doing module scanning, store away the engine sources - we do this so that modules
  220. # can be placed into the proper filters
  221. set(TORQUE_SOURCE_FILES_TEMPORARY ${TORQUE_SOURCE_FILES} ${TORQUE_APP_GAME_SOURCES})
  222. set(TORQUE_SOURCE_FILES "")
  223. foreach (TORQUE_MODULE_PATH ${TORQUE_MODULE_PATHS})
  224. # First find simple cmake scripts, mostly used for in-engine modules
  225. file(GLOB MODULE_SCRIPTS "${TORQUE_MODULE_PATH}/*.cmake")
  226. foreach (TORQUE_MODULE_SCRIPT ${MODULE_SCRIPTS})
  227. include(${TORQUE_MODULE_SCRIPT})
  228. # Add this script's collected files to our Engine group
  229. source_group(TREE "${CMAKE_SOURCE_DIR}/Engine" PREFIX "Engine" FILES ${TORQUE_SOURCE_FILES})
  230. set(TORQUE_SOURCE_FILES_TEMPORARY ${TORQUE_SOURCE_FILES_TEMPORARY} ${TORQUE_SOURCE_FILES})
  231. set(TORQUE_SOURCE_FILES "")
  232. endforeach()
  233. # Next find sub projects, these can introduce new source files
  234. SUBDIRLIST(POSSIBLE_PROJECTS "${TORQUE_MODULE_PATH}")
  235. set(FILTERED_PROJECTS ${POSSIBLE_PROJECTS})
  236. foreach (MODULE_INCLUDED ${MODULE_SUBDIRS_INCLUDED})
  237. list(FILTER FILTERED_PROJECTS EXCLUDE REGEX ${MODULE_INCLUDED})
  238. endforeach()
  239. foreach (POSSIBLE_PROJECT ${FILTERED_PROJECTS})
  240. # Retrieve the absolute path of this possible project
  241. get_filename_component(POSSIBLE_PROJECT_ABSOLUTEPATH "${POSSIBLE_PROJECT}"
  242. REALPATH BASE_DIR "${TORQUE_MODULE_PATH}")
  243. if (EXISTS "${POSSIBLE_PROJECT_ABSOLUTEPATH}/source/CMakeLists.txt")
  244. add_subdirectory("${POSSIBLE_PROJECT_ABSOLUTEPATH}" ${CMAKE_BINARY_DIR}/temp/${POSSIBLE_PROJECT} EXCLUDE_FROM_ALL)
  245. source_group(TREE "${POSSIBLE_PROJECT_ABSOLUTEPATH}" PREFIX "Modules/${POSSIBLE_PROJECT}" FILES ${TORQUE_SOURCE_FILES})
  246. set(TORQUE_SOURCE_FILES_TEMPORARY ${TORQUE_SOURCE_FILES_TEMPORARY} ${TORQUE_SOURCE_FILES})
  247. set(TORQUE_SOURCE_FILES "")
  248. elseif(NOT EXISTS "${POSSIBLE_PROJECT_ABSOLUTEPATH}/source/*.cmake" AND NOT EXISTS "${POSSIBLE_PROJECT_ABSOLUTEPATH}/source/libs/*.cmake")
  249. file(GLOB_RECURSE MODULE_SOURCE "${POSSIBLE_PROJECT_ABSOLUTEPATH}/source/*.h" "${POSSIBLE_PROJECT_ABSOLUTEPATH}/source/*.cpp")
  250. #message(STATUS "MODULE_SOURCE:${MODULE_SOURCE}")
  251. source_group(TREE "${POSSIBLE_PROJECT_ABSOLUTEPATH}" PREFIX "Modules/${POSSIBLE_PROJECT}/" FILES ${MODULE_SOURCE})
  252. set(TORQUE_SOURCE_FILES_TEMPORARY ${TORQUE_SOURCE_FILES_TEMPORARY} ${MODULE_SOURCE})
  253. endif()
  254. endforeach()
  255. endforeach()
  256. foreach (MODULE_INCLUDED ${MODULE_SUBDIRS_INCLUDED})
  257. set(WRAPPER_DIR ${TORQUE_LIBRARY_BASE_PATH}/${MODULE_INCLUDED}/source/wrappers)
  258. if (EXISTS ${WRAPPER_DIR})
  259. #message("including ${WRAPPER_DIR}")
  260. file(GLOB_RECURSE WRAPPER_SOURCE "${WRAPPER_DIR}/*.h" "${WRAPPER_DIR}/*.cpp")
  261. source_group(TREE "${WRAPPER_DIR}" PREFIX "Modules/${MODULE_INCLUDED}/" FILES ${WRAPPER_SOURCE})
  262. set(WRAPPER_FILES ${WRAPPER_FILES} ${WRAPPER_SOURCE})
  263. #message("including ${WRAPPER_FILES}")
  264. set(TORQUE_INCLUDE_DIRECTORIES ${TORQUE_INCLUDE_DIRECTORIES} ${WRAPPER_DIR})
  265. endif()
  266. endforeach()
  267. set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES_TEMPORARY} ${WRAPPER_FILES})
  268. ################# Library Post-build Handling ###################
  269. set(TORQUE_LIBRARY_PATHS "${CMAKE_SOURCE_DIR}/Engine/lib")
  270. if (NOT "${TORQUE_LIBRARY_USER_PATH}" STREQUAL "")
  271. list(APPEND TORQUE_LIBRARY_PATHS "${TORQUE_LIBRARY_USER_PATH}")
  272. endif()
  273. foreach (TORQUE_LIBRARY_PATH ${TORQUE_LIBRARY_PATHS})
  274. # First find simple cmake scripts, mostly used for in-engine libraries
  275. file(GLOB_RECURSE LIBRARY_SCRIPTS "${TORQUE_LIBRARY_PATH}/*Torque_postBuild.cmake")
  276. #message(STATUS "LIBRARY_SCRIPTS:${LIBRARY_SCRIPTS}")
  277. foreach (TORQUE_LIBRARY_SCRIPT ${LIBRARY_SCRIPTS})
  278. include(${TORQUE_LIBRARY_SCRIPT})
  279. endforeach()
  280. endforeach()
  281. ################# Dynamic File Configuration ###################
  282. # Prepare Windows RC file
  283. if (WIN32)
  284. set(APPLICATION_ICON_PATH "${CMAKE_SOURCE_DIR}/Tools/CMake/torque.ico")
  285. configure_file("${CMAKE_SOURCE_DIR}/Tools/CMake/torque-win.rc.in" "${TORQUE_APP_ROOT_DIRECTORY}/source/torque.rc")
  286. set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES} "${TORQUE_APP_ROOT_DIRECTORY}/source/torque.rc")
  287. endif (WIN32)
  288. # Prepare OSX Plist
  289. if (APPLE)
  290. set(MACOSX_RESOURCES
  291. "${TORQUE_APP_GAME_DIRECTORY}/data"
  292. "${TORQUE_APP_GAME_DIRECTORY}/core"
  293. "${TORQUE_APP_GAME_DIRECTORY}/tools"
  294. "${TORQUE_APP_GAME_DIRECTORY}/main.${TORQUE_SCRIPT_EXTENSION}"
  295. "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.torsion"
  296. "${TORQUE_APP_GAME_DIRECTORY}/Template.torsion.exports")
  297. if(TORQUE_TESTING)
  298. set(MACOSX_RESOURCES ${MACOSX_RESOURCES} "${TORQUE_APP_GAME_DIRECTORY}/runTests.${TORQUE_SCRIPT_EXTENSION}")
  299. endif()
  300. set(TORQUE_SOURCE_FILES ${TORQUE_SOURCE_FILES} ${TORQUE_PLATFORM_MAC_SOURCES} ${MACOSX_RESOURCES})
  301. source_group("Resources" FILES ${MACOSX_RESOURCES})
  302. set_source_files_properties(${MACOSX_RESOURCES} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
  303. set(EXECUTABLE_NAME "${TORQUE_APP_NAME}")
  304. configure_file("${CMAKE_SOURCE_DIR}/Tools/CMake/Info.plist.in" "${TORQUE_APP_ROOT_DIRECTORY}/source/Info.plist" COPYONLY)
  305. file( COPY "${CMAKE_SOURCE_DIR}/Tools/CMake/app_assets/apple/App.xcassets" DESTINATION "${TORQUE_APP_ROOT_DIRECTORY}/source")
  306. endif (APPLE)
  307. addDef(TORQUE_DEBUG Debug)
  308. addDef(TORQUE_RELEASE "RelWithDebInfo;Release")
  309. addDef(TORQUE_ENABLE_ASSERTS "Debug;RelWithDebInfo")
  310. addDef(TORQUE_DEBUG_GFX_MODE "RelWithDebInfo")
  311. addDef(TORQUE_OGGVORBIS)
  312. if (TORQUE_THEORA)
  313. addDef(TORQUE_OGGTHEORA)
  314. endif(TORQUE_THEORA)
  315. if(NOT TORQUE_SDL)
  316. filterOut("platform/nativeDialogs/fileDialog.cpp" )
  317. endif()
  318. if(NOT TORQUE_OPENGL)
  319. filterOut("platformSDL/sdlPlatformGL.cpp")
  320. endif()
  321. if (NOT TORQUE_NET_CURL)
  322. filterOut("app/net/httpObject.h" "app/net/httpObject.cpp")
  323. endif()
  324. ################# Executable Generation ###################
  325. if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  326. set(TORQUE_COMPILE_DEFINITIONS ${TORQUE_COMPILE_DEFINITIONS} TORQUE_SHARED)
  327. # Build the main engine library
  328. add_library(TorqueEngine SHARED ${TORQUE_SOURCE_FILES})
  329. target_compile_definitions(TorqueEngine PUBLIC ${TORQUE_COMPILE_DEFINITIONS})
  330. target_link_libraries(TorqueEngine ${TORQUE_LINK_LIBRARIES})
  331. target_include_directories(TorqueEngine PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_BINARY_DIR}/temp" ${TORQUE_INCLUDE_DIRECTORIES})
  332. set(TORQUE_SOURCE_FILES "main/main.cpp")
  333. set(TORQUE_LINK_LIBRARIES TorqueEngine)
  334. else()
  335. if(NOT TORQUE_TESTING)
  336. set(TORQUE_SOURCE_FILES "main/main.cpp" ${TORQUE_SOURCE_FILES})
  337. endif()
  338. endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  339. if (APPLE)
  340. add_executable(${TORQUE_APP_NAME} MACOSX_BUNDLE
  341. ${TORQUE_SOURCE_FILES})
  342. target_sources(${TORQUE_APP_NAME} PRIVATE "${TORQUE_APP_ROOT_DIRECTORY}/source/App.xcassets")
  343. set_source_files_properties( "${TORQUE_APP_ROOT_DIRECTORY}/source/App.xcassets" PROPERTIES
  344. MACOSX_PACKAGE_LOCATION Resources)
  345. set_target_properties(${TORQUE_APP_NAME} PROPERTIES
  346. MACOSX_BUNDLE true
  347. MACOSX_BUNDLE_INFO_PLIST "${TORQUE_APP_ROOT_DIRECTORY}/source/Info.plist"
  348. XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "com.torque3d.${TORQUE_APP_NAME}"
  349. INSTALL_RPATH "@executable_path/../Frameworks"
  350. XCODE_ATTRIBUTE_SKIP_INSTALL NO
  351. BUILD_WITH_INSTALL_RPATH ON
  352. XCODE_ATTRIBUTE_INSTALL_PATH "/Applications"
  353. XCODE_ATTRIBUTE_ASSETCATALOG_COMPILER_APPICON_NAME "AppIcon"
  354. XCODE_ATTRIBUTE_LINKER_DISPLAYS_MANGLED_NAMES[variant=Debug] YES
  355. XCODE_ATTRIBUTE_ONLY_ACTIVE_ARCH[variant=Debug] YES
  356. XCODE_ATTRIBUTE_ENABLE_TESTABILITY[variant=Debug] YES
  357. XCODE_ATTRIBUTE_SDL_FILE_DIR[variant=Debug] parent
  358. XCODE_ATTRIBUTE_SDL_FILE_DIR[variant=RelWithDebInfo] parent
  359. XCODE_ATTRIBUTE_SDL_FILE_DIR[variant=Release] resource)
  360. elseif (WIN32)
  361. add_executable(${TORQUE_APP_NAME} WIN32 ${TORQUE_SOURCE_FILES})
  362. set(TORQUE_CXX_FLAGS_COMMON_DEFAULT "-DUNICODE -D_UNICODE -D_CRT_SECURE_NO_WARNINGS /MP /Ob2 /Oi /Ot /Oy /GT /Zi /W4 /nologo /GF /EHsc /GS- /Gy- /Qpar- /fp:precise /fp:except- /GR /Zc:wchar_t-" )
  363. if( TORQUE_CPU_X32 )
  364. set(TORQUE_CXX_FLAGS_COMMON_DEFAULT "${TORQUE_CXX_FLAGS_COMMON_DEFAULT} /arch:SSE2")
  365. endif()
  366. set(TORQUE_CXX_FLAGS_COMMON ${TORQUE_CXX_FLAGS_COMMON_DEFAULT} CACHE STRING "")
  367. mark_as_advanced(TORQUE_CXX_FLAGS_COMMON)
  368. set(TORQUE_CXX_FLAGS_EXECUTABLES "/wd4018 /wd4100 /wd4121 /wd4127 /wd4130 /wd4244 /wd4245 /wd4389 /wd4511 /wd4512 /wd4800 /wd4995" CACHE STRING "")
  369. mark_as_advanced(TORQUE_CXX_FLAGS_EXECUTABLES)
  370. set(TORQUE_CXX_FLAGS "${TORQUE_CXX_FLAGS_COMMON_DEFAULT} ${TORQUE_CXX_FLAGS_EXECUTABLES}" CACHE STRING "")
  371. mark_as_advanced(TORQUE_CXX_FLAGS)
  372. # NOTE: On Windows, /Zc:wchar_t- is necessary otherwise you get unicode errors
  373. set_target_properties(${TORQUE_APP_NAME} PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS}")
  374. if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  375. set_target_properties(TorqueEngine PROPERTIES COMPILE_FLAGS "${TORQUE_CXX_FLAGS_COMMON_DEFAULT}")
  376. endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  377. else()
  378. add_executable(${TORQUE_APP_NAME} ${TORQUE_SOURCE_FILES})
  379. # NOTE: On Linux, we set the rpath to ./ so that shared objects next to the executable are used
  380. set_target_properties(${TORQUE_APP_NAME} PROPERTIES LINK_FLAGS "-Wl,-rpath,./")
  381. endif()
  382. if(MSVC)
  383. # Match projectGenerator naming for executables
  384. set(OUTPUT_CONFIG DEBUG MINSIZEREL RELWITHDEBINFO)
  385. set(OUTPUT_SUFFIX DEBUG MINSIZE OPTIMIZEDDEBUG)
  386. foreach(INDEX RANGE 2)
  387. list(GET OUTPUT_CONFIG ${INDEX} CONF)
  388. list(GET OUTPUT_SUFFIX ${INDEX} SUFFIX)
  389. set_property(TARGET ${TORQUE_APP_NAME} PROPERTY OUTPUT_NAME_${CONF} ${TORQUE_APP_NAME}_${SUFFIX})
  390. if (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  391. set_property(TARGET TorqueEngine PROPERTY ${CONF}_POSTFIX "_${SUFFIX}")
  392. set_property(TARGET TorqueEngine PROPERTY ${CONF}_OUTPUT_NAME ${TORQUE_APP_NAME})
  393. endif (TORQUE_DYNAMIC_LIBRARY AND NOT TORQUE_TESTING)
  394. endforeach()
  395. # Set Visual Studio startup project
  396. set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${TORQUE_APP_NAME})
  397. endif()
  398. set_property(GLOBAL PROPERTY USE_FOLDERS ON)
  399. foreach (TORQUE_LIBRARY ${TORQUE_LINK_LIBRARIES})
  400. # Skip if it's a raw library file instead of a target
  401. if(TORQUE_LIBRARY MATCHES "\\.(lib|a|so|dylib|dll)$")
  402. continue()
  403. endif()
  404. set_target_properties(${TORQUE_LIBRARY} PROPERTIES
  405. FOLDER "Libraries")
  406. # remove warnings from 3rd parties.
  407. #target_compile_options(${TORQUE_LIBRARY} PRIVATE "-w")
  408. endforeach()
  409. target_compile_definitions(${TORQUE_APP_NAME} PUBLIC ${TORQUE_COMPILE_DEFINITIONS})
  410. target_link_libraries(${TORQUE_APP_NAME} ${TORQUE_LINK_LIBRARIES})
  411. if(APPLE)
  412. target_link_libraries(${TORQUE_APP_NAME} ${TORQUE_LINK_FRAMEWORKS})
  413. endif(APPLE)
  414. if(WIN32)
  415. target_link_libraries(${TORQUE_APP_NAME} ${TORQUE_LINK_WINDOWS})
  416. endif(WIN32)
  417. if(UNIX AND NOT APPLE)
  418. target_link_libraries(${TORQUE_APP_NAME} ${TORQUE_LINK_LINUX})
  419. endif(UNIX AND NOT APPLE)
  420. target_link_options(${TORQUE_APP_NAME} PUBLIC ${TORQUE_LINK_OPTIONS})
  421. if (TORQUE_TARGET_PROPERTIES)
  422. set_target_properties(${TORQUE_APP_NAME} PROPERTIES ${TORQUE_TARGET_PROPERTIES})
  423. endif (TORQUE_TARGET_PROPERTIES)
  424. target_include_directories(${TORQUE_APP_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} "${CMAKE_BINARY_DIR}/temp" ${TORQUE_INCLUDE_DIRECTORIES})
  425. if(TORQUE_TESTING)
  426. if(WIN32)
  427. target_link_options(${TORQUE_APP_NAME} PRIVATE "/SUBSYSTEM:CONSOLE")
  428. set_target_properties(gtest PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-")
  429. set_target_properties(gmock PROPERTIES COMPILE_FLAGS "/Zc:wchar_t-")
  430. endif()
  431. endif(TORQUE_TESTING)
  432. append_defs()
  433. # Process library binaries - these are coming from modules that are providing links to external, precompiled code that should be included
  434. # with the executable. This is done because on Windows, the .lib is separate from the .dll so we can't automatically scan for shared
  435. # objects in our link libraries in that case.
  436. foreach (LIBRARY_BINARY ${TORQUE_ADDITIONAL_LIBRARY_BINARIES})
  437. if (APPLE)
  438. # For OSX, we want these binaries to be copied to the Frameworks directory
  439. add_custom_command(TARGET ${TORQUE_APP_NAME} POST_BUILD
  440. COMMAND ${CMAKE_COMMAND} -E make_directory "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks"
  441. COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARY_BINARY} "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks/$(CONFIGURATION)")
  442. else()
  443. # All other platforms expect the file next to the executable
  444. add_custom_command(TARGET ${TORQUE_APP_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${LIBRARY_BINARY} "${TORQUE_APP_GAME_DIRECTORY}")
  445. endif (APPLE)
  446. endforeach()
  447. # Process link libraries for dynamic links - we do this on OSX/Linux to ensure the binaries end up in the correct App directory
  448. # as in the root CMake we force everything to be in game. This is necessary because on these platforms these are considered "libraries"
  449. # and not runtime binaries like we configure in the root CMake. We don't globally set library outputs to avoid outputting eg. a files to
  450. # our game directory.
  451. if (UNIX)
  452. get_target_property(GAME_LINK_LIBRARIES ${TORQUE_APP_NAME} LINK_LIBRARIES)
  453. foreach (GAME_LINK_LIBRARY ${GAME_LINK_LIBRARIES})
  454. # For eg. OSX some links are not valid targets - for example frameworks provided by OS
  455. if (TARGET ${GAME_LINK_LIBRARY})
  456. get_target_property(LINK_LIBRARY_TYPE ${GAME_LINK_LIBRARY} TYPE)
  457. # Only pay attention to shared libraries and make them output to the app resources
  458. if ("${LINK_LIBRARY_TYPE}" STREQUAL "SHARED_LIBRARY")
  459. if (APPLE)
  460. set_target_properties(${GAME_LINK_LIBRARY} PROPERTIES
  461. XCODE_ATTRIBUTE_SKIP_INSTALL YES
  462. )
  463. add_custom_command(TARGET ${TORQUE_APP_NAME} POST_BUILD
  464. COMMAND ${CMAKE_COMMAND} -E make_directory "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks"
  465. COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${GAME_LINK_LIBRARY}>" "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks/$<TARGET_FILE_NAME:${GAME_LINK_LIBRARY}>"
  466. COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_FILE:${GAME_LINK_LIBRARY}>" "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks/$<TARGET_LINKER_FILE_NAME:${GAME_LINK_LIBRARY}>"
  467. COMMAND ${CMAKE_COMMAND} -E create_symlink "$<TARGET_FILE:${GAME_LINK_LIBRARY}>" "${TORQUE_APP_GAME_DIRECTORY}/${TORQUE_APP_NAME}.app/Contents/Frameworks/lib$<TARGET_LINKER_FILE_BASE_NAME:${GAME_LINK_LIBRARY}>.1.dylib"
  468. )
  469. else()
  470. set_target_properties(${GAME_LINK_LIBRARY} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${TORQUE_APP_GAME_DIRECTORY}")
  471. endif(APPLE)
  472. endif()
  473. endif()
  474. endforeach()
  475. endif (UNIX)