diff --git a/pkgs/by-name/cl/cling/fix-new-parser.patch b/pkgs/by-name/cl/cling/fix-new-parser.patch new file mode 100644 index 000000000000..9869686e6dda --- /dev/null +++ b/pkgs/by-name/cl/cling/fix-new-parser.patch @@ -0,0 +1,54 @@ +From cd4d1d8c4963620a6a84834948845df81fbbd70b Mon Sep 17 00:00:00 2001 +From: Jonas Hahnfeld +Date: Tue, 17 Dec 2024 14:54:18 +0100 +Subject: [PATCH] Use single Parser for LookupHelper + +It is the only construction of a temporary parser, and it seems not +necessary (anymore). +--- + include/cling/Interpreter/LookupHelper.h | 2 +- + lib/Interpreter/Interpreter.cpp | 11 ++++------- + 2 files changed, 5 insertions(+), 8 deletions(-) + +diff --git a/include/cling/Interpreter/LookupHelper.h b/include/cling/Interpreter/LookupHelper.h +index 6e6e281470..cd79b2a65c 100644 +--- a/include/cling/Interpreter/LookupHelper.h ++++ b/include/cling/Interpreter/LookupHelper.h +@@ -56,7 +56,7 @@ namespace cling { + WithDiagnostics + }; + private: +- std::unique_ptr m_Parser; ++ clang::Parser* m_Parser; + Interpreter* m_Interpreter; // we do not own. + std::array m_StringTy = {{}}; + /// A map containing the hash of the lookup buffer. This allows us to avoid +diff --git a/lib/Interpreter/Interpreter.cpp b/lib/Interpreter/Interpreter.cpp +index 13c8409cc5..f04695439b 100644 +--- a/lib/Interpreter/Interpreter.cpp ++++ b/lib/Interpreter/Interpreter.cpp +@@ -265,13 +265,6 @@ namespace cling { + } + + Sema& SemaRef = getSema(); +- Preprocessor& PP = SemaRef.getPreprocessor(); +- +- m_LookupHelper.reset(new LookupHelper(new Parser(PP, SemaRef, +- /*SkipFunctionBodies*/false, +- /*isTemp*/true), this)); +- if (!m_LookupHelper) +- return; + + if (!isInSyntaxOnlyMode() && !m_Opts.CompilerOpts.CUDADevice) { + m_Executor.reset(new IncrementalExecutor(SemaRef.Diags, *getCI(), +@@ -317,6 +310,10 @@ namespace cling { + return; + } + ++ m_LookupHelper.reset(new LookupHelper(m_IncrParser->getParser(), this)); ++ if (!m_LookupHelper) ++ return; ++ + // When not using C++ modules, we now have a PCH and we can safely setup + // our callbacks without fearing that they get overwritten by clang code. + // The modules setup is handled above. diff --git a/pkgs/by-name/cl/cling/no-clang-cpp.patch b/pkgs/by-name/cl/cling/no-clang-cpp.patch deleted file mode 100644 index 6048037cee84..000000000000 --- a/pkgs/by-name/cl/cling/no-clang-cpp.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/tools/driver/CMakeLists.txt b/tools/driver/CMakeLists.txt -index 590d708d83..340ae529d4 100644 ---- a/tools/driver/CMakeLists.txt -+++ b/tools/driver/CMakeLists.txt -@@ -63,7 +63,7 @@ endif() - add_dependencies(clang clang-resource-headers) - - if(NOT CLANG_LINKS_TO_CREATE) -- set(CLANG_LINKS_TO_CREATE clang++ clang-cl clang-cpp) -+ set(CLANG_LINKS_TO_CREATE clang++ clang-cl) - endif() - - foreach(link ${CLANG_LINKS_TO_CREATE}) diff --git a/pkgs/by-name/cl/cling/package.nix b/pkgs/by-name/cl/cling/package.nix index 60cbaabe1fb9..0bea1d522f6b 100644 --- a/pkgs/by-name/cl/cling/package.nix +++ b/pkgs/by-name/cl/cling/package.nix @@ -5,13 +5,13 @@ git, lib, libffi, - llvmPackages_13, + llvmPackages_18, makeWrapper, ncurses, python3, zlib, - # *NOT* from LLVM 13! + # *NOT* from LLVM 18! # The compiler used to compile Cling may affect the runtime include and lib # directories it expects to be run with. Cling builds against (a fork of) Clang, # so we prefer to use Clang as the compiler as well for consistency. @@ -34,42 +34,39 @@ let stdenv = clangStdenv; - # The patched clang lives in the LLVM megarepo - clangSrc = fetchFromGitHub { + version = "1.2"; + + clingSrc = fetchFromGitHub { owner = "root-project"; - repo = "llvm-project"; - # cling-llvm13 branch - rev = "3610201fbe0352a63efb5cb45f4ea4987702c735"; - sha256 = "sha256-Cb7BvV7yobG+mkaYe7zD2KcnPvm8/vmVATNWssklXyk="; - sparseCheckout = [ "clang" ]; + repo = "cling"; + rev = "v${version}"; + sha256 = "sha256-ay9FXANJmB/+AdnCR4WOKHuPm6P88wLqoOgiKJwJ8JM="; }; - llvm = llvmPackages_13.llvm.override { enableSharedLibraries = false; }; - - unwrapped = stdenv.mkDerivation rec { + unwrapped = stdenv.mkDerivation { pname = "cling-unwrapped"; - version = "1.0"; + inherit version; - src = "${clangSrc}/clang"; - - clingSrc = fetchFromGitHub { + src = fetchFromGitHub { owner = "root-project"; - repo = "cling"; - rev = "v${version}"; - sha256 = "sha256-Ye8EINzt+dyNvUIRydACXzb/xEPLm0YSkz08Xxw3xp4="; + repo = "llvm-project"; + rev = "cling-llvm18-20250721-01"; + sha256 = "sha256-JGteapyujU5w81DsfPQfTq76cYHgk5PbAFbdYfYIDo4="; }; - prePatch = '' - echo "add_llvm_external_project(cling)" >> tools/CMakeLists.txt + preConfigure = '' + cp -r ${clingSrc} cling-source - cp -r $clingSrc tools/cling - chmod -R a+w tools/cling + # Patch a bug in version 1.2 by backporting a fix. See + # https://github.com/root-project/cling/issues/556 + chmod -R u+w cling-source + pushd cling-source + patch -p1 < ${./fix-new-parser.patch} + popd + + cd llvm ''; - patches = [ - ./no-clang-cpp.patch - ]; - nativeBuildInputs = [ python3 git @@ -84,22 +81,15 @@ let strictDeps = true; cmakeFlags = [ - "-DLLVM_BINARY_DIR=${llvm.out}" - "-DLLVM_CONFIG=${llvm.dev}/bin/llvm-config" - "-DLLVM_LIBRARY_DIR=${llvm.lib}/lib" - "-DLLVM_MAIN_INCLUDE_DIR=${llvm.dev}/include" - "-DLLVM_TABLEGEN_EXE=${llvm.out}/bin/llvm-tblgen" - "-DLLVM_TOOLS_BINARY_DIR=${llvm.out}/bin" - "-DLLVM_BUILD_TOOLS=Off" - "-DLLVM_TOOL_CLING_BUILD=ON" - + "-DLLVM_EXTERNAL_PROJECTS=cling" + "-DLLVM_EXTERNAL_CLING_SOURCE_DIR=../../cling-source" + "-DLLVM_ENABLE_PROJECTS=clang" "-DLLVM_TARGETS_TO_BUILD=host;NVPTX" + "-DLLVM_INCLUDE_TESTS=OFF" "-DLLVM_ENABLE_RTTI=ON" - - # Setting -DCLING_INCLUDE_TESTS=ON causes the cling/tools targets to be built; - # see cling/tools/CMakeLists.txt - "-DCLING_INCLUDE_TESTS=ON" - "-DCLANG-TOOLS=OFF" + ] + ++ lib.optionals (!debug) [ + "-DCMAKE_BUILD_TYPE=Release" ] ++ lib.optionals debug [ "-DCMAKE_BUILD_TYPE=Debug" @@ -111,11 +101,13 @@ let CPPFLAGS = if useLLVMLibcxx then [ "-stdlib=libc++" ] else [ ]; - postInstall = lib.optionalString (!stdenv.hostPlatform.isDarwin) '' + postInstall = '' mkdir -p $out/share/Jupyter - cp -r /build/clang/tools/cling/tools/Jupyter/kernel $out/share/Jupyter + cp -r ../../cling-source/tools/Jupyter/kernel $out/share/Jupyter ''; + buildTargets = [ "cling" ]; + dontStrip = debug; meta = with lib; { @@ -147,18 +139,18 @@ let "-nostdinc++" "-resource-dir" - "${llvm.lib}/lib" + "${llvmPackages_18.llvm.lib}/lib" "-isystem" - "${lib.getLib unwrapped}/lib/clang/${llvmPackages_13.clang.version}/include" + "${lib.getLib unwrapped}/lib/clang/18/include" ] ++ lib.optionals useLLVMLibcxx [ "-I" - "${lib.getDev llvmPackages_13.libcxx}/include/c++/v1" + "${lib.getDev llvmPackages_18.libcxx}/include/c++/v1" "-L" - "${llvmPackages_13.libcxx}/lib" + "${llvmPackages_18.libcxx}/lib" "-l" - "${llvmPackages_13.libcxx}/lib/libc++${stdenv.hostPlatform.extensions.sharedLibrary}" + "${llvmPackages_18.libcxx}/lib/libc++${stdenv.hostPlatform.extensions.sharedLibrary}" ] ++ lib.optionals (!useLLVMLibcxx) [ "-I"