From 6e3cde63834ef21346e80862256c6a08909f514a Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Wed, 19 Oct 2011 20:57:18 +0000 Subject: [PATCH] Enable building clang separately from llvm Note that there is some duplication when building clang now. The llvm source is unpacked twice, ./configure is run twice, and two small unit test libraries are compiled twice. IMO this is a fair tradeoff for having llvm be a separate build unaffected by changes to clang svn path=/nixpkgs/trunk/; revision=29919 --- .../llvm/clang-system-llvm-libs.patch | 42 ++++++ .../compilers/llvm/clang-tblgen.patch | 134 ++++++++++++++++++ pkgs/development/compilers/llvm/clang.nix | 62 ++++++++ pkgs/development/compilers/llvm/default.nix | 48 +------ pkgs/top-level/all-packages.nix | 11 +- 5 files changed, 249 insertions(+), 48 deletions(-) create mode 100644 pkgs/development/compilers/llvm/clang-system-llvm-libs.patch create mode 100644 pkgs/development/compilers/llvm/clang-tblgen.patch create mode 100644 pkgs/development/compilers/llvm/clang.nix diff --git a/pkgs/development/compilers/llvm/clang-system-llvm-libs.patch b/pkgs/development/compilers/llvm/clang-system-llvm-libs.patch new file mode 100644 index 00000000000..0d82cf4017a --- /dev/null +++ b/pkgs/development/compilers/llvm/clang-system-llvm-libs.patch @@ -0,0 +1,42 @@ +diff -Naur llvm-2.9-orig/Makefile.rules llvm-2.9/Makefile.rules +--- llvm-2.9-orig/Makefile.rules 2011-03-25 02:26:58.000000000 -0400 ++++ llvm-2.9/Makefile.rules 2011-10-19 15:31:38.538674143 -0400 +@@ -941,7 +941,7 @@ + @echo "*** llvm-config doesn't exist - rebuilding it." + @$(MAKE) -C $(PROJ_OBJ_ROOT)/tools/llvm-config + +-$(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT): $(LLVM_CONFIG) ++$(ToolDir)/$(strip $(TOOLNAME))$(EXEEXT): + + ifeq ($(ENABLE_SHARED), 1) + # We can take the "auto-import" feature to get rid of using dllimport. +@@ -1137,7 +1137,7 @@ + else + SharedLibKindMessage := "Shared Library" + endif +-$(LibName.SO): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) $(SharedLibDir)/.dir ++$(LibName.SO): $(ObjectsO) $(ProjLibsPaths) $(SharedLibDir)/.dir + $(Echo) Linking $(BuildMode) $(SharedLibKindMessage) \ + $(notdir $@) + $(Verb) $(Link) $(SharedLinkOptions) -o $@ $(ObjectsO) \ +@@ -1411,7 +1411,7 @@ + $(ToolBuildPath): $(ToolDir)/.dir + endif + +-$(ToolBuildPath): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) ++$(ToolBuildPath): $(ObjectsO) $(ProjLibsPaths) + $(Echo) Linking $(BuildMode) executable $(TOOLNAME) $(StripWarnMsg) + $(Verb) $(Link) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \ + $(LLVMLibsOptions) $(ExtraLibs) $(TOOLLINKOPTSB) $(LIBS) +diff -Naur llvm-2.9-orig/unittests/Makefile.unittest llvm-2.9/unittests/Makefile.unittest +--- llvm-2.9-orig/unittests/Makefile.unittest 2011-02-04 12:12:18.000000000 -0500 ++++ llvm-2.9/unittests/Makefile.unittest 2011-10-19 15:47:27.100035616 -0400 +@@ -47,7 +47,7 @@ + Run.Shared := $(SHLIBPATH_VAR)="$(SharedLibDir)$${$(SHLIBPATH_VAR):+:}$$$(SHLIBPATH_VAR)" + endif + +-$(LLVMUnitTestExe): $(ObjectsO) $(ProjLibsPaths) $(LLVMLibsPaths) ++$(LLVMUnitTestExe): $(ObjectsO) $(ProjLibsPaths) + $(Echo) Linking $(BuildMode) unit test $(TESTNAME) $(StripWarnMsg) + $(Verb) $(Link) -o $@ $(TOOLLINKOPTS) $(ObjectsO) $(ProjLibsOptions) \ + $(TESTLIBS) $(LLVMLibsOptions) $(ExtraLibs) $(TOOLLINKOPTSB) $(LIBS) diff --git a/pkgs/development/compilers/llvm/clang-tblgen.patch b/pkgs/development/compilers/llvm/clang-tblgen.patch new file mode 100644 index 00000000000..9533529555d --- /dev/null +++ b/pkgs/development/compilers/llvm/clang-tblgen.patch @@ -0,0 +1,134 @@ +diff -Naur a/tools/clang/include/clang/AST/Makefile b/tools/clang/include/clang/AST/Makefile +--- a/tools/clang/include/clang/AST/Makefile 2010-08-18 19:23:40.000000000 -0400 ++++ b/tools/clang/include/clang/AST/Makefile 2011-10-19 14:19:21.420750346 -0400 +@@ -6,24 +6,24 @@ + + include $(CLANG_LEVEL)/Makefile + +-$(ObjDir)/Attrs.inc.tmp : $(TD_SRC_DIR)/Attr.td $(TBLGEN) \ ++$(ObjDir)/Attrs.inc.tmp : $(TD_SRC_DIR)/Attr.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang attribute classes with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-classes -o $(call SYSPATH, $@) \ + -I $(PROJ_SRC_DIR)/../../ $< + +-$(ObjDir)/AttrImpl.inc.tmp : $(TD_SRC_DIR)/Attr.td $(TBLGEN) \ ++$(ObjDir)/AttrImpl.inc.tmp : $(TD_SRC_DIR)/Attr.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang attribute implementations with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-impl -o $(call SYSPATH, $@) \ + -I $(PROJ_SRC_DIR)/../../ $< + +-$(ObjDir)/StmtNodes.inc.tmp : $(TD_SRC_DIR)/StmtNodes.td $(TBLGEN) \ ++$(ObjDir)/StmtNodes.inc.tmp : $(TD_SRC_DIR)/StmtNodes.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang statement node tables with tblgen" + $(Verb) $(TableGen) -gen-clang-stmt-nodes -o $(call SYSPATH, $@) $< + +-$(ObjDir)/DeclNodes.inc.tmp : $(TD_SRC_DIR)/DeclNodes.td $(TBLGEN) \ ++$(ObjDir)/DeclNodes.inc.tmp : $(TD_SRC_DIR)/DeclNodes.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang declaration node tables with tblgen" + $(Verb) $(TableGen) -gen-clang-decl-nodes -o $(call SYSPATH, $@) $< +diff -Naur a/tools/clang/include/clang/Basic/Makefile b/tools/clang/include/clang/Basic/Makefile +--- a/tools/clang/include/clang/Basic/Makefile 2010-09-09 16:27:36.000000000 -0400 ++++ b/tools/clang/include/clang/Basic/Makefile 2011-10-19 14:17:54.950837324 -0400 +@@ -29,20 +29,20 @@ + CLANG_HAS_VERSION_PATCHLEVEL := 1 + endif + +-$(ObjDir)/Diagnostic%Kinds.inc.tmp : Diagnostic.td Diagnostic%Kinds.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/Diagnostic%Kinds.inc.tmp : Diagnostic.td Diagnostic%Kinds.td $(ObjDir)/.dir + $(Echo) "Building Clang $(patsubst Diagnostic%Kinds.inc.tmp,%,$(@F)) diagnostic tables with tblgen" + $(Verb) $(TableGen) -gen-clang-diags-defs -clang-component=$(patsubst Diagnostic%Kinds.inc.tmp,%,$(@F)) -o $(call SYSPATH, $@) $< + +-$(ObjDir)/DiagnosticGroups.inc.tmp : Diagnostic.td DiagnosticGroups.td $(INPUT_TDS) $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/DiagnosticGroups.inc.tmp : Diagnostic.td DiagnosticGroups.td $(INPUT_TDS) $(ObjDir)/.dir + $(Echo) "Building Clang diagnostic groups with tblgen" + $(Verb) $(TableGen) -gen-clang-diag-groups -o $(call SYSPATH, $@) $< + +-$(ObjDir)/AttrList.inc.tmp : Attr.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/AttrList.inc.tmp : Attr.td $(ObjDir)/.dir + $(Echo) "Building Clang attribute list with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-list -o $(call SYSPATH, $@) \ + -I $(PROJ_SRC_DIR)/../.. $< + +-$(ObjDir)/arm_neon.inc.tmp : arm_neon.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/arm_neon.inc.tmp : arm_neon.td $(ObjDir)/.dir + $(Echo) "Building Clang arm_neon.inc with tblgen" + $(Verb) $(TableGen) -gen-arm-neon-sema -o $(call SYSPATH, $@) $< + +diff -Naur a/tools/clang/include/clang/Driver/Makefile b/tools/clang/include/clang/Driver/Makefile +--- a/tools/clang/include/clang/Driver/Makefile 2010-06-08 16:34:18.000000000 -0400 ++++ b/tools/clang/include/clang/Driver/Makefile 2011-10-19 14:25:33.739369159 -0400 +@@ -5,14 +5,14 @@ + + include $(CLANG_LEVEL)/Makefile + +-$(ObjDir)/Options.inc.tmp : Options.td OptParser.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/Options.inc.tmp : Options.td OptParser.td $(ObjDir)/.dir + $(Echo) "Building Clang Driver Option tables with tblgen" + $(Verb) $(TableGen) -gen-opt-parser-defs -o $(call SYSPATH, $@) $< + +-$(ObjDir)/CC1Options.inc.tmp : CC1Options.td OptParser.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/CC1Options.inc.tmp : CC1Options.td OptParser.td $(ObjDir)/.dir + $(Echo) "Building Clang CC1 Option tables with tblgen" + $(Verb) $(TableGen) -gen-opt-parser-defs -o $(call SYSPATH, $@) $< + +-$(ObjDir)/CC1AsOptions.inc.tmp : CC1AsOptions.td OptParser.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/CC1AsOptions.inc.tmp : CC1AsOptions.td OptParser.td $(ObjDir)/.dir + $(Echo) "Building Clang CC1 Assembler Option tables with tblgen" + $(Verb) $(TableGen) -gen-opt-parser-defs -o $(call SYSPATH, $@) $< +diff -Naur a/tools/clang/include/clang/Lex/Makefile b/tools/clang/include/clang/Lex/Makefile +--- a/tools/clang/include/clang/Lex/Makefile 2010-10-19 22:31:43.000000000 -0400 ++++ b/tools/clang/include/clang/Lex/Makefile 2011-10-19 14:18:25.082807086 -0400 +@@ -6,7 +6,7 @@ + + include $(CLANG_LEVEL)/Makefile + +-$(ObjDir)/AttrSpellings.inc.tmp : $(TD_SRC_DIR)/Attr.td $(TBLGEN) \ ++$(ObjDir)/AttrSpellings.inc.tmp : $(TD_SRC_DIR)/Attr.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang attribute spellings with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-spelling-list -o $(call SYSPATH, $@) \ +diff -Naur a/tools/clang/include/clang/Serialization/Makefile b/tools/clang/include/clang/Serialization/Makefile +--- a/tools/clang/include/clang/Serialization/Makefile 2010-08-18 19:23:40.000000000 -0400 ++++ b/tools/clang/include/clang/Serialization/Makefile 2011-10-19 14:25:05.764398164 -0400 +@@ -6,13 +6,13 @@ + + include $(CLANG_LEVEL)/Makefile + +-$(ObjDir)/AttrPCHRead.inc.tmp : $(TD_SRC_DIR)/Attr.td $(TBLGEN) \ ++$(ObjDir)/AttrPCHRead.inc.tmp : $(TD_SRC_DIR)/Attr.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang PCH reader with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-pch-read -o $(call SYSPATH, $@) \ + -I $(PROJ_SRC_DIR)/../../ $< + +-$(ObjDir)/AttrPCHWrite.inc.tmp : $(TD_SRC_DIR)/Attr.td $(TBLGEN) \ ++$(ObjDir)/AttrPCHWrite.inc.tmp : $(TD_SRC_DIR)/Attr.td \ + $(ObjDir)/.dir + $(Echo) "Building Clang PCH writer with tblgen" + $(Verb) $(TableGen) -gen-clang-attr-pch-write -o $(call SYSPATH, $@) \ +diff -Naur a/tools/clang/lib/Headers/Makefile b/tools/clang/lib/Headers/Makefile +--- a/tools/clang/lib/Headers/Makefile 2010-07-21 21:19:36.000000000 -0400 ++++ b/tools/clang/lib/Headers/Makefile 2011-10-19 14:15:18.520993127 -0400 +@@ -49,6 +49,6 @@ + + install-local:: $(INSTHEADERS) + +-$(ObjDir)/arm_neon.h.inc.tmp : $(CLANG_LEVEL)/include/clang/Basic/arm_neon.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/arm_neon.h.inc.tmp : $(CLANG_LEVEL)/include/clang/Basic/arm_neon.td $(ObjDir)/.dir + $(Echo) "Building Clang arm_neon.h.inc with tblgen" + $(Verb) $(TableGen) -gen-arm-neon -o $(call SYSPATH, $@) $< +diff -Naur a/tools/clang/lib/StaticAnalyzer/Checkers/Makefile b/tools/clang/lib/StaticAnalyzer/Checkers/Makefile +--- a/tools/clang/lib/StaticAnalyzer/Checkers/Makefile 2011-02-15 02:42:38.000000000 -0500 ++++ b/tools/clang/lib/StaticAnalyzer/Checkers/Makefile 2011-10-19 14:15:58.240953760 -0400 +@@ -19,6 +19,6 @@ + + include $(CLANG_LEVEL)/Makefile + +-$(ObjDir)/Checkers.inc.tmp : Checkers.td $(PROJ_SRC_DIR)/$(CLANG_LEVEL)/include/clang/StaticAnalyzer/Checkers/CheckerBase.td $(TBLGEN) $(ObjDir)/.dir ++$(ObjDir)/Checkers.inc.tmp : Checkers.td $(PROJ_SRC_DIR)/$(CLANG_LEVEL)/include/clang/StaticAnalyzer/Checkers/CheckerBase.td $(ObjDir)/.dir + $(Echo) "Building Clang SA Checkers tables with tblgen" + $(Verb) $(TableGen) -gen-clang-sa-checkers -I $(PROJ_SRC_DIR)/$(CLANG_LEVEL)/include -o $(call SYSPATH, $@) $< diff --git a/pkgs/development/compilers/llvm/clang.nix b/pkgs/development/compilers/llvm/clang.nix new file mode 100644 index 00000000000..fc37a5c00d2 --- /dev/null +++ b/pkgs/development/compilers/llvm/clang.nix @@ -0,0 +1,62 @@ +{ stdenv, fetchurl, perl, groff, llvm }: + +assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"; +let + triplet = if (stdenv.system == "i686-linux") then "i686-unknown-linux-gnu" + else if (stdenv.system == "x86_64-linux") then "x86_64-unknown-linux-gnu" + else throw "System not supported"; + + version = "2.9"; +in + +stdenv.mkDerivation { + name = "clang-${version}"; + + CC = if stdenv.gcc ? clang then "clang" else "gcc"; + + CXX = if stdenv.gcc ? clang then "clang++" else "g++"; + + src = llvm.src; + + buildInputs = [ perl llvm groff ]; + + configureFlags = [ "--enable-optimized" "--enable-shared" "--disable-static" ]; + srcClang = fetchurl { + url = "http://llvm.org/releases/${version}/clang-${version}.tgz"; + sha256 = "1pq9g7qxw761dp6gx3amx39kl9p4zhlymmn8gfmcnw9ag0zizi3h"; + }; + + prePatch = '' + pushd tools + unpackFile $srcClang + mv clang-${version} clang + popd + find + ''; + + patches = [ ./clang-include-paths.patch ./clang-ld-flags.patch ./clang-tblgen.patch ./clang-system-llvm-libs.patch ]; + + buildFlags = [ "TableGen=tblgen" "LLVM_CONFIG=llvm-config" ]; + # Set up the header file paths + preBuild = '' + sed -i -e 's,C_INCLUDE_PATH,"${stdenv.gcc.libc}/include/",' \ + -e 's,CPP_HOST,"${triplet}",' \ + -e 's,CPP_INCLUDE_PATH,"${stdenv.gcc.gcc}/include/c++/${stdenv.gcc.gcc.version}",' \ + tools/clang/lib/Frontend/InitHeaderSearch.cpp + + pushd utils/unittest + make + popd + cd tools/clang + ''; + + passthru = { gcc = stdenv.gcc.gcc; }; + + meta = { + homepage = http://clang.llvm.org/; + description = "A C language family frontend for LLVM"; + license = "BSD"; + maintainers = with stdenv.lib.maintainers; [viric shlevy]; + platforms = with stdenv.lib.platforms; linux; + }; +} diff --git a/pkgs/development/compilers/llvm/default.nix b/pkgs/development/compilers/llvm/default.nix index fc308f4e61c..62e71d4a1b2 100644 --- a/pkgs/development/compilers/llvm/default.nix +++ b/pkgs/development/compilers/llvm/default.nix @@ -1,8 +1,8 @@ -{ stdenv, fetchurl, perl, groff, buildClang ? false }: +{ stdenv, fetchurl, perl, groff }: let version = "2.9"; in -stdenv.mkDerivation ({ +stdenv.mkDerivation { name = "llvm-${version}"; CC = if stdenv.gcc ? clang then "clang" else "gcc"; @@ -26,48 +26,4 @@ stdenv.mkDerivation ({ platforms = with stdenv.lib.platforms; all; }; } -// stdenv.lib.optionalAttrs buildClang ( - # I write the assert because 'gcc.libc' will be evaluated although 'triplet' would not - # evaluate properly (in the preConfigure below) - assert stdenv.system == "i686-linux" || stdenv.system == "x86_64-linux"; - let - triplet = if (stdenv.system == "i686-linux") then "i686-unknown-linux-gnu" - else if (stdenv.system == "x86_64-linux") then "x86_64-unknown-linux-gnu" - else throw "System not supported"; - in { - name = "clang-${version}"; - srcClang = fetchurl { - url = "http://llvm.org/releases/${version}/clang-${version}.tgz"; - sha256 = "1pq9g7qxw761dp6gx3amx39kl9p4zhlymmn8gfmcnw9ag0zizi3h"; - }; - - prePatch = '' - pushd tools - unpackFile $srcClang - mv clang-${version} clang - popd - find - ''; - - patches = [ ./clang-include-paths.patch ./clang-ld-flags.patch ]; - - # Set up the header file paths - preConfigure = '' - sed -i -e 's,C_INCLUDE_PATH,"${stdenv.gcc.libc}/include/",' \ - -e 's,CPP_HOST,"${triplet}",' \ - -e 's,CPP_INCLUDE_PATH,"${stdenv.gcc.gcc}/include/c++/${stdenv.gcc.gcc.version}",' \ - tools/clang/lib/Frontend/InitHeaderSearch.cpp - ''; - - passthru = { gcc = stdenv.gcc.gcc; }; - - meta = { - homepage = http://clang.llvm.org/; - description = "A C language family frontend for LLVM"; - license = "BSD"; - maintainers = with stdenv.lib.maintainers; [viric shlevy]; - platforms = with stdenv.lib.platforms; linux; - }; - } -)) diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index ba131ccf476..7d5fe94b196 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1640,9 +1640,16 @@ let ccl = builderDefsPackage ../development/compilers/ccl {}; - clangBoot = wrapClang (llvm.override { buildClang = true; }); + clangBootUnwrapped = callPackage ../development/compilers/llvm/clang.nix { }; - clang = wrapClang (llvm.override { buildClang = true; stdenv = stdenvAdapters.overrideGCC stdenv clangBoot; }); + clangBoot = wrapClang clangBootUnwrapped; + + clangUnwrapped = let clangBootStdenv = stdenvAdapters.overrideGCC stdenv clangBoot; in clangBootUnwrapped.override { + stdenv = clangBootStdenv; + llvm = llvm.override { stdenv = clangBootStdenv; }; + }; + + clang = wrapClang clangUnwrapped; #Use this instead of stdenv to build with clang clangStdenv = stdenvAdapters.overrideGCC stdenv clang;