diff options
Diffstat (limited to 'devel/RStudio/Makefile')
| -rw-r--r-- | devel/RStudio/Makefile | 215 |
1 files changed, 180 insertions, 35 deletions
diff --git a/devel/RStudio/Makefile b/devel/RStudio/Makefile index 1a1beb297822..804ed24948b6 100644 --- a/devel/RStudio/Makefile +++ b/devel/RStudio/Makefile @@ -3,15 +3,19 @@ PORTNAME= RStudio DISTVERSIONPREFIX= v -DISTVERSION= 2022.12.0+353 -PORTREVISION= 11 +DISTVERSION= 2025.09.2+418 +PORTREVISION= 1 CATEGORIES= devel math java MASTER_SITES= https://s3.amazonaws.com/rstudio-buildtools/dictionaries/:dictionaries \ - https://s3.amazonaws.com/rstudio-buildtools/:buildtools + https://rstudio-buildtools.s3.amazonaws.com/rstudio-buildtools/:gin \ + https://rstudio-buildtools.s3.us-east-1.amazonaws.com/gwt/:gwt \ + https://rstudio-buildtools.s3.us-east-1.amazonaws.com/gwt/:mathjax \ + https://github.com/quarto-dev/quarto/archive/:quarto_mono DISTFILES= core-dictionaries.zip:dictionaries \ - gin-${GIN_VERSION}.zip:buildtools \ - gwt-${GWT_VERSION}.zip:buildtools \ - mathjax-27.zip:buildtools + gin-${GIN_VERSION}.zip:gin \ + gwt-${GWT_VERSION}.tar.gz:gwt \ + mathjax-27.zip:mathjax \ + ${QUARTO_MONO_COMMIT}.tar.gz:quarto_mono MAINTAINER= yuri@FreeBSD.org COMMENT= Integrated development environment (IDE) for R @@ -21,27 +25,35 @@ WWW= https://www.rstudio.com/ \ LICENSE= AGPLv3 LICENSE_FILE= ${WRKSRC}/COPYING -BROKEN= fails to build with Boost>=1.87, see https://github.com/rstudio/rstudio/issues/15862 -BROKEN_i386= [ERROR] Line 101: Failed to resolve 'org.rstudio.studio.client.workbench.views.vcs.common.diff.LineActionButtonRenderer.GrayResources' via deferred binding +BROKEN_i386= fails to resolve 'org.rstudio.studio.client.workbench.views.vcs.common.diff.LineActionButtonRenderer.GrayResources' via deferred binding BUILD_DEPENDS= ant:devel/apache-ant \ ${LOCALBASE}/include/sys/sysinfo.h:devel/libsysinfo \ node:www/node \ pandoc:textproc/hs-pandoc \ - R-cran-rstudioapi>0:devel/R-cran-rstudioapi + R-cran-rstudioapi>0:devel/R-cran-rstudioapi \ + ${LOCALBASE}/include/gsl/gsl-lite.hpp:devel/gsl-lite \ + ${LOCALBASE}/include/rapidjson/rapidjson.h:devel/rapidjson \ + ${LOCALBASE}/include/websocketpp/version.hpp:devel/websocketpp \ + ${LOCALBASE}/include/tl/expected.hpp:devel/tl-expected LIB_DEPENDS= libR.so:math/R \ libboost_thread.so:devel/boost-libs \ libinotify.so:devel/libinotify \ libsoci_core.so:databases/soci \ libuuid.so:misc/libuuid \ - libyaml-cpp.so:devel/yaml-cpp + libyaml-cpp.so:devel/yaml-cpp \ + libfmt.so:devel/libfmt \ + libhunspell-1.7.so:textproc/hunspell +BUILD_DEPENDS+= quarto:textproc/quarto +RUN_DEPENDS= quarto:textproc/quarto FLAVORS= desktop server FLAVOR?= ${FLAVORS:[1]} server_PKGNAMESUFFIX= -server +server_BROKEN= does not build with the latest RStudio version, needs to be fixed USES= cmake fortran java:build localbase:ldflags pgsql pkgconfig sqlite ssl -JAVA_VERSION= 11 # Java 8 fails on aarch64: Internal Error (assembler_aarch64.hpp:237), pid=1644, tid=0x00000000000c62b6 guarantee(val < (1U << nbits)) failed: Field too big for insn +JAVA_VERSION= 17 # Build requires Java 17 target USE_GITHUB= yes GH_PROJECT= ${PORTNAME:tl} GH_TUPLE= rstudio:r2d3:v0.2.0:r2d3/dependencies/common/r2d3 \ @@ -50,30 +62,61 @@ GH_TUPLE= rstudio:r2d3:v0.2.0:r2d3/dependencies/common/r2d3 \ trestletech:plumber:v0.4.6:plumber/dependencies/common/plumber CMAKE_ARGS= -DFREEBSD_RSTUDIO_VERSION:STRING=${PORTVERSION} \ - -DFREEBSD_LIBDIR:STRING=${PREFIX}/lib + -DFREEBSD_LIBDIR:STRING=${PREFIX}/lib \ + -DRSTUDIO_DEPENDENCIES_QUARTO_DIR:STRING=${LOCALBASE}/share/quarto CMAKE_ARGS+= -DQT_QMAKE_EXECUTABLE:STRING=${QMAKE} CMAKE_ARGS+= -DRSTUDIO_BOOST_SIGNALS_VERSION=2 CMAKE_ARGS+= -DFREEBSD_PORT_VERSION:STRING=${DISTVERSION} CMAKE_ARGS+= -DFREEBSD_LOCALBASE:STRING=${LOCALBASE} # SOCI package is looked up here, see patch patch-src_cpp_CMakeLists.txt +#CMAKE_ON= RSTUDIO_USE_SYSTEM_DEPENDENCIES CMAKE_ON= RSTUDIO_USE_SYSTEM_YAML_CPP \ - RSTUDIO_USE_SYSTEM_SOCI + RSTUDIO_USE_SYSTEM_BOOST \ + RSTUDIO_USE_SYSTEM_HUNSPELL \ + RSTUDIO_USE_SYSTEM_SOCI \ + RSTUDIO_USE_SYSTEM_FMT \ + RSTUDIO_USE_SYSTEM_GSL_LITE \ + RSTUDIO_USE_SYSTEM_RAPIDJSON \ + RSTUDIO_USE_SYSTEM_WEBSOCKETPP \ + RSTUDIO_USE_SYSTEM_TL_EXPECTED \ + RSTUDIO_INSTALL_FREEDESKTOP +CMAKE_OFF= BUILD_TESTING \ + RSTUDIO_UNIT_TESTS_ENABLED MAKE_ENV= HOME=${WRKDIR} \ JAVA_HOME=${JAVA_HOME} \ PATH=${JAVA_HOME}/bin:${PATH} \ ANT_OPTS="-Duser.home=${WRKDIR}" LDFLAGS+= -lexecinfo -GWT_VERSION= 2.8.1 +GWT_VERSION= 2.12.2 # GWT_VER in src/gwt/tools/build-gwt GIN_VERSION= 2.1.2 +QUARTO_VERSION= 1.7.32 # Version expected by RStudio for panmirror build +QUARTO_MONO_COMMIT= 591b3520eafbb4da7b26b9f31aac6948801f19d8 # Commit from quarto monorepo with panmirror .if ${FLAVOR:U} == desktop COMMENT+= (desktop UI version) -USES+= desktop-file-utils qt:5 shared-mime-info -USE_QT= core dbus declarative gui location network opengl printsupport quickcontrols sensors \ - sql svg webchannel webengine widgets xml xmlpatterns buildtools:build qmake:build -CMAKE_ARGS+= -DRSTUDIO_TARGET=Desktop +USES+= desktop-file-utils shared-mime-info +FETCH_DEPENDS+= npm:www/npm \ + yarn:www/yarn +BUILD_DEPENDS+= npm:www/npm \ + yarn:www/yarn \ + electron37:devel/electron37 \ + zip:archivers/zip +RUN_DEPENDS+= electron37:devel/electron37 +CMAKE_ARGS+= -DRSTUDIO_TARGET=Electron +MAKE_ENV+= ELECTRON_SKIP_BINARY_DOWNLOAD=1 \ + npm_config_nodedir=${WRKDIR}/.electron-headers \ + ELECTRON_ZIP_DIR=${WRKDIR}/.electron-zip +LDFLAGS+= -linotify INSTALL_SUBDIR= ${PORTNAME:tl} EXECUTABLE= ${PORTNAME:tl} +# npm dependencies are pre-fetched during post-fetch phase +NPM_DISTDIR= ${DISTDIR}/${PORTNAME} +NPM_TARBALL= ${PORTNAME}-desktop-node_modules-${DISTVERSION}${EXTRACT_SUFX} +# quarto/panmirror dependencies (uses yarn workspaces) +QUARTO_TARBALL= ${PORTNAME}-quarto-node_modules-${DISTVERSION}${EXTRACT_SUFX} +# Add npm tarballs to DISTFILES for checksum verification +DISTFILES+= ${PORTNAME}/${NPM_TARBALL}:prefetch \ + ${PORTNAME}/${QUARTO_TARBALL}:prefetch .endif .if ${FLAVOR:U} == server @@ -87,27 +130,89 @@ SUB_LIST= USER=${USER} USE_RC_SUBR= ${PORTNAME:tl}-server .endif -OPTIONS_DEFINE= WITH_QUARTO +OPTIONS_DEFINE= COPILOT WITH_QUARTO +OPTIONS_DEFAULT= COPILOT WITH_QUARTO + +COPILOT_DESC= Build with Copilot support +COPILOT_CMAKE_BOOL= RSTUDIO_ENABLE_COPILOT +COPILOT_RUN_DEPENDS= copilot-language-server:misc/github-copilot-language-server WITH_QUARTO_DESC= Build with support for Quarto -WITH_QUARTO_CMAKE_BOOL= FREEBSD_QUARTO_ENABLED -WITH_QUARTO_BROKEN= Quarto isn't yet ported +WITH_QUARTO_CMAKE_BOOL= QUARTO_ENABLED + +# Custom fetch for desktop npm dependencies +.if ${FLAVOR:U} == desktop +post-fetch: + @if ! [ -f ${NPM_DISTDIR}/${NPM_TARBALL} ]; then \ + ${MKDIR} ${NPM_DISTDIR} && \ + ${ECHO_MSG} "====> Fetching npm dependencies for desktop..." && \ + ${MKDIR} ${WRKDIR}/tmp/rstudio-npm-fetch && \ + ${FETCH_CMD} -q "https://raw.githubusercontent.com/rstudio/rstudio/v${DISTVERSION}/src/node/desktop/package.json" -o ${WRKDIR}/tmp/rstudio-npm-fetch/package.json && \ + ${FETCH_CMD} -q "https://raw.githubusercontent.com/rstudio/rstudio/v${DISTVERSION}/src/node/desktop/package-lock.json" -o ${WRKDIR}/tmp/rstudio-npm-fetch/package-lock.json && \ + cd ${WRKDIR}/tmp/rstudio-npm-fetch && \ + HOME=${WRKDIR}/tmp/rstudio-npm-fetch npm ci --ignore-scripts && \ + ${FIND} node_modules -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} \; 2>/dev/null; \ + ${TAR} -czf ${NPM_DISTDIR}/${NPM_TARBALL} node_modules && \ + ${RM} -rf ${WRKDIR}/tmp/rstudio-npm-fetch && \ + ${ECHO_MSG} "====> Created npm dependencies tarball ${NPM_DISTDIR}/${NPM_TARBALL}"; \ + fi + @if ! [ -f ${NPM_DISTDIR}/${QUARTO_TARBALL} ]; then \ + ${MKDIR} ${NPM_DISTDIR} && \ + ${ECHO_MSG} "====> Fetching quarto/panmirror npm dependencies..." && \ + ${MKDIR} ${WRKDIR}/tmp/rstudio-quarto-fetch && \ + cd ${WRKDIR}/tmp/rstudio-quarto-fetch && \ + ${FETCH_CMD} -q "https://github.com/quarto-dev/quarto/archive/${QUARTO_MONO_COMMIT}.tar.gz" -o quarto.tar.gz && \ + ${TAR} -xzf quarto.tar.gz && \ + cd quarto-${QUARTO_MONO_COMMIT} && \ + HOME=${WRKDIR}/tmp/rstudio-quarto-fetch yarn install --ignore-scripts --network-timeout 240000 && \ + cd apps/panmirror && PANMIRROR_OUTDIR=dist-rstudio yarn build --minify true --sourcemap true && cd ../.. && \ + ${FIND} node_modules apps/*/node_modules packages/*/node_modules apps/panmirror/dist-rstudio -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} \; 2>/dev/null; \ + ${TAR} -czf ${NPM_DISTDIR}/${QUARTO_TARBALL} node_modules apps/*/node_modules packages/*/node_modules apps/panmirror/dist-rstudio && \ + ${RM} -rf ${WRKDIR}/tmp/rstudio-quarto-fetch && \ + ${ECHO_MSG} "====> Created quarto npm dependencies tarball"; \ + fi +.endif post-extract: @${MKDIR} ${WRKSRC}/dependencies/dictionaries && ${MV} ${WRKDIR}/en_* ${WRKSRC}/dependencies/dictionaries/ @${MV} ${WRKDIR}/mathjax-* ${WRKSRC}/dependencies/ - @${MKDIR} ${WRKSRC}/src/gwt/lib/gwt && ${MV} ${WRKDIR}/gwt-${GWT_VERSION} ${WRKSRC}/src/gwt/lib/gwt/${GWT_VERSION} - @${MKDIR} ${WRKSRC}/src/gwt/lib/gin/${GIN_VERSION} && ${MV} ${WRKDIR}/*.jar ${WRKSRC}/src/gwt/lib/gin/${GIN_VERSION}/ + # GWT libraries go into dependencies/common/gwtproject + @${MKDIR} ${WRKSRC}/dependencies/common/gwtproject/gwt && ${MV} ${WRKDIR}/gwt/gwt-rstudio ${WRKSRC}/dependencies/common/gwtproject/gwt/ + @${MKDIR} ${WRKSRC}/dependencies/common/gwtproject/gin/${GIN_VERSION} + @${MV} ${WRKDIR}/gin-${GIN_VERSION}.jar ${WRKSRC}/dependencies/common/gwtproject/gin/${GIN_VERSION}/ + @${MV} ${WRKDIR}/aopalliance.jar ${WRKSRC}/dependencies/common/gwtproject/gin/${GIN_VERSION}/ + @${MV} ${WRKDIR}/guice-*.jar ${WRKSRC}/dependencies/common/gwtproject/gin/${GIN_VERSION}/ + @${MV} ${WRKDIR}/javax.inject.jar ${WRKSRC}/dependencies/common/gwtproject/gin/${GIN_VERSION}/ + # Copy other gwtproject dependencies from extracted gwt tarball + @${MV} ${WRKDIR}/elemental2 ${WRKSRC}/dependencies/common/gwtproject/ + @${MV} ${WRKDIR}/jsinterop ${WRKSRC}/dependencies/common/gwtproject/ + @${MV} ${WRKDIR}/jspecify ${WRKSRC}/dependencies/common/gwtproject/ + # Setup quarto monorepo for panmirror build + # Copy entire quarto monorepo structure (needed for yarn workspaces) + @${MV} ${WRKDIR}/quarto-${QUARTO_MONO_COMMIT} ${WRKSRC}/src/gwt/lib/quarto + # add hunspell discovery module + @${CP} ${FILESDIR}/Findhunspell.cmake ${WRKSRC}/cmake/modules +.if ${FLAVOR:U} == desktop + # Extract pre-fetched npm node_modules for desktop electron build + @${ECHO_MSG} "====> Extracting pre-fetched npm dependencies..." + @cd ${WRKSRC}/src/node/desktop && ${TAR} -xzf ${NPM_DISTDIR}/${NPM_TARBALL} + # Extract pre-fetched quarto/panmirror npm dependencies + @${ECHO_MSG} "====> Extracting pre-fetched quarto npm dependencies..." + @cd ${WRKSRC}/src/gwt/lib/quarto && ${TAR} -xzf ${NPM_DISTDIR}/${QUARTO_TARBALL} + # Patch native modules binding.gyp to support FreeBSD (treat as Linux) + @${REINPLACE_CMD} "s/'OS==\"linux\"'/'OS==\"linux\" or OS==\"freebsd\"'/" \ + ${WRKSRC}/src/node/desktop/node_modules/node-system-fonts/binding.gyp + # For msgpackr-extract: add FreeBSD support and set compiler to cc + @${REINPLACE_CMD} -e "s/\"OS=='linux'\"/\"OS=='linux' or OS=='freebsd'\"/" \ + -e 's/"os_linux_compiler%": "gcc"/"os_linux_compiler%": "cc"/' \ + ${WRKSRC}/src/node/desktop/node_modules/msgpackr-extract/binding.gyp +.endif post-patch: + # quarto node_modules are pre-fetched and extracted + # Add Java 17+ compatibility args for GWT/Guice reflection @${REINPLACE_CMD} -e ' \ - s|target_link_libraries(rstudio|target_link_libraries(rstudio procstat|; \ - s|get_filename_component|#get_filename_component|; \ - s|set(CMAKE_PREFIX_PATH "$${QT_BIN_DIR}//..//lib//cmake")|set(CMAKE_PREFIX_PATH "${LOCALBASE}/lib/cmake")|; \ - s|/usr/share/|${PREFIX}/share/|g' \ - ${WRKSRC}/src/cpp/desktop/CMakeLists.txt - @${REINPLACE_CMD} -e ' \ - s|</java>|<jvmarg value="-Duser.home=${WRKDIR}"/></java>|' \ + s|</java>|<jvmarg value="-Duser.home=${WRKDIR}"/><jvmarg value="--add-opens=java.base/java.lang=ALL-UNNAMED"/></java>|' \ ${WRKSRC}/src/gwt/build.xml @${REINPLACE_CMD} -e ' \ s|rHomePaths.push_back|//rHomePaths.push_back|; \ @@ -116,16 +221,54 @@ post-patch: @${REINPLACE_CMD} -e ' \ s|<condition property="node.bin" value="../../../$${node.dir}/bin/node">|<condition property="node.bin" value="${LOCALBASE}/bin/node">|' \ ${WRKSRC}/src/gwt/build.xml + # quarto dependency + ${LN} -s ${LOCALBASE}/share/quarto ${WRKSRC}/dependencies/quarto # add $PREFIX/bin to PATH for the server daemon .if ${FLAVOR:U} == server @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|' ${WRKSRC}/src/cpp/session/modules/SessionGit.cpp .endif + # substitute LOCALBASE for copilot-language-server path + @${REINPLACE_CMD} -e 's|%%LOCALBASE%%|${LOCALBASE}|' ${WRKSRC}/src/cpp/session/include/session/SessionConstants.hpp + # correct for boost-1.87+ class replacement + @${FIND} ${WRKSRC} -name "*.cpp" -o -name "*.hpp" | ${XARGS} ${REINPLACE_CMD} -i "" -e 's/io_service/io_context/g' pre-build: - @${CP} ${FILESDIR}/global-setenv.h ${WRKSRC}/src/cpp/desktop/ - @${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' ${WRKSRC}/src/cpp/desktop/global-setenv.h + #@${CP} ${FILESDIR}/global-setenv.h ${WRKSRC}/src/cpp/desktop/ + #@${REINPLACE_CMD} -e 's|%%PREFIX%%|${PREFIX}|g' ${WRKSRC}/src/cpp/desktop/global-setenv.h +.if ${FLAVOR:U} == desktop + # Create proper electron headers structure for node-gyp + # node-gyp expects common.gypi at root and headers at include/node + @${MKDIR} ${WRKDIR}/.electron-headers + @${LN} -sf ${LOCALBASE}/share/electron37/node_headers/include ${WRKDIR}/.electron-headers/include + @${LN} -sf ${LOCALBASE}/share/electron37/node_headers/include/node/common.gypi ${WRKDIR}/.electron-headers/common.gypi + # Create electron ZIP for electron-packager (expects electron-v{VERSION}-linux-x64.zip) + @${MKDIR} ${WRKDIR}/.electron-zip + @cd ${LOCALBASE}/share/electron37 && zip -rq ${WRKDIR}/.electron-zip/electron-v37.6.1-linux-x64.zip \ + electron chromedriver *.so *.pak *.bin *.json locales resources version LICENSE LICENSES.chromium.html +.endif post-install: +.if ${FLAVOR:U} == desktop + # Desktop flavor: create launcher script that uses electron37 + @(echo "#!/bin/sh"; \ + echo ""; \ + echo "if ! [ -d /proc/curproc ]; then"; \ + echo " echo \"${PORTNAME} needs /proc to be mounted as procfs\" >&2"; \ + echo " exit 1"; \ + echo "fi"; \ + echo ""; \ + echo "# Environment setup"; \ + echo "export LD_PRELOAD=${PREFIX}/lib/gcc${GCC_DEFAULT}/libgcc_s.so"; \ + echo "export JAVA_HOME=${JAVA_HOME}"; \ + echo "export ELECTRON_IS_DEV=0"; \ + echo "export ELECTRON_FORCE_IS_PACKAGED=true"; \ + echo ""; \ + echo "exec ${PREFIX}/bin/electron37 ${PREFIX}/resources/app \"\$$@\"" \ + ) > ${STAGEDIR}${PREFIX}/bin/${EXECUTABLE} + @${CHMOD} +x ${STAGEDIR}${PREFIX}/bin/${EXECUTABLE} + -${REINPLACE_CMD} -i '' -e 's|^Exec=.*/rstudio|Exec=${PREFIX}/bin/${EXECUTABLE}|' ${STAGEDIR}${PREFIX}/share/applications/${EXECUTABLE}.desktop 2>/dev/null || true +.else + # Server flavor: create launcher script for rserver @(echo "#!/bin/sh"; \ echo ""; \ echo "if ! [ -d /proc/curproc ]; then"; \ @@ -134,19 +277,21 @@ post-install: echo "fi"; \ echo ""; \ echo "# workaround for the problem that RStudio passes /lib with LD_LIBRARY_PATH that causes the /lib/libgcc_s.so.1 conflict with gcc"; \ - echo "LD_PRELOAD=${PREFIX}/lib/gcc${GCC_DEFAULT}/libgcc_s.so JAVA_HOME=${JAVA_HOME} ${PREFIX}/lib/${INSTALL_SUBDIR}/bin/${EXECUTABLE} \"$$"@"\"" \ + echo "LD_PRELOAD=${PREFIX}/lib/gcc${GCC_DEFAULT}/libgcc_s.so JAVA_HOME=${JAVA_HOME} ${PREFIX}/lib/${INSTALL_SUBDIR}/bin/${EXECUTABLE} \"\$$@\"" \ ) > ${STAGEDIR}${PREFIX}/bin/${EXECUTABLE} @${CHMOD} +x ${STAGEDIR}${PREFIX}/bin/${EXECUTABLE} -.if ${FLAVOR:U} == desktop - ${REINPLACE_CMD} -i '' -e 's|^Exec=.*/rstudio|Exec=${PREFIX}/bin/${EXECUTABLE}|' ${STAGEDIR}${PREFIX}/share/applications/${EXECUTABLE}.desktop .endif .if ${FLAVOR:U} == server ${RM} ${STAGEDIR}${LOCALBASE}/lib/${INSTALL_SUBDIR}/bin/rstudio-server # not compatible with FreeBSD .endif + # Remove quarto files since quarto is installed by the quarto port + ${RM} -rf ${STAGEDIR}${PREFIX}/bin/quarto # Some functions expect the pandoc symlink. @${MKDIR} ${STAGEDIR}${PREFIX}/lib/${INSTALL_SUBDIR}/bin/pandoc @cd ${STAGEDIR}${PREFIX}/lib/${INSTALL_SUBDIR}/bin/pandoc && ${LN} -s ../../../../bin/pandoc # There is a variability in .js file names due to use of random numbers, so we use the automatic plist. @${SETENV} ${CO_ENV} ${SH} ${SCRIPTSDIR}/check-stagedir.sh makeplist | ${GREP} -v ^\/ | ${SED} -e 's|%%WWWDIR%%|www/rstudio| ; s|%%CMAKE_BUILD_TYPE%%|${CMAKE_BUILD_TYPE:tl}|' > ${TMPPLIST} +DISTINFO_FILE= ${.CURDIR}/distinfo.${FLAVOR} + .include <bsd.port.mk> |
