You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
5.6 KiB
Nix
157 lines
5.6 KiB
Nix
let
|
|
_pkgs = import <nixpkgs> {};
|
|
_nixpkgs = _pkgs.fetchFromGitHub (_pkgs.lib.importJSON ./pkgs/nixpkgs.json);
|
|
in
|
|
|
|
{ nixpkgsSrc ? _nixpkgs
|
|
, supportedSystems ? [ "x86_64-linux" "i686-linux" /* "x86_64-darwin" */ ]
|
|
}:
|
|
|
|
let
|
|
# Make an attribute set for each system, the builder is then specialized to
|
|
# use the selected system.
|
|
forEachSystem = systems: builder:
|
|
_pkgs.lib.genAttrs systems (system:
|
|
builder (import _nixpkgs { inherit system; })
|
|
);
|
|
|
|
# Make an attribute set for each compiler, the builder is then be specialized
|
|
# to use the selected compiler.
|
|
forEachCompiler = compilers: builder: pkgs:
|
|
with pkgs;
|
|
let
|
|
|
|
# Override, in a non-recursive matter to avoid recompilations, the standard
|
|
# environment used for building packages.
|
|
builderWithStdenv = stdenv: builder (pkgs // { inherit stdenv; });
|
|
|
|
noSysDirs = (system != "x86_64-darwin"
|
|
&& system != "x86_64-freebsd" && system != "i686-freebsd"
|
|
&& system != "x86_64-kfreebsd-gnu");
|
|
crossSystem = null;
|
|
|
|
gcc473 = wrapCC (callPackage ./pkgs/gcc-4.7 {
|
|
inherit noSysDirs;
|
|
texinfo = texinfo4;
|
|
# I'm not sure if profiling with enableParallelBuilding helps a lot.
|
|
# We can enable it back some day. This makes the *gcc* builds faster now.
|
|
profiledCompiler = false;
|
|
|
|
# When building `gcc.crossDrv' (a "Canadian cross", with host == target
|
|
# and host != build), `cross' must be null but the cross-libc must still
|
|
# be passed.
|
|
cross = null;
|
|
libcCross = if crossSystem != null then libcCross else null;
|
|
libpthreadCross =
|
|
if crossSystem != null && crossSystem.config == "i586-pc-gnu"
|
|
then gnu.libpthreadCross
|
|
else null;
|
|
});
|
|
|
|
# By default wrapCC keep the same header files, but NixOS is using the
|
|
# latest header files from GCC, which are not supported by clang, because
|
|
# clang implement a different set of locking primitives than GCC. This
|
|
# expression is used to wrap clang with a matching verion of the libc++.
|
|
maybeWrapClang = cc:
|
|
if cc ? clang then clangWrapCC cc
|
|
else cc;
|
|
clangWrapCC = llvmPackages:
|
|
let libcxx =
|
|
pkgs.lib.overrideDerivation llvmPackages.libcxx (drv: {
|
|
# https://bugzilla.mozilla.org/show_bug.cgi?id=1277619
|
|
# https://llvm.org/bugs/show_bug.cgi?id=14435
|
|
patches = drv.patches ++ [ ./pkgs/clang/bug-14435.patch ];
|
|
});
|
|
in
|
|
callPackage <nixpkgs/pkgs/build-support/cc-wrapper> {
|
|
cc = llvmPackages.clang-unwrapped or llvmPackages.clang;
|
|
isClang = true;
|
|
stdenv = clangStdenv;
|
|
libc = glibc;
|
|
# cc-wrapper pulls gcc headers, which are not compatible with features
|
|
# implemented in clang. These packages are used to override that.
|
|
extraPackages = [ libcxx llvmPackages.libcxxabi ];
|
|
nativeTools = false;
|
|
nativeLibc = false;
|
|
};
|
|
|
|
buildWithCompiler = cc: builderWithStdenv
|
|
(stdenvAdapters.overrideCC stdenv (maybeWrapClang cc));
|
|
chgCompilerSource = cc: name: src:
|
|
cc.override (conf:
|
|
if conf ? gcc then # Nixpkgs 14.12
|
|
{ gcc = lib.overrideDerivation conf.gcc (old: { inherit name src; }); }
|
|
else # Nixpkgs 15.05
|
|
{ cc = lib.overrideDerivation conf.cc (old: { inherit name src; }); }
|
|
);
|
|
|
|
compilersByName = {
|
|
clang = llvmPackages;
|
|
clang36 = llvmPackages_36;
|
|
clang37 = llvmPackages_37;
|
|
clang38 = llvmPackages_38; # not working yet.
|
|
gcc = gcc;
|
|
gcc49 = gcc49;
|
|
gcc48 = gcc48;
|
|
gcc474 = chgCompilerSource gcc473 "gcc-4.7.4" (fetchurl {
|
|
url = "mirror://gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2";
|
|
sha256 = "10k2k71kxgay283ylbbhhs51cl55zn2q38vj5pk4k950qdnirrlj";
|
|
});
|
|
gcc473 = gcc473;
|
|
# Version used on Linux slaves, except Linux x64 ASAN.
|
|
gcc472 = chgCompilerSource gcc473 "gcc-4.7.2" (fetchurl {
|
|
url = "mirror://gnu/gcc/gcc-4.7.2/gcc-4.7.2.tar.bz2";
|
|
sha256 = "115h03hil99ljig8lkrq4qk426awmzh0g99wrrggxf8g07bq74la";
|
|
});
|
|
};
|
|
|
|
in builtins.listToAttrs (map (x: { name = x; value = buildWithCompiler (builtins.getAttr x compilersByName); }) compilers);
|
|
|
|
build = name: { systems ? supportedSystems, compilers ? null }:
|
|
forEachSystem systems (
|
|
let
|
|
builder = pkgs: builtins.getAttr name (import ./default.nix { inherit pkgs; });
|
|
in
|
|
if compilers == null
|
|
then builder
|
|
else forEachCompiler compilers builder
|
|
);
|
|
|
|
geckoCompilers = [
|
|
"clang"
|
|
"clang36"
|
|
"clang37"
|
|
"clang38"
|
|
"gcc"
|
|
"gcc49"
|
|
"gcc48"
|
|
#"gcc474"
|
|
#"gcc473"
|
|
#"gcc472"
|
|
];
|
|
|
|
jobs = {
|
|
|
|
# For each system, and each compiler, create an attribute with the name of
|
|
# the system and compiler. Use this attribute name to select which
|
|
# environment you are interested in for building firefox. These can be
|
|
# build using the following command:
|
|
#
|
|
# $ nix-build release.nix -A gecko.x86_64-linux.clang -o firefox-x64
|
|
# $ nix-build release.nix -A gecko.i686-linux.gcc48 -o firefox-x86
|
|
#
|
|
# If you are only interested in getting a build environment, the use the
|
|
# nix-shell command instead, which will skip the copy of Firefox sources,
|
|
# and pull the the dependencies needed for building firefox with this
|
|
# environment.
|
|
#
|
|
# $ nix-shell release.nix -A gecko.i686-linux.gcc472 --pure --command 'gcc --version'
|
|
# $ nix-shell release.nix -A gecko.x86_64-linux.clang --pure
|
|
#
|
|
gecko = build "gecko" { compilers = geckoCompilers; };
|
|
servo = build "servo";
|
|
VidyoDesktop = build "VidyoDesktop";
|
|
};
|
|
|
|
in jobs
|