/src/cpp/desktop/CMakeLists.txt

http://github.com/rstudio/rstudio · CMake · 668 lines · 498 code · 97 blank · 73 comment · 44 complexity · a0d2f9f200c2e16e534ff625a321c014 MD5 · raw file

  1. #
  2. # CMakeLists.txt
  3. #
  4. # Copyright (C) 2021 by RStudio, PBC
  5. #
  6. # Unless you have received this program directly from RStudio pursuant
  7. # to the terms of a commercial license agreement with RStudio, then
  8. # this program is licensed to you under the terms of version 3 of the
  9. # GNU Affero General Public License. This program is distributed WITHOUT
  10. # ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,
  11. # MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the
  12. # AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.
  13. #
  14. #
  15. cmake_minimum_required(VERSION 3.4.3)
  16. project(DESKTOP)
  17. cmake_policy(SET CMP0043 NEW)
  18. # on unix prefer qtsdk installs over system-level libraries. note this
  19. # can be overriden by defining QT_QMAKE_EXECUTABLE when invoking cmake
  20. if(NOT WIN32)
  21. # prefer rstudio qtsdk install then home qtsdk install
  22. if(NOT QT_QMAKE_EXECUTABLE)
  23. if(APPLE)
  24. set(QT_COMPILER "clang_64")
  25. else()
  26. # Qt named compiler folder varies by platform
  27. if(CMAKE_SIZEOF_VOID_P EQUAL 8)
  28. set(QT_COMPILER "gcc_64")
  29. else()
  30. set(QT_COMPILER "gcc")
  31. endif()
  32. endif()
  33. set(QT_CANDIDATES 5.12.8 5.12.11 5.12.10)
  34. # find the newest installed Qt version among the versions we build
  35. # against
  36. foreach(QT_CANDIDATE ${QT_CANDIDATES})
  37. set(QT_VERSION_SUBDIR "${QT_CANDIDATE}")
  38. set(QMAKE_QT50_SDK "/opt/RStudio-QtSDK/Qt${QT_CANDIDATE}/${QT_VERSION_SUBDIR}/${QT_COMPILER}")
  39. if(EXISTS ${QMAKE_QT50_SDK})
  40. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}/bin/qmake")
  41. set(QT_VERSION "${QT_CANDIDATE}")
  42. break()
  43. endif()
  44. set(QMAKE_QT50_SDK "$ENV{HOME}/Qt${QT_CANDIDATE}/${QT_VERSION_SUBDIR}/${QT_COMPILER}")
  45. if(EXISTS ${QMAKE_QT50_SDK})
  46. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}/bin/qmake")
  47. set(QT_VERSION "${QT_CANDIDATE}")
  48. break()
  49. endif()
  50. set(QMAKE_QT50_SDK "$ENV{HOME}/Qt/${QT_VERSION_SUBDIR}/${QT_COMPILER}")
  51. if(EXISTS ${QMAKE_QT50_SDK})
  52. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}/bin/qmake")
  53. set(QT_VERSION "${QT_CANDIDATE}")
  54. break()
  55. endif()
  56. endforeach()
  57. endif()
  58. else()
  59. # Windows
  60. set(QT_VERSION "5.12.8")
  61. set(QT_VERSION_SUBDIR "${QT_VERSION}")
  62. if(NOT QT_QMAKE_EXECUTABLE)
  63. set(QMAKE_QT50_SDK "C:\\Qt\\Qt${QT_VERSION}\\${QT_VERSION_SUBDIR}\\msvc2017_64")
  64. if(EXISTS ${QMAKE_QT50_SDK})
  65. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}\\bin\\qmake.exe")
  66. endif()
  67. set(QMAKE_QT50_SDK "C:\\Qt\\${QT_VERSION_SUBDIR}\\msvc2017_64")
  68. if(EXISTS ${QMAKE_QT50_SDK})
  69. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}\\bin\\qmake.exe")
  70. endif()
  71. set(QMAKE_QT50_SDK "C:\\Qt${QT_VERSION}\\${QT_VERSION_SUBDIR}\\msvc2017_64")
  72. if(EXISTS ${QMAKE_QT50_SDK})
  73. set(QT_QMAKE_EXECUTABLE "${QMAKE_QT50_SDK}\\bin\\qmake.exe")
  74. endif()
  75. endif()
  76. endif()
  77. if(QT_QMAKE_EXECUTABLE)
  78. message(STATUS "Found Qt: ${QT_QMAKE_EXECUTABLE}")
  79. else()
  80. message(FATAL_ERROR "Did not find supported Qt SDK")
  81. endif()
  82. # set the cmake prefix path based on the location of the qmake executable
  83. get_filename_component(QT_BIN_DIR ${QT_QMAKE_EXECUTABLE} PATH)
  84. set(CMAKE_PREFIX_PATH "${QT_BIN_DIR}//..//lib//cmake")
  85. # find and include Qt
  86. add_definitions(
  87. -DQT_NO_CAST_FROM_ASCII
  88. -DQT_NO_CAST_TO_ASCII
  89. -DQT_DEPRECATED_WARNINGS
  90. -DQT_NO_SIGNALS_SLOTS_KEYWORDS)
  91. set(CMAKE_INCLUDE_CURRENT_DIR ON)
  92. find_package(Qt5Core REQUIRED)
  93. find_package(Qt5Widgets REQUIRED)
  94. find_package(Qt5Gui REQUIRED)
  95. find_package(Qt5Network REQUIRED)
  96. find_package(Qt5WebChannel REQUIRED)
  97. find_package(Qt5WebEngine REQUIRED)
  98. find_package(Qt5WebEngineWidgets REQUIRED)
  99. find_package(Qt5PrintSupport REQUIRED)
  100. find_package(Qt5Quick REQUIRED)
  101. find_package(Qt5QuickWidgets REQUIRED)
  102. find_package(Qt5Positioning REQUIRED)
  103. find_package(Qt5Sensors REQUIRED)
  104. find_package(Qt5Svg REQUIRED)
  105. find_package(Qt5Xml REQUIRED)
  106. find_package(Qt5XmlPatterns REQUIRED)
  107. find_package(Qt5Qml REQUIRED)
  108. find_package(Qt5Sql REQUIRED)
  109. find_package(Qt5OpenGL REQUIRED)
  110. if(UNIX AND NOT APPLE)
  111. find_package(Qt5DBus REQUIRED)
  112. endif()
  113. get_filename_component(QT_BINARY_PATH "${QT_BIN_DIR}" ABSOLUTE CACHE)
  114. get_filename_component(QT_PLUGIN_PATH "${QT_BIN_DIR}/../plugins" ABSOLUTE CACHE)
  115. get_filename_component(QT_LIBRARY_PATH "${QT_BIN_DIR}/../lib" ABSOLUTE CACHE)
  116. get_filename_component(QT_INSTALL_PATH "${QT_BIN_DIR}/.." ABSOLUTE CACHE)
  117. # disable clang warnings for qt sources
  118. if(APPLE)
  119. add_definitions(-Wno-unused-private-field
  120. -Wno-uninitialized)
  121. endif()
  122. # configure NOTICE file into build directory so it can be read at dev time
  123. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../../../NOTICE
  124. ${CMAKE_CURRENT_BINARY_DIR}/.. COPYONLY)
  125. # include files
  126. file(GLOB_RECURSE DESKTOP_HEADER_FILES "*.h*")
  127. if (NOT WIN32)
  128. list(REMOVE_ITEM DESKTOP_HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/DesktopChooseRHome.hpp)
  129. endif (NOT WIN32)
  130. set(MOC_DESKTOP_HEADER_FILES ${DESKTOP_HEADER_FILES})
  131. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  132. ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty/qtsingleapplication/qtlockedfile.h
  133. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopDetectRHome.hpp
  134. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopOptions.hpp
  135. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopRVersion.hpp
  136. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopNetworkProxyFactory.hpp
  137. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopProgressActivator.hpp
  138. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopUtils.hpp
  139. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopComUtils.hpp
  140. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopOfficeViewer.hpp
  141. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopWordViewer.hpp
  142. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopPowerpointViewer.hpp
  143. ${CMAKE_CURRENT_SOURCE_DIR}/desktop-config.h.in
  144. ${CMAKE_CURRENT_SOURCE_DIR}/DockTileView.hpp
  145. )
  146. if(WIN32)
  147. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  148. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopPosixApplication.hpp)
  149. endif()
  150. if(WIN32 OR APPLE)
  151. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  152. ${CMAKE_CURRENT_SOURCE_DIR}/synctex/evince/EvinceDaemon.hpp
  153. ${CMAKE_CURRENT_SOURCE_DIR}/synctex/evince/EvinceWindow.hpp
  154. ${CMAKE_CURRENT_SOURCE_DIR}/synctex/evince/EvinceSynctex.hpp
  155. )
  156. endif()
  157. if(NOT WIN32)
  158. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  159. ${CMAKE_CURRENT_SOURCE_DIR}/synctex/sumatra/SumatraSynctex.hpp
  160. )
  161. endif()
  162. if(NOT APPLE)
  163. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  164. ${CMAKE_CURRENT_SOURCE_DIR}/DockMenu.hpp
  165. )
  166. endif()
  167. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/desktop-config.h.in
  168. ${CMAKE_CURRENT_BINARY_DIR}/desktop-config.h)
  169. # source files
  170. set(DESKTOP_SOURCE_FILES
  171. DesktopActivationOverlay.cpp
  172. DesktopSessionServersOverlay.cpp
  173. DesktopBrowserWindow.cpp
  174. DesktopDownloadItemHelper.cpp
  175. DesktopGwtCallback.cpp
  176. DesktopGwtWindow.cpp
  177. DesktopInfo.cpp
  178. DesktopInputDialog.cpp
  179. DesktopMain.cpp
  180. DesktopMainWindow.cpp
  181. DesktopMenuCallback.cpp
  182. DesktopNetworkProxyFactory.cpp
  183. DesktopOptions.cpp
  184. DesktopUtils.cpp
  185. DesktopWebPage.cpp
  186. DesktopWebView.cpp
  187. DesktopWebProfile.cpp
  188. DesktopWindowTracker.cpp
  189. DesktopRCommandEvaluator.cpp
  190. DesktopSatelliteWindow.cpp
  191. DesktopSecondaryWindow.cpp
  192. DesktopSessionLauncher.cpp
  193. DesktopSlotBinders.cpp
  194. DesktopSubMenu.cpp
  195. DesktopSynctex.cpp
  196. DesktopJobLauncherOverlay.cpp
  197. RemoteDesktopSessionLauncherOverlay.cpp
  198. 3rdparty/qtsingleapplication/qtsingleapplication.cpp
  199. 3rdparty/qtsingleapplication/qtlocalpeer.cpp
  200. )
  201. if(WIN32)
  202. set(DESKTOP_SOURCE_FILES ${DESKTOP_SOURCE_FILES}
  203. DesktopChooseRHome.cpp
  204. DesktopComUtils.cpp
  205. DesktopOfficeViewer.cpp
  206. DesktopPowerpointViewer.cpp
  207. DesktopRVersion.cpp
  208. DesktopWin32ApplicationLaunch.cpp
  209. DesktopWin32DetectRHome.cpp
  210. DesktopWin32ProgressActivator.cpp
  211. DesktopWordViewer.cpp
  212. synctex/sumatra/SumatraSynctex.cpp
  213. "${CMAKE_CURRENT_BINARY_DIR}/rstudio.rc"
  214. )
  215. list(REMOVE_ITEM MOC_DESKTOP_HEADER_FILES
  216. ${CMAKE_CURRENT_SOURCE_DIR}/DesktopPosixApplication.hpp
  217. )
  218. else()
  219. set(DESKTOP_SOURCE_FILES ${DESKTOP_SOURCE_FILES}
  220. DesktopPosixApplication.cpp
  221. DesktopPosixApplicationLaunch.cpp
  222. DesktopPosixDetectRHome.cpp
  223. )
  224. if(NOT APPLE)
  225. set(DESKTOP_SOURCE_FILES ${DESKTOP_SOURCE_FILES}
  226. synctex/evince/EvinceDaemon.cpp
  227. synctex/evince/EvinceSynctex.cpp
  228. synctex/evince/EvinceWindow.cpp
  229. )
  230. endif()
  231. endif(WIN32)
  232. if(APPLE)
  233. set(DESKTOP_SOURCE_FILES ${DESKTOP_SOURCE_FILES}
  234. DesktopUtilsMac.mm
  235. DesktopGwtCallbackMac.mm
  236. DockMenu.cpp
  237. DockTileView.mm
  238. ScriptCommand.mm
  239. )
  240. else()
  241. set(DESKTOP_SOURCE_FILES ${DESKTOP_SOURCE_FILES}
  242. DockTileView.cpp
  243. )
  244. endif()
  245. # include directories
  246. include_directories(
  247. include
  248. ${CORE_SOURCE_DIR}/include
  249. ${SHARED_CORE_SOURCE_DIR}/include
  250. ${OPENSSL_INCLUDE_DIR}
  251. ${CMAKE_CURRENT_SOURCE_DIR}
  252. ${CMAKE_CURRENT_BINARY_DIR}
  253. ${EXT_SOURCE_DIR}
  254. ${SESSION_SOURCE_DIR}/include
  255. ${TESTS_INCLUDE_DIR}
  256. )
  257. # ensure moc files are generated
  258. qt5_wrap_cpp(MOC_DESKTOP_SOURCE_FILES ${MOC_DESKTOP_HEADER_FILES})
  259. qt5_wrap_ui(DESKTOP_UI_SOURCES
  260. DesktopChooseRHome.ui
  261. DesktopInputDialog.ui
  262. )
  263. set(DESKTOP_RESOURCES_FILES desktop.qrc)
  264. qt5_add_resources(DESKTOP_RESOURCES_SOURCES ${DESKTOP_RESOURCES_FILES})
  265. if(WIN32)
  266. # configure rstudio.rc
  267. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/rstudio.rc.in
  268. ${CMAKE_CURRENT_BINARY_DIR}/rstudio.rc)
  269. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/RStudio.ico
  270. ${CMAKE_CURRENT_BINARY_DIR}/RStudio.ico COPYONLY)
  271. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/RProject.ico
  272. ${CMAKE_CURRENT_BINARY_DIR}/RProject.ico COPYONLY)
  273. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/rstudio.exe.manifest
  274. ${CMAKE_CURRENT_BINARY_DIR}/rstudio.exe.manifest COPYONLY)
  275. if(NOT RSTUDIO_SESSION_WIN32)
  276. add_subdirectory(urlopener)
  277. add_subdirectory(synctex/rsinverse)
  278. endif()
  279. endif(WIN32)
  280. # determine whether we should bundle Qt. we pretty much always want to
  281. # bundle it unless we are building on linux and NOT linking against the
  282. # qtsdk -- in that case we are linking against system versions of the
  283. # qt libraries which should therefore not be bundled
  284. if(APPLE OR WIN32 OR
  285. RSTUDIO_PACKAGE_BUILD OR
  286. (${QT_LIBRARY_DIR} MATCHES ".*QtSDK.*"))
  287. set(RSTUDIO_BUNDLE_QT TRUE)
  288. endif()
  289. set(RSTUDIO_QTMODULES
  290. Qt5::Core
  291. Qt5::Widgets
  292. Qt5::Gui
  293. Qt5::Network
  294. Qt5::WebChannel
  295. Qt5::WebEngine
  296. Qt5::WebEngineWidgets
  297. Qt5::PrintSupport
  298. Qt5::Quick
  299. Qt5::QuickWidgets
  300. Qt5::Positioning
  301. Qt5::Sensors
  302. Qt5::Svg
  303. Qt5::Xml
  304. Qt5::XmlPatterns
  305. Qt5::Qml
  306. )
  307. if(UNIX AND NOT APPLE)
  308. set(RSTUDIO_QTMODULES ${RSTUDIO_QTMODULES}
  309. Qt5::DBus
  310. )
  311. endif()
  312. # configure launch settings (for Visual Studio on Windows)
  313. if(WIN32)
  314. configure_file(
  315. "${CMAKE_CURRENT_SOURCE_DIR}/launch.vs.json.in"
  316. "${CMAKE_CURRENT_BINARY_DIR}/launch.vs.json"
  317. @ONLY)
  318. endif()
  319. # define executable (Windows & Linux)
  320. if(NOT APPLE)
  321. add_stripped_executable(rstudio
  322. ${DESKTOP_SOURCE_FILES}
  323. ${MOC_DESKTOP_SOURCE_FILES}
  324. ${DESKTOP_RESOURCES_SOURCES}
  325. ${DESKTOP_UI_SOURCES}
  326. )
  327. if(WIN32)
  328. set_target_properties(rstudio PROPERTIES WIN32_EXECUTABLE YES)
  329. endif()
  330. # These cause issues with macdeployqt due to missing dependencies; suspect we don't need
  331. # these on any platform.
  332. set(RSTUDIO_QTMODULES ${RSTUDIO_QTMODULES}
  333. Qt5::Sql
  334. Qt5::OpenGL
  335. )
  336. # add rpath for linux so we can find qt libraries in our bin dir
  337. if(UNIX AND RSTUDIO_BUNDLE_QT)
  338. set(CMAKE_BUILD_WITH_INSTALL_RPATH TRUE)
  339. set_target_properties(rstudio PROPERTIES
  340. INSTALL_RPATH \$ORIGIN)
  341. endif()
  342. # set link dependencies
  343. target_link_libraries(rstudio
  344. ${RSTUDIO_QTMODULES}
  345. ${QT_LIBRARIES}
  346. ${Boost_LIBRARIES}
  347. rstudio-core
  348. ${CRASHPAD_LIBRARIES}
  349. ${LINK_FLAGS}
  350. )
  351. # extra dependencies for Windows
  352. if(WIN32)
  353. target_link_libraries(rstudio Version Crypt32)
  354. endif()
  355. # for OSX we create a bundle
  356. else()
  357. # configure Info.plist
  358. configure_file (${CMAKE_CURRENT_SOURCE_DIR}/Info.plist.in
  359. ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
  360. # collect list of icns files
  361. file(GLOB ICNS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/icns/*.icns)
  362. file(GLOB PNG_FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/png/*.png)
  363. # set our icns as the bundle icon
  364. set(MACOSX_BUNDLE_ICON_FILE RStudio.icns)
  365. set_source_files_properties(${ICNS_FILES}
  366. PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  367. set_source_files_properties(${PNG_FILES}
  368. PROPERTIES MACOSX_PACKAGE_LOCATION Resources)
  369. # define bundle name and executable
  370. set(MACOSX_BUNDLE_BUNDLE_NAME "RStudio")
  371. add_stripped_executable(RStudio MACOSX_BUNDLE
  372. ${DESKTOP_SOURCE_FILES}
  373. ${MOC_DESKTOP_SOURCE_FILES}
  374. ${DESKTOP_RESOURCES_SOURCES}
  375. ${DESKTOP_UI_SOURCES}
  376. ${ICNS_FILES}
  377. ${PNG_FILES})
  378. target_link_libraries(RStudio
  379. ${RSTUDIO_QTMODULES}
  380. ${QT_LIBRARIES}
  381. rstudio-core
  382. ${APPLICATION_SERVICES_LIBRARY}
  383. ${COCOA_LIBRARY}
  384. ${SECURITY_LIBRARY}
  385. ${CRASHPAD_LIBRARIES})
  386. endif()
  387. # install target (OSX install goes into the bundle)
  388. if(APPLE)
  389. set_target_properties(RStudio PROPERTIES
  390. MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
  391. install(TARGETS RStudio BUNDLE DESTINATION .)
  392. install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/RStudio.sdef
  393. DESTINATION ${RSTUDIO_INSTALL_SUPPORTING})
  394. else()
  395. install(TARGETS rstudio DESTINATION ${RSTUDIO_INSTALL_BIN})
  396. endif()
  397. # bundle qt dependencies if this is a package build
  398. if(RSTUDIO_BUNDLE_QT)
  399. # set lib suffix for windows
  400. if(CMAKE_BUILD_TYPE STREQUAL "Debug")
  401. set(LIB_SUFFIX "d")
  402. else()
  403. set(LIB_SUFFIX "")
  404. endif()
  405. # install qt conf
  406. if(APPLE)
  407. set(QTCONF_DEST_DIR ${RSTUDIO_INSTALL_SUPPORTING})
  408. set(QTPLUGINS_DEST_DIR RStudio.app/Contents)
  409. else()
  410. set(QTCONF_DEST_DIR ${RSTUDIO_INSTALL_BIN})
  411. set(QTPLUGINS_DEST_DIR ${RSTUDIO_INSTALL_BIN})
  412. endif()
  413. if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/qt.conf)
  414. install(
  415. FILES ${CMAKE_CURRENT_SOURCE_DIR}/qt.conf
  416. DESTINATION ${QTCONF_DEST_DIR})
  417. endif()
  418. # copy qt plugins
  419. if(WIN32)
  420. set(QT_IMAGEFORMATS_DIR "${Qt5Core_DIR}/../../../plugins/imageformats")
  421. install(PROGRAMS "${QT_IMAGEFORMATS_DIR}/qgif${LIB_SUFFIX}.dll"
  422. "${QT_IMAGEFORMATS_DIR}/qico${LIB_SUFFIX}.dll"
  423. "${QT_IMAGEFORMATS_DIR}/qjpeg${LIB_SUFFIX}.dll"
  424. "${QT_IMAGEFORMATS_DIR}/qsvg${LIB_SUFFIX}.dll"
  425. "${QT_IMAGEFORMATS_DIR}/qtga${LIB_SUFFIX}.dll"
  426. "${QT_IMAGEFORMATS_DIR}/qtiff${LIB_SUFFIX}.dll"
  427. DESTINATION ${QTPLUGINS_DEST_DIR}/plugins/imageformats)
  428. set(QT_PLATFORMS_DIR "${Qt5Core_DIR}/../../../plugins/platforms")
  429. install(PROGRAMS "${QT_PLATFORMS_DIR}/qminimal${LIB_SUFFIX}.dll"
  430. "${QT_PLATFORMS_DIR}/qwindows${LIB_SUFFIX}.dll"
  431. DESTINATION "${QTPLUGINS_DEST_DIR}/plugins/platforms")
  432. endif()
  433. if(WIN32)
  434. find_program(WINDEPLOYQT_COMMAND windeployqt PATHS "${QT_BIN_DIR}" NO_DEFAULT_PATH)
  435. if (NOT WINDEPLOYQT_COMMAND)
  436. message(FATAL_ERROR "Did not find windeployqt under ${QT_BIN_DIR}.")
  437. endif()
  438. install(CODE "execute_process(COMMAND \"${WINDEPLOYQT_COMMAND}\" \"\${CMAKE_INSTALL_PREFIX}\\\\bin\\\\rstudio.exe\" --no-compiler-runtime --verbose 0)")
  439. # MSVC runtime
  440. include(InstallRequiredSystemLibraries)
  441. install(FILES ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS} DESTINATION ${RSTUDIO_INSTALL_BIN})
  442. elseif(APPLE)
  443. # fixup bundle on osx
  444. set(APPS "\${CMAKE_INSTALL_PREFIX}/RStudio.app")
  445. set(RSTUDIO_APP_BIN "\${CMAKE_INSTALL_PREFIX}/RStudio.app/Contents/MacOS/RStudio")
  446. find_program(MACDEPLOYQT_COMMAND macdeployqt PATHS "${QT_BIN_DIR}" NO_DEFAULT_PATH)
  447. if (NOT MACDEPLOYQT_COMMAND)
  448. message(FATAL_ERROR "Did not find macdeployqt under ${QT_BIN_DIR}.")
  449. endif()
  450. # this copies over the frameworks and plugins
  451. install(CODE "execute_process(COMMAND \"${MACDEPLOYQT_COMMAND}\" \"${APPS}\" -verbose=1 -always-overwrite -no-strip)")
  452. # fixups needed after running macdeployqt
  453. install(CODE "execute_process(COMMAND install_name_tool -add_rpath \"@executable_path/../Frameworks\" \"${RSTUDIO_APP_BIN}\")")
  454. # figure out where the system libcrypto lives
  455. find_package(OpenSSL REQUIRED QUIET)
  456. get_filename_component(LIBCRYPTO ${OPENSSL_CRYPTO_LIBRARY} REALPATH)
  457. get_filename_component(LIBCRYPTO_FILE ${LIBCRYPTO} NAME)
  458. get_filename_component(LIBSSL ${OPENSSL_SSL_LIBRARY} REALPATH)
  459. get_filename_component(LIBSSL_FILE ${LIBSSL} NAME)
  460. install(CODE "execute_process(COMMAND install_name_tool -change ${LIBCRYPTO} @executable_path/../Frameworks/${LIBCRYPTO_FILE} ${APPS}/Contents/Frameworks/${LIBSSL_FILE})")
  461. # copy qt shared objects directly to bin on unix (fixed up rpath above)
  462. elseif(UNIX)
  463. # install dependent libraries
  464. get_filename_component(QT_LIBRARY_DIR "${Qt5Core_DIR}/../../../lib" ABSOLUTE CACHE)
  465. get_filename_component(QT_RESOURCES_DIR "${Qt5Core_DIR}/../../../resources" ABSOLUTE CACHE)
  466. set(QT_FULL_VERSION ${QT_VERSION})
  467. set(SO_VERSION 56)
  468. # tell RStudio to link to icu
  469. set(ICU_LIBRARIES libicui18n libicuuc libicudata)
  470. foreach(ICU_LIBRARY ${ICU_LIBRARIES})
  471. add_library(${ICU_LIBRARY} SHARED IMPORTED)
  472. set_property(TARGET ${ICU_LIBRARY} PROPERTY IMPORTED_LOCATION "${QT_LIBRARY_DIR}/${ICU_LIBRARY}.so")
  473. endforeach()
  474. target_link_libraries(rstudio ${ICU_LIBRARIES})
  475. # configure and install qt
  476. configure_file(
  477. "${CMAKE_CURRENT_SOURCE_DIR}/install/LinuxInstallQt.sh.in"
  478. "${CMAKE_CURRENT_BINARY_DIR}/install/LinuxInstallQt.sh"
  479. @ONLY)
  480. install_process(
  481. "${CMAKE_CURRENT_BINARY_DIR}/install/LinuxInstallQt.sh")
  482. endif()
  483. endif(RSTUDIO_BUNDLE_QT)
  484. # install HTML templates
  485. file(
  486. COPY ${CMAKE_CURRENT_SOURCE_DIR}/html
  487. DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resources)
  488. install(
  489. DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resources/html
  490. DESTINATION ${RSTUDIO_INSTALL_SUPPORTING}/resources)
  491. # install stylesheets
  492. if(NOT APPLE)
  493. file(
  494. COPY ${CMAKE_CURRENT_SOURCE_DIR}/stylesheets
  495. DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/resources)
  496. install(
  497. DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/resources/stylesheets
  498. DESTINATION ${RSTUDIO_INSTALL_SUPPORTING}/resources)
  499. endif()
  500. if (UNIX AND NOT APPLE)
  501. # add rstudio icon to root (so people installing from source or tar.gz can find it
  502. install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/freedesktop/icons/48x48/rstudio.png
  503. DESTINATION ${RSTUDIO_INSTALL_SUPPORTING})
  504. # install configured backtrace utility on linux
  505. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/rstudio-backtrace.sh.in
  506. ${CMAKE_CURRENT_BINARY_DIR}/rstudio-backtrace.sh)
  507. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/rstudio-backtrace.sh
  508. DESTINATION ${RSTUDIO_INSTALL_BIN})
  509. endif()
  510. # install mac-terminal script on apple
  511. if(APPLE)
  512. configure_file(${CMAKE_CURRENT_SOURCE_DIR}/mac-terminal.in
  513. ${CMAKE_CURRENT_BINARY_DIR}/mac-terminal)
  514. install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/mac-terminal
  515. DESTINATION ${RSTUDIO_INSTALL_BIN})
  516. endif()
  517. # install desktop integration files on linux
  518. if(RSTUDIO_INSTALL_FREEDESKTOP)
  519. # define freedesktop dirs
  520. set(RSTUDIO_FREEDESKTOP_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/resources/freedesktop)
  521. set(RSTUDIO_FREEDESKTOP_BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/resources/freedesktop)
  522. # desktop file (dynamically configured with paths)
  523. configure_file (${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/rstudio.desktop.in
  524. ${RSTUDIO_FREEDESKTOP_BINARY_DIR}/rstudio.desktop)
  525. install(FILES ${RSTUDIO_FREEDESKTOP_BINARY_DIR}/rstudio.desktop
  526. DESTINATION /usr/share/applications)
  527. # mime types
  528. install(FILES ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/rstudio.xml
  529. DESTINATION /usr/share/mime/packages)
  530. # define icon dirs
  531. set(RSTUDIO_ICONS_16 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/16x16)
  532. set(RSTUDIO_ICONS_24 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/24x24)
  533. set(RSTUDIO_ICONS_32 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/32x32)
  534. set(RSTUDIO_ICONS_48 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/48x48)
  535. set(RSTUDIO_ICONS_256 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/256x256)
  536. # application icon
  537. install(FILES ${RSTUDIO_ICONS_32}/rstudio.png
  538. DESTINATION /usr/share/pixmaps)
  539. install(FILES ${RSTUDIO_ICONS_16}/rstudio.png
  540. DESTINATION /usr/share/icons/hicolor/16x16/apps)
  541. install(FILES ${RSTUDIO_ICONS_24}/rstudio.png
  542. DESTINATION /usr/share/icons/hicolor/24x24/apps)
  543. install(FILES ${RSTUDIO_ICONS_32}/rstudio.png
  544. DESTINATION /usr/share/icons/hicolor/32x32/apps)
  545. install(FILES ${RSTUDIO_ICONS_48}/rstudio.png
  546. DESTINATION /usr/share/icons/hicolor/48x48/apps)
  547. install(FILES ${RSTUDIO_ICONS_256}/rstudio.png
  548. DESTINATION /usr/share/icons/hicolor/256x256/apps)
  549. # .RData icon
  550. install(FILES ${RSTUDIO_ICONS_16}/application-x-r-data.png
  551. DESTINATION /usr/share/icons/hicolor/16x16/mimetypes)
  552. install(FILES ${RSTUDIO_ICONS_24}/application-x-r-data.png
  553. DESTINATION /usr/share/icons/hicolor/24x24/mimetypes)
  554. install(FILES ${RSTUDIO_ICONS_32}/application-x-r-data.png
  555. DESTINATION /usr/share/icons/hicolor/32x32/mimetypes)
  556. install(FILES ${RSTUDIO_ICONS_48}/application-x-r-data.png
  557. DESTINATION /usr/share/icons/hicolor/48x48/mimetypes)
  558. install(FILES ${RSTUDIO_ICONS_256}/application-x-r-data.png
  559. DESTINATION /usr/share/icons/hicolor/256x256/mimetypes)
  560. # .Rproj icon
  561. install(FILES ${RSTUDIO_ICONS_16}/application-x-r-project.png
  562. DESTINATION /usr/share/icons/hicolor/16x16/mimetypes)
  563. install(FILES ${RSTUDIO_ICONS_24}/application-x-r-project.png
  564. DESTINATION /usr/share/icons/hicolor/24x24/mimetypes)
  565. install(FILES ${RSTUDIO_ICONS_32}/application-x-r-project.png
  566. DESTINATION /usr/share/icons/hicolor/32x32/mimetypes)
  567. install(FILES ${RSTUDIO_ICONS_48}/application-x-r-project.png
  568. DESTINATION /usr/share/icons/hicolor/48x48/mimetypes)
  569. install(FILES ${RSTUDIO_ICONS_256}/application-x-r-project.png
  570. DESTINATION /usr/share/icons/hicolor/256x256/mimetypes)
  571. endif()