- Install freedesktop files to CMAKE_INSTALL_PREFIX instead of /usr
- Include node_modules in copy (pre-fetched during fetch phase)
- Use electron-forge package with pre-downloaded Electron zip
- Install Electron app files on FreeBSD (treat like Linux)

--- src/node/desktop/CMakeLists.txt.orig	2025-12-01 09:09:04 UTC
+++ src/node/desktop/CMakeLists.txt
@@ -41,11 +41,11 @@ if(RSTUDIO_INSTALL_FREEDESKTOP)
    configure_file (${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/rstudio.desktop.in
                   ${RSTUDIO_FREEDESKTOP_BINARY_DIR}/rstudio.desktop)
    install(FILES ${RSTUDIO_FREEDESKTOP_BINARY_DIR}/rstudio.desktop
-         DESTINATION /usr/share/applications)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/applications)
 
    # mime types
    install(FILES ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/rstudio.xml
-         DESTINATION /usr/share/mime/packages)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/mime/packages)
 
    # define icon dirs
    set(RSTUDIO_ICONS_16 ${RSTUDIO_FREEDESKTOP_SOURCE_DIR}/icons/16x16)
@@ -56,41 +56,41 @@ if(RSTUDIO_INSTALL_FREEDESKTOP)
 
    # application icon
    install(FILES ${RSTUDIO_ICONS_32}/rstudio.png
-         DESTINATION /usr/share/pixmaps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/pixmaps)
    install(FILES ${RSTUDIO_ICONS_16}/rstudio.png
-         DESTINATION /usr/share/icons/hicolor/16x16/apps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/apps)
    install(FILES ${RSTUDIO_ICONS_24}/rstudio.png
-         DESTINATION /usr/share/icons/hicolor/24x24/apps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/24x24/apps)
    install(FILES ${RSTUDIO_ICONS_32}/rstudio.png
-         DESTINATION /usr/share/icons/hicolor/32x32/apps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/apps)
    install(FILES ${RSTUDIO_ICONS_48}/rstudio.png
-         DESTINATION /usr/share/icons/hicolor/48x48/apps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/apps)
    install(FILES ${RSTUDIO_ICONS_256}/rstudio.png
-         DESTINATION /usr/share/icons/hicolor/256x256/apps)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/apps)
 
    # .RData icon
    install(FILES ${RSTUDIO_ICONS_16}/application-x-r-data.png
-         DESTINATION /usr/share/icons/hicolor/16x16/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/mimetypes)
    install(FILES ${RSTUDIO_ICONS_24}/application-x-r-data.png
-         DESTINATION /usr/share/icons/hicolor/24x24/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/24x24/mimetypes)
    install(FILES ${RSTUDIO_ICONS_32}/application-x-r-data.png
-         DESTINATION /usr/share/icons/hicolor/32x32/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/mimetypes)
    install(FILES ${RSTUDIO_ICONS_48}/application-x-r-data.png
-         DESTINATION /usr/share/icons/hicolor/48x48/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/mimetypes)
    install(FILES ${RSTUDIO_ICONS_256}/application-x-r-data.png
-         DESTINATION /usr/share/icons/hicolor/256x256/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/mimetypes)
 
    # .Rproj icon
    install(FILES ${RSTUDIO_ICONS_16}/application-x-r-project.png
-         DESTINATION /usr/share/icons/hicolor/16x16/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/16x16/mimetypes)
    install(FILES ${RSTUDIO_ICONS_24}/application-x-r-project.png
-         DESTINATION /usr/share/icons/hicolor/24x24/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/24x24/mimetypes)
    install(FILES ${RSTUDIO_ICONS_32}/application-x-r-project.png
-         DESTINATION /usr/share/icons/hicolor/32x32/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/32x32/mimetypes)
    install(FILES ${RSTUDIO_ICONS_48}/application-x-r-project.png
-         DESTINATION /usr/share/icons/hicolor/48x48/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/48x48/mimetypes)
    install(FILES ${RSTUDIO_ICONS_256}/application-x-r-project.png
-         DESTINATION /usr/share/icons/hicolor/256x256/mimetypes)
+         DESTINATION ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor/256x256/mimetypes)
 endif()
 
 if(APPLE)
@@ -117,11 +117,7 @@ file(
 file(
    COPY "${CMAKE_CURRENT_SOURCE_DIR}/"
    DESTINATION "${ELECTRON_BINARY_DIR}/"
-   REGEX "/.webpack$" EXCLUDE
-   REGEX "/build$" EXCLUDE
-   REGEX "/bin$" EXCLUDE
-   REGEX "/out$" EXCLUDE
-   REGEX "/node_modules$" EXCLUDE)
+   REGEX "/.webpack$" EXCLUDE)
 
 configure_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/src/main/build-info.ts.in
@@ -165,11 +161,8 @@ else()
       DEPENDS "${DESKTOP_SOURCES}"
       COMMENT "Building desktop (Electron ${UNAME_M})"
       WORKING_DIRECTORY "${ELECTRON_BINARY_DIR}"
-      COMMAND
-         ${CMAKE_COMMAND} -E env
-         "PATH=${MODIFIED_PATH}"
-         "MAKEFLAGS="
-         ${NPM} run package
+      COMMAND ${CMAKE_COMMAND} -E env "PATH=${MODIFIED_PATH}" "MAKEFLAGS=" ${NPX} ts-node scripts/generate.ts
+      COMMAND ${CMAKE_COMMAND} -E env "PATH=${MODIFIED_PATH}" "MAKEFLAGS=" "NODE_INSTALLER=npm" ${NPX} electron-forge package --platform=linux
    )
 
 endif()
@@ -236,7 +229,7 @@ if(WIN32)
    install(FILES ${VCRUNTIME_X86_FILES} DESTINATION "${RSTUDIO_INSTALL_BIN}/x86")
    install(FILES ${VCRUNTIME_X64_FILES} DESTINATION "${RSTUDIO_INSTALL_BIN}")
 
-elseif(LINUX)
+elseif(LINUX OR CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
 
    if(UNAME_M STREQUAL aarch64)
       set(ELECTRON_ARCH arm64)
@@ -244,13 +237,15 @@ elseif(LINUX)
       set(ELECTRON_ARCH x64)
    endif()
 
+   # On FreeBSD, only install resources/app (Electron app files)
+   # since we use system electron37, not the bundled Electron
    install(
-      DIRECTORY "${ELECTRON_BINARY_DIR}/out/RStudio-linux-${ELECTRON_ARCH}/"
+      DIRECTORY "${ELECTRON_BINARY_DIR}/out/RStudio-linux-${ELECTRON_ARCH}/resources/app/"
       DIRECTORY_PERMISSIONS
       OWNER_READ OWNER_WRITE OWNER_EXECUTE
       GROUP_READ GROUP_EXECUTE
       WORLD_READ WORLD_EXECUTE
-      DESTINATION "${RSTUDIO_INSTALL_ELECTRON}"
+      DESTINATION "resources/app"
       USE_SOURCE_PERMISSIONS
    )
 
