diff --git a/pkgs/development/compilers/llvm/rocm/clang.nix b/pkgs/development/compilers/llvm/rocm/clang.nix new file mode 100644 index 000000000000..86853a97c931 --- /dev/null +++ b/pkgs/development/compilers/llvm/rocm/clang.nix @@ -0,0 +1,67 @@ +{ stdenv +, fetchFromGitHub +, cmake +, python +, llvm +, clang-tools-extra_src ? null +, rocm-runtime +, lld + +, version +, src +}: + +stdenv.mkDerivation rec { + inherit version src; + + pname = "clang"; + + nativeBuildInputs = [ cmake python ]; + + buildInputs = [ llvm rocm-runtime ]; + + hardeningDisable = [ "all" ]; + + cmakeFlags = [ + "-DLLVM_CMAKE_PATH=${llvm}/lib/cmake/llvm" + "-DLLVM_MAIN_SRC_DIR=${llvm.src}" + "-DCLANG_SOURCE_DIR=${src}" + "-DLLVM_ENABLE_RTTI=ON" + ]; + + VCSVersion = '' + #undef LLVM_REVISION + #undef LLVM_REPOSITORY + #undef CLANG_REVISION + #undef CLANG_REPOSITORY + ''; + + postUnpack = stdenv.lib.optionalString (!(isNull clang-tools-extra_src)) '' + ln -s ${clang-tools-extra_src} $sourceRoot/tools/extra + ''; + + # Rather than let cmake extract version information from LLVM or + # clang source control repositories, we generate the wanted + # `VCSVersion.inc` file ourselves and remove it from the + # depencencies of the `clangBasic` target. + preConfigure = '' + sed 's/ ''${version_inc}//' -i lib/Basic/CMakeLists.txt + sed 's|sys::path::parent_path(BundlerExecutable)|StringRef("${llvm}/bin")|' -i tools/clang-offload-bundler/ClangOffloadBundler.cpp + sed 's|\([[:space:]]*std::string Linker = \)getToolChain().GetProgramPath(getShortName())|\1"${lld}/bin/ld.lld"|' -i lib/Driver/ToolChains/AMDGPU.cpp + substituteInPlace lib/Driver/ToolChains/AMDGPU.h --replace ld.lld ${lld}/bin/ld.lld + sed 's|configure_file(AST/gen_ast_dump_json_test.py ''${LLVM_TOOLS_BINARY_DIR}/gen_ast_dump_json_test.py COPYONLY)||' -i test/CMakeLists.txt + ''; + + postConfigure = '' + mkdir -p lib/Basic + echo "$VCSVersion" > lib/Basic/VCSVersion.inc + ''; + + meta = with stdenv.lib; { + description = "ROCm fork of the clang C/C++/Objective-C/Objective-C++ LLVM compiler frontend"; + homepage = "https://llvm.org/"; + license = with licenses; [ ncsa ]; + maintainers = with maintainers; [ danieldk ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/development/compilers/llvm/rocm/default.nix b/pkgs/development/compilers/llvm/rocm/default.nix new file mode 100644 index 000000000000..e90818d8505d --- /dev/null +++ b/pkgs/development/compilers/llvm/rocm/default.nix @@ -0,0 +1,41 @@ +{ stdenv, fetchFromGitHub, callPackage, wrapCCWith }: + +let + version = "3.5.1"; + src = fetchFromGitHub { + owner = "RadeonOpenCompute"; + repo = "llvm-project"; + rev = "rocm-${version}"; + sha256 = "03k2xp8wf4awf1zcjc2hb3kf9bqp567c3s569gp1q3q1zjg6r2ib"; + }; +in rec { + clang = wrapCCWith rec { + cc = clang-unwrapped; + extraBuildCommands = '' + clang_version=`${cc}/bin/clang -v 2>&1 | grep "clang version " | grep -E -o "[0-9.-]+"` + rsrc="$out/resource-root" + mkdir "$rsrc" + ln -s "${cc}/lib/clang/$clang_version/include" "$rsrc" + echo "-resource-dir=$rsrc" >> $out/nix-support/cc-cflags + echo "--gcc-toolchain=${stdenv.cc.cc}" >> $out/nix-support/cc-cflags + echo "-Wno-unused-command-line-argument" >> $out/nix-support/cc-cflags + rm $out/nix-support/add-hardening.sh + touch $out/nix-support/add-hardening.sh + ''; + }; + + clang-unwrapped = callPackage ./clang.nix { + inherit lld llvm version; + src = "${src}/clang"; + }; + + lld = callPackage ./lld.nix { + inherit llvm version; + src = "${src}/lld"; + }; + + llvm = callPackage ./llvm.nix { + inherit version; + src = "${src}/llvm"; + }; +} diff --git a/pkgs/development/compilers/llvm/rocm/lld.nix b/pkgs/development/compilers/llvm/rocm/lld.nix new file mode 100644 index 000000000000..052bfd1c62d8 --- /dev/null +++ b/pkgs/development/compilers/llvm/rocm/lld.nix @@ -0,0 +1,33 @@ +{ stdenv +, cmake +, libxml2 +, llvm + +, version +, src +}: + +stdenv.mkDerivation rec { + inherit version src; + + pname = "lld"; + + nativeBuildInputs = [ cmake ]; + + buildInputs = [ libxml2 llvm ]; + + outputs = [ "out" "dev" ]; + + postInstall = '' + moveToOutput include "$dev" + moveToOutput lib "$dev" + ''; + + meta = with stdenv.lib; { + description = "ROCm fork of the LLVM Linker"; + homepage = "https://github.com/RadeonOpenCompute/llvm-project"; + license = licenses.ncsa; + maintainers = with maintainers; [ danieldk ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/development/compilers/llvm/rocm/llvm-outputs.patch b/pkgs/development/compilers/llvm/rocm/llvm-outputs.patch new file mode 100644 index 000000000000..40096fa3497f --- /dev/null +++ b/pkgs/development/compilers/llvm/rocm/llvm-outputs.patch @@ -0,0 +1,26 @@ +diff --git a/tools/llvm-config/llvm-config.cpp b/tools/llvm-config/llvm-config.cpp +index 94d426b..37f7794 100644 +--- a/tools/llvm-config/llvm-config.cpp ++++ b/tools/llvm-config/llvm-config.cpp +@@ -333,6 +333,21 @@ int main(int argc, char **argv) { + ActiveIncludeOption = "-I" + ActiveIncludeDir; + } + ++ /// Nix-specific multiple-output handling: override ActiveLibDir if --link-shared ++ if (!IsInDevelopmentTree) { ++ bool WantShared = true; ++ for (int i = 1; i < argc; ++i) { ++ StringRef Arg = argv[i]; ++ if (Arg == "--link-shared") ++ WantShared = true; ++ else if (Arg == "--link-static") ++ WantShared = false; // the last one wins ++ } ++ ++ if (WantShared) ++ ActiveLibDir = std::string("@lib@") + "/lib" + LLVM_LIBDIR_SUFFIX; ++ } ++ + /// We only use `shared library` mode in cases where the static library form + /// of the components provided are not available; note however that this is + /// skipped if we're run from within the build dir. However, once installed, diff --git a/pkgs/development/compilers/llvm/rocm/llvm.nix b/pkgs/development/compilers/llvm/rocm/llvm.nix new file mode 100644 index 000000000000..909284a3e919 --- /dev/null +++ b/pkgs/development/compilers/llvm/rocm/llvm.nix @@ -0,0 +1,97 @@ +{ stdenv +, fetchFromGitHub +, cmake +, python3 +, libxml2 +, libffi +, libbfd +, ncurses +, zlib +, debugVersion ? false +, enableManpages ? false +, enableSharedLibraries ? true + +, version +, src +}: + +let + llvmNativeTarget = + if stdenv.isx86_64 then "X86" + else if stdenv.isAarch64 then "AArch64" + else throw "Unsupported ROCm LLVM platform"; +in stdenv.mkDerivation rec { + inherit src version; + + pname = "rocm-llvm"; + + outputs = [ "out" "python" ] + ++ stdenv.lib.optional enableSharedLibraries "lib"; + + nativeBuildInputs = [ cmake python3 ]; + + buildInputs = [ libxml2 libffi ]; + + propagatedBuildInputs = [ ncurses zlib ]; + + cmakeFlags = with stdenv; [ + "-DCMAKE_BUILD_TYPE=${if debugVersion then "Debug" else "Release"}" + "-DLLVM_INSTALL_UTILS=ON" # Needed by rustc + "-DLLVM_BUILD_TESTS=OFF" + "-DLLVM_ENABLE_FFI=ON" + "-DLLVM_ENABLE_RTTI=ON" + "-DLLVM_ENABLE_DUMP=ON" + "-DLLVM_TARGETS_TO_BUILD=AMDGPU;${llvmNativeTarget}" + ] + ++ + stdenv.lib.optional + enableSharedLibraries + "-DLLVM_LINK_LLVM_DYLIB=ON" + ++ stdenv.lib.optionals enableManpages [ + "-DLLVM_BINUTILS_INCDIR=${libbfd.dev}/include" + "-DLLVM_BUILD_DOCS=ON" + "-DLLVM_ENABLE_SPHINX=ON" + "-DSPHINX_OUTPUT_MAN=ON" + "-DSPHINX_OUTPUT_HTML=OFF" + "-DSPHINX_WARNINGS_AS_ERRORS=OFF" + ]; + + postPatch = '' + substitute '${./llvm-outputs.patch}' ./llvm-outputs.patch --subst-var lib + patch -p1 < ./llvm-outputs.patch + ''; + + # hacky fix: created binaries need to be run before installation + preBuild = '' + mkdir -p $out/ + ln -sv $PWD/lib $out + ''; + + postBuild = '' + rm -fR $out + ''; + + preCheck = '' + export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PWD/lib + ''; + + postInstall = '' + moveToOutput share/opt-viewer "$python" + '' + + stdenv.lib.optionalString enableSharedLibraries '' + moveToOutput "lib/libLLVM-*" "$lib" + moveToOutput "lib/libLLVM${stdenv.hostPlatform.extensions.sharedLibrary}" "$lib" + substituteInPlace "$out/lib/cmake/llvm/LLVMExports-${if debugVersion then "debug" else "release"}.cmake" \ + --replace "\''${_IMPORT_PREFIX}/lib/libLLVM-" "$lib/lib/libLLVM-" + ''; + + passthru.src = src; + + meta = with stdenv.lib; { + description = "ROCm fork of the LLVM compiler infrastructure"; + homepage = "https://github.com/RadeonOpenCompute/llvm-project"; + license = with licenses; [ ncsa ]; + maintainers = with maintainers; [ danieldk ]; + platforms = platforms.linux; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index b1423f202b9c..2dfb6332c72c 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -9101,6 +9101,8 @@ in llvmPackages_latest = llvmPackages_10; + llvmPackages_rocm = callPackage ../development/compilers/llvm/rocm { }; + lorri = callPackage ../tools/misc/lorri { inherit (darwin.apple_sdk.frameworks) CoreServices Security; };