circt: Add shared libs and split llvm

This changes adds circt's shared libs and splits the build of llvm.
This commit is contained in:
Shogo Takata
2023-12-11 13:22:43 +09:00
parent 6f3d9c7288
commit fcab3fbd71
2 changed files with 79 additions and 18 deletions
@@ -0,0 +1,59 @@
{ stdenv
, cmake
, ninja
, circt
, llvm
, python3
}: stdenv.mkDerivation {
pname = circt.pname + "-llvm";
inherit (circt) version src;
requiredSystemFeatures = [ "big-parallel" ];
nativeBuildInputs = [ cmake ninja python3 ];
preConfigure = ''
cd llvm/llvm
'';
cmakeFlags = [
"-DBUILD_SHARED_LIBS=ON"
"-DLLVM_ENABLE_BINDINGS=OFF"
"-DLLVM_ENABLE_OCAMLDOC=OFF"
"-DLLVM_BUILD_EXAMPLES=OFF"
"-DLLVM_OPTIMIZED_TABLEGEN=ON"
"-DLLVM_ENABLE_PROJECTS=mlir"
"-DLLVM_TARGETS_TO_BUILD="
# This option is needed to install llvm-config
"-DLLVM_INSTALL_UTILS=ON"
];
outputs = [ "out" "lib" "dev" ];
postInstall = ''
# move llvm-config to $dev to resolve a circular dependency
moveToOutput "bin/llvm-config*" "$dev"
# move all lib files to $lib except lib/cmake
moveToOutput "lib" "$lib"
moveToOutput "lib/cmake" "$dev"
# patch configuration files so each path points to the new $lib or $dev paths
substituteInPlace "$dev/lib/cmake/llvm/LLVMConfig.cmake" \
--replace 'set(LLVM_BINARY_DIR "''${LLVM_INSTALL_PREFIX}")' 'set(LLVM_BINARY_DIR "'"$lib"'")'
substituteInPlace \
"$dev/lib/cmake/llvm/LLVMExports-release.cmake" \
"$dev/lib/cmake/mlir/MLIRTargets-release.cmake" \
--replace "\''${_IMPORT_PREFIX}/lib/lib" "$lib/lib/lib" \
--replace "\''${_IMPORT_PREFIX}/lib/objects-Release" "$lib/lib/objects-Release" \
--replace "$out/bin/llvm-config" "$dev/bin/llvm-config" # patch path for llvm-config
'';
doCheck = true;
checkTarget = "check-mlir";
meta = llvm.meta // {
inherit (circt.meta) maintainers;
};
}
+20 -18
View File
@@ -6,11 +6,14 @@
, git
, fetchFromGitHub
, ninja
, lit
, gitUpdater
, callPackage
}:
let
pythonEnv = python3.withPackages (ps: [ ps.psutil ]);
circt-llvm = callPackage ./circt-llvm.nix { };
in
stdenv.mkDerivation rec {
pname = "circt";
@@ -26,16 +29,14 @@ stdenv.mkDerivation rec {
requiredSystemFeatures = [ "big-parallel" ];
nativeBuildInputs = [ cmake ninja git pythonEnv ];
buildInputs = [ circt-llvm ];
cmakeDir = "../llvm/llvm";
cmakeFlags = [
"-DLLVM_ENABLE_BINDINGS=OFF"
"-DLLVM_ENABLE_OCAMLDOC=OFF"
"-DLLVM_BUILD_EXAMPLES=OFF"
"-DLLVM_OPTIMIZED_TABLEGEN=ON"
"-DLLVM_ENABLE_PROJECTS=mlir"
"-DLLVM_EXTERNAL_PROJECTS=circt"
"-DLLVM_EXTERNAL_CIRCT_SOURCE_DIR=.."
"-DBUILD_SHARED_LIBS=ON"
"-DMLIR_DIR=${circt-llvm.dev}/lib/cmake/mlir"
# LLVM_EXTERNAL_LIT is executed by python3, the wrapped bash script will not work
"-DLLVM_EXTERNAL_LIT=${lit}/bin/.lit-wrapped"
"-DCIRCT_LLHD_SIM_ENABLED=OFF"
];
@@ -60,18 +61,20 @@ stdenv.mkDerivation rec {
substituteInPlace cmake/modules/GenVersionFile.cmake --replace "unknown git version" "${src.rev}"
'';
installPhase = ''
runHook preInstall
mkdir -p $out/bin
mv bin/{{fir,hls}tool,circt-{as,dis,lsp-server,opt,reduce,translate}} $out/bin
runHook postInstall
'';
doCheck = true;
checkTarget = "check-circt check-circt-integration";
passthru.updateScript = gitUpdater {
rev-prefix = "firtool-";
outputs = [ "out" "lib" "dev" ];
postInstall = ''
moveToOutput lib "$lib"
'';
passthru = {
updateScript = gitUpdater {
rev-prefix = "firtool-";
};
llvm = circt-llvm;
};
meta = {
@@ -82,4 +85,3 @@ stdenv.mkDerivation rec {
platforms = lib.platforms.all;
};
}