-
-
Notifications
You must be signed in to change notification settings - Fork 15.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
7 changed files
with
8,538 additions
and
140 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,61 @@ | ||
diff --git i/src/cpp/core/libclang/LibClang.cpp w/src/cpp/core/libclang/LibClang.cpp | ||
index ec12a3a1ff..8c81b633ae 100644 | ||
--- i/src/cpp/core/libclang/LibClang.cpp | ||
+++ w/src/cpp/core/libclang/LibClang.cpp | ||
@@ -54,7 +54,7 @@ std::vector<std::string> defaultCompileArgs(LibraryVersion version) | ||
diff --git a/src/cpp/core/libclang/LibClang.cpp b/src/cpp/core/libclang/LibClang.cpp | ||
index 1186f3a..58e8cc7 100644 | ||
--- a/src/cpp/core/libclang/LibClang.cpp | ||
+++ b/src/cpp/core/libclang/LibClang.cpp | ||
@@ -58,7 +58,7 @@ std::vector<std::string> defaultCompileArgs(LibraryVersion version) | ||
|
||
// we need to add in the associated libclang headers as | ||
// they are not discovered / used by default during compilation | ||
- FilePath llvmPath = s_libraryPath.parent().parent(); | ||
- FilePath llvmPath = s_libraryPath.getParent().getParent(); | ||
+ FilePath llvmPath("@libclang@"); | ||
boost::format fmt("%1%/lib/clang/%2%/include"); | ||
fmt % llvmPath.absolutePath() % version.asString(); | ||
fmt % llvmPath.getAbsolutePath() % version.asString(); | ||
std::string includePath = fmt.str(); | ||
@@ -77,10 +77,7 @@ std::vector<std::string> systemClangVersions() | ||
#elif defined(__unix__) | ||
// default set of versions | ||
clangVersions = { | ||
@@ -70,46 +70,7 @@ std::vector<std::string> defaultCompileArgs(LibraryVersion version) | ||
|
||
std::vector<std::string> systemClangVersions() | ||
{ | ||
- std::vector<std::string> clangVersions; | ||
- | ||
-#if defined(__APPLE__) | ||
- // NOTE: the version of libclang.dylib bundled with Xcode | ||
- // doesn't seem to work well when loaded as a library | ||
- // (there seems to be extra orchestration required to get | ||
- // include paths set up; easier to just depend on command | ||
- // line tools since we request their installation in other | ||
- // contexts as well) | ||
- clangVersions = { | ||
- "/Library/Developer/CommandLineTools/usr/lib/libclang.dylib" | ||
- }; | ||
-#elif defined(__unix__) | ||
- // default set of versions | ||
- clangVersions = { | ||
- "/usr/lib/libclang.so", | ||
- "/usr/lib/llvm/libclang.so", | ||
- "/usr/lib64/libclang.so", | ||
- "/usr/lib64/llvm/libclang.so", | ||
+ "@libclang.so@" | ||
}; | ||
|
||
// iterate through the set of available 'llvm' directories | ||
- }; | ||
- | ||
- // iterate through the set of available 'llvm' directories | ||
- for (const char* prefix : {"/usr/lib", "/usr/lib64"}) | ||
- { | ||
- FilePath prefixPath(prefix); | ||
- if (!prefixPath.exists()) | ||
- continue; | ||
- | ||
- std::vector<FilePath> directories; | ||
- Error error = prefixPath.getChildren(directories); | ||
- if (error) | ||
- LOG_ERROR(error); | ||
- | ||
- // generate a path for each 'llvm' directory | ||
- for (const FilePath& path : directories) | ||
- if (path.getFilename().find("llvm") == 0) | ||
- clangVersions.push_back(path.completePath("lib/libclang.so.1").getAbsolutePath()); | ||
- } | ||
-#endif | ||
- | ||
+ std::vector<std::string> clangVersions = { "@libclang.so@" }; | ||
return clangVersions; | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,141 +1,209 @@ | ||
{ lib, mkDerivation, fetchurl, fetchpatch, fetchFromGitHub, makeDesktopItem, cmake, boost, zlib | ||
, openssl, R, qtbase, qtxmlpatterns, qtsensors, qtwebengine, qtwebchannel | ||
, libuuid, hunspellDicts, unzip, ant, jdk, gnumake, makeWrapper, pandoc | ||
{ lib | ||
, mkDerivation | ||
, fetchurl | ||
, fetchpatch | ||
, fetchFromGitHub | ||
, makeDesktopItem | ||
, copyDesktopItems | ||
, cmake | ||
, boost | ||
, zlib | ||
, openssl | ||
, R | ||
, qtbase | ||
, qtxmlpatterns | ||
, qtsensors | ||
, qtwebengine | ||
, qtwebchannel | ||
, libuuid | ||
, hunspellDicts | ||
, unzip | ||
, ant | ||
, jdk | ||
, gnumake | ||
, makeWrapper | ||
, pandoc | ||
, llvmPackages | ||
, libyamlcpp | ||
, soci | ||
, postgresql | ||
, nodejs | ||
, mkYarnModules | ||
, qmake | ||
}: | ||
|
||
with lib; | ||
let | ||
verMajor = "1"; | ||
verMinor = "2"; | ||
verPatch = "5042"; | ||
version = "${verMajor}.${verMinor}.${verPatch}"; | ||
ginVer = "2.1.2"; | ||
gwtVer = "2.8.1"; | ||
in | ||
mkDerivation rec { | ||
pname = "RStudio"; | ||
inherit version; | ||
|
||
nativeBuildInputs = [ cmake unzip ant jdk makeWrapper pandoc ]; | ||
|
||
buildInputs = [ boost zlib openssl R qtbase qtxmlpatterns qtsensors | ||
qtwebengine qtwebchannel libuuid ]; | ||
version = "1.4.1717"; | ||
RSTUDIO_VERSION_MAJOR = lib.versions.major version; | ||
RSTUDIO_VERSION_MINOR = lib.versions.minor version; | ||
RSTUDIO_VERSION_PATCH = lib.versions.patch version; | ||
|
||
src = fetchFromGitHub { | ||
owner = "rstudio"; | ||
repo = "rstudio"; | ||
rev = "v${version}"; | ||
sha256 = "1n67fa357v51j3z1ma8v2ydfsx3y8n10k2svmfcf4mdzsi8w0kc5"; | ||
rev = version; | ||
sha256 = "sha256-9c1bNsf8kJjpcZ2cMV/pPNtXQkFOntX29a1cdnXpllE="; | ||
}; | ||
|
||
# Hack RStudio to only use the input R and provided libclang. | ||
patches = [ ./r-location.patch ./clang-location.patch | ||
(fetchpatch { | ||
# Fetch a patch to ensure Rstudio compiles against R | ||
# 4.0.0, should be removed next 1.2.X Rstudio update | ||
# or possibly 1.3.X | ||
url = "https://github.com/rstudio/rstudio/commit/3fb2397c2f208bb8ace0bbaf269481ccb96b5b20.patch"; | ||
sha256 = "0qpgjy6aash0fc0xbns42cwpj3nsw49nkbzwyq8az01xwg81g0f3"; | ||
}) | ||
]; | ||
postPatch = '' | ||
substituteInPlace src/cpp/core/r_util/REnvironmentPosix.cpp --replace '@R@' ${R} | ||
substituteInPlace src/cpp/core/libclang/LibClang.cpp \ | ||
--replace '@libclang@' ${llvmPackages.libclang.lib} \ | ||
--replace '@libclang.so@' ${llvmPackages.libclang.lib}/lib/libclang.so | ||
''; | ||
|
||
ginSrc = fetchurl { | ||
url = "https://s3.amazonaws.com/rstudio-buildtools/gin-${ginVer}.zip"; | ||
sha256 = "16jzmljravpz6p2rxa87k5f7ir8vs7ya75lnfybfajzmci0p13mr"; | ||
}; | ||
|
||
gwtSrc = fetchurl { | ||
url = "https://s3.amazonaws.com/rstudio-buildtools/gwt-${gwtVer}.zip"; | ||
sha256 = "19x000m3jwnkqgi6ic81lkzyjvvxcfacw2j0vcfcaknvvagzhyhb"; | ||
}; | ||
|
||
hunspellDictionaries = filter isDerivation (unique (attrValues hunspellDicts)); | ||
# These dicts contain identically-named dict files, so we only keep the | ||
# -large versions in case of clashes | ||
largeDicts = filter (d: hasInfix "-large-wordlist" d) hunspellDictionaries; | ||
otherDicts = filter (d: !(hasAttr "dictFileName" d && | ||
elem d.dictFileName (map (d: d.dictFileName) largeDicts))) hunspellDictionaries; | ||
dictionaries = largeDicts ++ otherDicts; | ||
|
||
mathJaxSrc = fetchurl { | ||
url = "https://s3.amazonaws.com/rstudio-buildtools/mathjax-26.zip"; | ||
sha256 = "0wbcqb9rbfqqvvhqr1pbqax75wp8ydqdyhp91fbqfqp26xzjv6lk"; | ||
url = "https://s3.amazonaws.com/rstudio-buildtools/mathjax-27.zip"; | ||
sha256 = "sha256-xWy6psTOA8H8uusrXqPDEtL7diajYCVHcMvLiPsgQXY="; | ||
}; | ||
|
||
rsconnectSrc = fetchFromGitHub { | ||
owner = "rstudio"; | ||
repo = "rsconnect"; | ||
rev = "984745d8"; | ||
sha256 = "037z0y32k1gdda192y5qn5hi7wp8wyap44mkjlklrgcqkmlcylb9"; | ||
rev = "f5854bb71464f6e3017da9855f058fe3d5b32efd"; | ||
sha256 = "sha256-ULyWdSgGPSAwMt0t4QPuzeUE6Bo6IJh+5BMgW1bFN+Y="; | ||
}; | ||
|
||
preConfigure = | ||
'' | ||
export RSTUDIO_VERSION_MAJOR=${verMajor} | ||
export RSTUDIO_VERSION_MINOR=${verMinor} | ||
export RSTUDIO_VERSION_PATCH=${verPatch} | ||
panmirrorModules = mkYarnModules { | ||
inherit pname version; | ||
packageJSON = ./package.json; | ||
yarnLock = ./yarn.lock; | ||
yarnNix = ./yarndeps.nix; | ||
}; | ||
|
||
GWT_LIB_DIR=src/gwt/lib | ||
in | ||
mkDerivation rec { | ||
inherit pname version src RSTUDIO_VERSION_MAJOR RSTUDIO_VERSION_MINOR RSTUDIO_VERSION_PATCH; | ||
|
||
nativeBuildInputs = [ | ||
cmake | ||
unzip | ||
ant | ||
jdk | ||
makeWrapper | ||
pandoc | ||
nodejs | ||
copyDesktopItems | ||
]; | ||
|
||
buildInputs = [ | ||
boost | ||
zlib | ||
openssl | ||
R | ||
qtbase | ||
qtxmlpatterns | ||
qtsensors | ||
qtwebengine | ||
qtwebchannel | ||
libuuid | ||
libyamlcpp | ||
soci | ||
postgresql | ||
]; | ||
|
||
cmakeFlags = [ | ||
"-DRSTUDIO_TARGET=Desktop" | ||
"-DCMAKE_BUILD_TYPE=Release" | ||
"-DQT_QMAKE_EXECUTABLE=${qmake}/bin/qmake" | ||
"-DRSTUDIO_USE_SYSTEM_SOCI=ON" | ||
"-DRSTUDIO_USE_SYSTEM_BOOST=ON" | ||
"-DRSTUDIO_USE_SYSTEM_YAML_CPP=ON" | ||
"-DPANDOC_VERSION=${pandoc.version}" | ||
"-DCMAKE_INSTALL_PREFIX=${placeholder "out"}/lib/rstudio" | ||
]; | ||
|
||
# Hack RStudio to only use the input R and provided libclang. | ||
patches = [ | ||
./r-location.patch | ||
./clang-location.patch | ||
# postFetch doesn't work with this | error: unexpected end-of-file | ||
# replacing /usr/bin/node is done in postPatch | ||
# https://src.fedoraproject.org/rpms/rstudio/tree/rawhide | ||
(fetchpatch { | ||
name = "system-node.patch"; | ||
url = "https://src.fedoraproject.org/rpms/rstudio/raw/5bda2e290c9e72305582f2011040938d3e356906/f/0004-use-system-node.patch"; | ||
sha256 = "sha256-P1Y07RB/ceFNa749nyBUWSE41eiiZgt43zVcmahvfZM="; | ||
}) | ||
]; | ||
|
||
postPatch = '' | ||
substituteInPlace src/cpp/core/r_util/REnvironmentPosix.cpp --replace '@R@' ${R} | ||
mkdir -p $GWT_LIB_DIR/gin/${ginVer} | ||
unzip ${ginSrc} -d $GWT_LIB_DIR/gin/${ginVer} | ||
substituteInPlace src/cpp/CMakeLists.txt \ | ||
--replace 'SOCI_LIBRARY_DIR "/usr/lib"' 'SOCI_LIBRARY_DIR "${soci}/lib"' | ||
unzip ${gwtSrc} | ||
mkdir -p $GWT_LIB_DIR/gwt | ||
mv gwt-${gwtVer} $GWT_LIB_DIR/gwt/${gwtVer} | ||
substituteInPlace src/gwt/build.xml \ | ||
--replace '/usr/bin/node' '${nodejs}/bin/node' | ||
mkdir dependencies/common/dictionaries | ||
for dict in ${builtins.concatStringsSep " " dictionaries}; do | ||
for i in "$dict/share/hunspell/"*; do | ||
ln -sv $i dependencies/common/dictionaries/ | ||
done | ||
done | ||
substituteInPlace src/cpp/core/libclang/LibClang.cpp \ | ||
--replace '@libclang@' ${llvmPackages.libclang.lib} \ | ||
--replace '@libclang.so@' ${llvmPackages.libclang.lib}/lib/libclang.so | ||
substituteInPlace src/cpp/session/include/session/SessionConstants.hpp \ | ||
--replace "bin/pandoc" "${pandoc}/bin/pandoc" | ||
''; | ||
|
||
unzip ${mathJaxSrc} -d dependencies/common/mathjax-26 | ||
hunspellDictionaries = with lib; filter isDerivation (unique (attrValues hunspellDicts)); | ||
# These dicts contain identically-named dict files, so we only keep the | ||
# -large versions in case of clashes | ||
largeDicts = with lib; filter (d: hasInfix "-large-wordlist" d) hunspellDictionaries; | ||
otherDicts = with lib; filter | ||
(d: !(hasAttr "dictFileName" d && | ||
elem d.dictFileName (map (d: d.dictFileName) largeDicts))) | ||
hunspellDictionaries; | ||
dictionaries = largeDicts ++ otherDicts; | ||
|
||
mkdir -p dependencies/common/pandoc | ||
cp ${pandoc}/bin/pandoc dependencies/common/pandoc/ | ||
preConfigure = '' | ||
mkdir dependencies/dictionaries | ||
for dict in ${builtins.concatStringsSep " " dictionaries}; do | ||
for i in "$dict/share/hunspell/"*; do | ||
ln -s $i dependencies/dictionaries/ | ||
done | ||
done | ||
cp -r ${rsconnectSrc} dependencies/common/rsconnect | ||
pushd dependencies/common | ||
${R}/bin/R CMD build -d --no-build-vignettes rsconnect | ||
popd | ||
''; | ||
unzip -q ${mathJaxSrc} -d dependencies/mathjax-27 | ||
cmakeFlags = [ "-DRSTUDIO_TARGET=Desktop" "-DQT_QMAKE_EXECUTABLE=$NIX_QT5_TMP/bin/qmake" ]; | ||
mkdir -p dependencies/pandoc/${pandoc.version} | ||
cp ${pandoc}/bin/pandoc dependencies/pandoc/${pandoc.version}/pandoc | ||
desktopItem = makeDesktopItem { | ||
name = "${pname}-${version}"; | ||
exec = "rstudio %F"; | ||
icon = "rstudio"; | ||
desktopName = "RStudio"; | ||
genericName = "IDE"; | ||
comment = meta.description; | ||
categories = "Development;"; | ||
mimeType = "text/x-r-source;text/x-r;text/x-R;text/x-r-doc;text/x-r-sweave;text/x-r-markdown;text/x-r-html;text/x-r-presentation;application/x-r-data;application/x-r-project;text/x-r-history;text/x-r-profile;text/x-tex;text/x-markdown;text/html;text/css;text/javascript;text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;"; | ||
}; | ||
cp -r ${rsconnectSrc} dependencies/rsconnect | ||
( cd dependencies && ${R}/bin/R CMD build -d --no-build-vignettes rsconnect ) | ||
qtWrapperArgs = [ "--suffix PATH : ${gnumake}/bin" ]; | ||
cp -r "${panmirrorModules}" src/gwt/panmirror/src/editor/node_modules | ||
''; | ||
|
||
postInstall = '' | ||
mkdir $out/share | ||
cp -r ${desktopItem}/share/applications $out/share | ||
mkdir $out/share/icons | ||
ln $out/rstudio.png $out/share/icons | ||
mkdir -p $out/share/icons $out/bin | ||
ln $out/lib/rstudio/rstudio.png $out/share/icons | ||
for f in {diagnostics,rpostback,rstudio}; do | ||
ln -s $out/lib/rstudio/bin/$f $out/bin | ||
done | ||
for f in .gitignore .Rbuildignore LICENSE README; do | ||
find . -name $f -delete | ||
done | ||
rm -r $out/lib/rstudio/{INSTALL,COPYING,NOTICE,README.md,SOURCE,VERSION} | ||
rm -r $out/lib/rstudio/bin/{pandoc/pandoc,pandoc} | ||
''; | ||
|
||
meta = with lib; | ||
{ description = "Set of integrated tools for the R language"; | ||
homepage = "https://www.rstudio.com/"; | ||
license = licenses.agpl3; | ||
maintainers = with maintainers; [ ciil ]; | ||
platforms = platforms.linux; | ||
}; | ||
qtWrapperArgs = [ | ||
"--suffix PATH : ${lib.makeBinPath [ gnumake ]}" | ||
]; | ||
|
||
desktopItems = [ | ||
(makeDesktopItem { | ||
name = "${pname}"; | ||
exec = "rstudio %F"; | ||
icon = "rstudio"; | ||
desktopName = "RStudio"; | ||
genericName = "IDE"; | ||
comment = meta.description; | ||
categories = "Development;"; | ||
mimeType = "text/x-r-source;text/x-r;text/x-R;text/x-r-doc;text/x-r-sweave;text/x-r-markdown;text/x-r-html;text/x-r-presentation;application/x-r-data;application/x-r-project;text/x-r-history;text/x-r-profile;text/x-tex;text/x-markdown;text/html;text/css;text/javascript;text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;"; | ||
}) | ||
]; | ||
|
||
meta = with lib; { | ||
description = "Set of integrated tools for the R language"; | ||
homepage = "https://www.rstudio.com/"; | ||
license = licenses.agpl3Only; | ||
maintainers = with maintainers; [ ciil ]; | ||
platforms = platforms.linux; | ||
}; | ||
} |
Oops, something went wrong.