diff --git a/nixpkgs-mozilla b/nixpkgs-mozilla
deleted file mode 160000
index 086d3be..0000000
--- a/nixpkgs-mozilla
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 086d3beecab64c7fda215788eb1379fb665b462b
diff --git a/nixpkgs-mozilla/.gitignore b/nixpkgs-mozilla/.gitignore
new file mode 100644
index 0000000..d6944e3
--- /dev/null
+++ b/nixpkgs-mozilla/.gitignore
@@ -0,0 +1 @@
+/result*
diff --git a/nixpkgs-mozilla/.travis.yml b/nixpkgs-mozilla/.travis.yml
new file mode 100644
index 0000000..71953fa
--- /dev/null
+++ b/nixpkgs-mozilla/.travis.yml
@@ -0,0 +1,32 @@
+language: nix
+addons:
+ ssh_known_hosts: floki.garbas.si
+env:
+- STDENV=clang
+- STDENV=clang36
+- STDENV=clang37
+- STDENV=clang38
+- STDENV=gcc
+- STDENV=gcc49
+- STDENV=gcc48
+script:
+- if [ "$TRAVIS_EVENT_TYPE" == "cron" ]; then
+ nix-shell update.nix --pure;
+ fi
+- if [ "$TRAVIS_PULL_REQUEST" != "true" -a "$TRAVIS_BRANCH" = "master" ]; then
+ nix-build release.nix -A gecko."x86_64-linux"."$STDENV";
+ mkdir nars/;
+ nix-push --dest "$PWD/nars/" --force ./result;
+ fi
+before_install:
+- openssl aes-256-cbc -K $encrypted_be02022e0814_key -iv $encrypted_be02022e0814_iv -in deploy_rsa.enc -out deploy_rsa -d
+before_deploy:
+- eval "$(ssh-agent -s)"
+- chmod 600 $TRAVIS_BUILD_DIR/deploy_rsa
+- ssh-add $TRAVIS_BUILD_DIR/deploy_rsa
+deploy:
+ provider: script
+ skip_cleanup: true
+ script: rsync -avh --ignore-existing $TRAVIS_BUILD_DIR/nars/ travis@floki.garbas.si:/var/travis/nixpkgs-mozilla/
+ on:
+ branch: master
diff --git a/nixpkgs-mozilla/LICENSE b/nixpkgs-mozilla/LICENSE
new file mode 100644
index 0000000..5655fa3
--- /dev/null
+++ b/nixpkgs-mozilla/LICENSE
@@ -0,0 +1,19 @@
+Copyright 2017 Mozilla
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/nixpkgs-mozilla/README.rst b/nixpkgs-mozilla/README.rst
new file mode 100644
index 0000000..235b9e3
--- /dev/null
+++ b/nixpkgs-mozilla/README.rst
@@ -0,0 +1,47 @@
+nixpkgs-mozilla
+===============
+
+Gathering nix efforts in one repository.
+
+
+Current packages
+----------------
+
+- servo (https://github.com/servo/servo)
+- gecko (https://github.com/mozilla/gecko-dev)
+- firefox-dev-bin (`Firefox Developer Edition `)
+- VidyoDesktop ()
+
+Rust overlay
+------------
+
+**NOTE:** Nix overlays only works on up-to-date versions of NixOS/nixpkgs, starting from 17.03.
+
+A nixpkgs overlay is provided to contains all of the latest rust releases.
+
+To use the rust overlay run the ``./rust-overlay-install.sh`` command. It will
+link the current ``./rust-overlay.nix`` into you ``~/.config/nixpkgs/overlays`` folders.
+
+Once this is done, use ``nix-env -iA nixpkgs.rustChannels.nightly.rust`` for
+example. Replace the ``nixpkgs.`` prefix with ``nixos.`` on NixOS.
+
+TODO
+----
+
+- setup hydra and have to have binary channels
+
+- make sure pinned revisions get updated automatically (if build passes we
+ should update revisions in default.nix)
+
+- pin to specific (working) nixpkgs revision (as we do for other sources
+
+- servo can currently only be used with nix-shell. its build system tries to
+ dowload quite few things (it is doing ``pip install`` and ``cargo install``).
+ it should be possible to replace that with nix
+
+- can we make this work on darwin as well?
+
+- assign maintainers for our packages that will montior that it "always" builds
+
+- hook it with vulnix report to monitor CVEs (once vulnix is ready, it must be
+ ready soon :P)
diff --git a/nixpkgs-mozilla/default.nix b/nixpkgs-mozilla/default.nix
new file mode 100644
index 0000000..d2fc31a
--- /dev/null
+++ b/nixpkgs-mozilla/default.nix
@@ -0,0 +1,49 @@
+# This script extends nixpkgs with mozilla packages.
+#
+# First it imports the in the environment and depends on it
+# providing fetchFromGitHub and lib.importJSON.
+#
+# After that it loads a pinned release of nixos-unstable and uses that as the
+# base for the rest of packaging. One can pass it's own pkgs attribute if
+# desired, probably in the context of hydra.
+let
+ _pkgs = import {};
+ _nixpkgs = _pkgs.fetchFromGitHub (_pkgs.lib.importJSON ./pkgs/nixpkgs.json);
+in
+
+{ pkgs ? import _nixpkgs {}
+, geckoSrc ? null
+, servoSrc ? null
+}:
+
+let
+ callPackage = (extra: pkgs.lib.callPackageWith
+ ({ inherit geckoSrc servoSrc; } // self // extra)) {};
+
+ self = {
+
+ lib = callPackage ./pkgs/lib/default.nix { };
+
+ rustPlatform = pkgs.rustUnstable;
+
+ pkgs = pkgs // {
+ name = "nixpkgs";
+ updateScript = self.lib.updateFromGitHub {
+ owner = "NixOS";
+ repo = "nixpkgs-channels";
+ branch = "nixos-unstable-small";
+ path = "pkgs/nixpkgs.json";
+ };
+ };
+
+ gecko = callPackage ./pkgs/gecko { };
+
+ servo = callPackage ./pkgs/servo { };
+
+ firefox-nightly-bin = _pkgs.lowPrio (callPackage ./pkgs/firefox-nightly-bin/default.nix { });
+
+ VidyoDesktop = callPackage ./pkgs/VidyoDesktop { };
+
+ };
+
+in self
diff --git a/nixpkgs-mozilla/deploy_rsa.enc b/nixpkgs-mozilla/deploy_rsa.enc
new file mode 100644
index 0000000..131e0de
Binary files /dev/null and b/nixpkgs-mozilla/deploy_rsa.enc differ
diff --git a/nixpkgs-mozilla/lib/parseTOML.nix b/nixpkgs-mozilla/lib/parseTOML.nix
new file mode 100644
index 0000000..b8202fd
--- /dev/null
+++ b/nixpkgs-mozilla/lib/parseTOML.nix
@@ -0,0 +1,158 @@
+with builtins;
+let
+ layout_pat = "[ \n]+";
+ layout_pat_opt = "[ \n]*";
+ token_pat = ''=|[[][[][a-zA-Z0-9_."*-]+[]][]]|[[][a-zA-Z0-9_."*-]+[]]|[a-zA-Z0-9_-]+|"[^"]*"'';
+ tokenizer_rec = len: prevTokens: patterns: str:
+ let
+ pattern = head patterns;
+ layoutAndTokens = match pattern str;
+ matchLength = stringLength (head layoutAndTokens);
+ tokens = prevTokens ++ tail layoutAndTokens;
+ in
+ if layoutAndTokens == null then
+ # if we cannot reduce the pattern, return the list of token
+ if tail patterns == [] then prevTokens
+ # otherwise, take the next pattern, which only captures half the token.
+ else tokenizer_rec len prevTokens (tail patterns) str
+ else tokenizer_rec len tokens patterns (substring matchLength len str);
+
+ avgTokenSize = 100;
+ ceilLog2 = v:
+ let inner = n: i: if i < v then inner (n + 1) (i * 2) else n; in
+ inner 1 1;
+
+ # The builtins.match function match the entire string, and generate a list of all captured
+ # elements. This is the most efficient way to make a tokenizer, if we can make a pattern which
+ # capture all token of the file. Unfortunately C++ std::regex does not support captures in
+ # repeated patterns. As a work-around, we generate patterns which are matching tokens in multiple
+ # of 2, such that we can avoid iterating too many times over the content.
+ generatePatterns = str:
+ let
+ depth = ceilLog2 (stringLength str / avgTokenSize);
+ inner = depth:
+ if depth == 0 then [ "(${token_pat})" ]
+ else
+ let next = inner (depth - 1); in
+ [ "${head next}${layout_pat}${head next}" ] ++ next;
+ in
+ map (pat: "(${layout_pat_opt}${pat}).*" ) (inner depth);
+
+ tokenizer = str: tokenizer_rec (stringLength str) [] (generatePatterns str) str;
+
+ unescapeString = str:
+ # Let's ignore any escape character for the moment.
+ assert match ''"[^"]*"'' str != null;
+ substring 1 (stringLength str - 2) str;
+
+ tokenToValue = token:
+ if token == "true" then true
+ else if token == "false" then false
+ else unescapeString token;
+
+ # Match the content of TOML format section names, and add the grouping such that:
+ # match header_pat "a.b.c" == [ "a" ".b" "b" ".c" "c" ]
+ #
+ # Note, this implementation is limited to 11 identifiers.
+ ident_pat = ''[a-zA-Z0-9_-]+|"[^"]*"'';
+ header_pat =
+ foldl' (pat: n: "(${ident_pat})([.]${pat})?")
+ "(${ident_pat})" (genList (n: 0) 10);
+
+ headerToPath = token: wrapLen:
+ let
+ token' = substring wrapLen (stringLength token - 2 * wrapLen) token;
+ matchPath = match header_pat token';
+ filterDot = filter (s: substring 0 1 s != ".") matchPath;
+ path =
+ map (s:
+ if substring 0 1 s != ''"'' then s
+ else unescapeString s
+ ) filterDot;
+ in
+ assert matchPath != null;
+ # assert trace "Path: ${token'}; match as ${toString path}" true;
+ path;
+
+ parserInitState = {
+ idx = 0;
+ path = [];
+ isList = false;
+ output = [];
+ elem = {};
+ };
+
+ # Imported from nixpkgs library.
+ setAttrByPath = attrPath: value:
+ if attrPath == [] then value
+ else listToAttrs
+ [ { name = head attrPath; value = setAttrByPath (tail attrPath) value; } ];
+
+ closeSection = state:
+ state // {
+ output = state.output ++ [ (setAttrByPath state.path (
+ if state.isList then [ state.elem ]
+ else state.elem
+ )) ];
+ };
+
+ readToken = state: token:
+ # assert trace "Read '${token}'" true;
+ if state.idx == 0 then
+ if substring 0 2 token == "[[" then
+ (closeSection state) // {
+ path = headerToPath token 2;
+ isList = true;
+ elem = {};
+ }
+ else if substring 0 1 token == "[" then
+ (closeSection state) // {
+ path = headerToPath token 1;
+ isList = false;
+ elem = {};
+ }
+ else
+ assert match "[a-zA-Z0-9_-]+" token != null;
+ state // { idx = 1; name = token; }
+ else if state.idx == 1 then
+ assert token == "=";
+ state // { idx = 2; }
+ else
+ assert state.idx == 2;
+ state // {
+ idx = 0;
+ elem = state.elem // {
+ "${state.name}" = tokenToValue token;
+ };
+ };
+
+ # aggregate each section as individual attribute sets.
+ parser = str:
+ closeSection (foldl' readToken parserInitState (tokenizer str));
+
+ fromTOML = toml:
+ let
+ sections = (parser toml).output;
+ # Inlined from nixpkgs library functions.
+ zipAttrs = sets:
+ listToAttrs (map (n: {
+ name = n;
+ value =
+ let v = catAttrs n sets; in
+ # assert trace "Visiting ${n}" true;
+ if tail v == [] then head v
+ else if isList (head v) then concatLists v
+ else if isAttrs (head v) then zipAttrs v
+ else throw "cannot merge sections";
+ }) (concatLists (map attrNames sets)));
+ in
+ zipAttrs sections;
+in
+
+{
+ testing = fromTOML (builtins.readFile ./channel-rust-nightly.toml);
+ testing_url = fromTOML (builtins.readFile (builtins.fetchurl
+ https://static.rust-lang.org/dist/channel-rust-nightly.toml));
+ inherit fromTOML;
+}
+
diff --git a/nixpkgs-mozilla/pkgs/VidyoDesktop/builder.sh b/nixpkgs-mozilla/pkgs/VidyoDesktop/builder.sh
new file mode 100644
index 0000000..e3bc782
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/VidyoDesktop/builder.sh
@@ -0,0 +1,14 @@
+source $stdenv/setup
+PATH=$dpkg/bin:$PATH
+
+dpkg -x $src unpacked
+
+mkdir -p $out/bin
+cp -r unpacked/* $out/
+
+ln -s $out/usr/bin/VidyoDesktop $out/bin/VidyoDesktop
+touch $out/etc/issue
+
+#wrapProgram $out/bin/VidyoDesktop \
+# --set PULSE_LATENCY_MSEC "60" \
+# --set VIDYO_AUDIO_FRAMEWORK "ALSA"
diff --git a/nixpkgs-mozilla/pkgs/VidyoDesktop/default.nix b/nixpkgs-mozilla/pkgs/VidyoDesktop/default.nix
new file mode 100644
index 0000000..c9d76ee
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/VidyoDesktop/default.nix
@@ -0,0 +1,36 @@
+{ pkgs
+}:
+
+let
+
+ inherit (pkgs) fetchurl buildFHSUserEnv makeWrapper dpkg alsaLib
+ alsaUtils alsaOss alsaTools alsaPlugins libidn utillinux mesa_glu qt4
+ zlib patchelf xorg;
+ inherit (pkgs.stdenv) mkDerivation;
+
+ VidyoDesktopDeb = mkDerivation {
+ name = "VidyoDesktopDeb-123";
+ builder = ./builder.sh;
+ inherit dpkg;
+ src = fetchurl {
+ url = "https://v.mozilla.com/upload/VidyoDesktopInstaller-ubuntu64-TAG_VD_3_3_0_027.deb";
+ sha256 = "045f9z421qpcm45bmh98f3h7bd46rdjvcbdpv4rlw9ribncv66dc";
+ };
+ buildInputs = [ makeWrapper ];
+ };
+
+in buildFHSUserEnv {
+ name = "VidyoDesktop-123";
+ targetPkgs = pkgs: [ VidyoDesktopDeb ];
+ multiPkgs = pkgs: [
+ patchelf dpkg alsaLib alsaUtils alsaOss alsaTools alsaPlugins
+ libidn utillinux mesa_glu qt4 zlib xorg.libXext xorg.libXv xorg.libX11
+ xorg.libXfixes xorg.libXrandr xorg.libXScrnSaver
+ ];
+ extraBuildCommands = ''
+ ln -s ${VidyoDesktopDeb}/opt $out/opt
+ '';
+ runScript = "VidyoDesktop";
+ # for debugging
+ #runScript = "bash";
+}
diff --git a/nixpkgs-mozilla/pkgs/clang/bug-14435.patch b/nixpkgs-mozilla/pkgs/clang/bug-14435.patch
new file mode 100644
index 0000000..c16a8f8
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/clang/bug-14435.patch
@@ -0,0 +1,35 @@
+diff -x _inst -x _build -x .svn -ur libcxx.old/include/cstdio libcxx.new/include/cstdio
+--- libcxx.old/include/cstdio 2016-07-08 12:47:12.964181871 +0000
++++ libcxx.new/include/cstdio 2016-07-08 12:47:27.540149147 +0000
+@@ -109,15 +109,15 @@
+ #endif
+
+ #ifdef getc
+-inline _LIBCPP_INLINE_VISIBILITY int __libcpp_getc(FILE* __stream) {return getc(__stream);}
++inline __attribute__ ((__always_inline__)) int __libcpp_getc(FILE* __stream) {return getc(__stream);}
+ #undef getc
+-inline _LIBCPP_INLINE_VISIBILITY int getc(FILE* __stream) {return __libcpp_getc(__stream);}
++inline __attribute__ ((__always_inline__)) int getc(FILE* __stream) {return __libcpp_getc(__stream);}
+ #endif // getc
+
+ #ifdef putc
+-inline _LIBCPP_INLINE_VISIBILITY int __libcpp_putc(int __c, FILE* __stream) {return putc(__c, __stream);}
++inline __attribute__ ((__always_inline__)) int __libcpp_putc(int __c, FILE* __stream) {return putc(__c, __stream);}
+ #undef putc
+-inline _LIBCPP_INLINE_VISIBILITY int putc(int __c, FILE* __stream) {return __libcpp_putc(__c, __stream);}
++inline __attribute__ ((__always_inline__)) int putc(int __c, FILE* __stream) {return __libcpp_putc(__c, __stream);}
+ #endif // putc
+
+ #ifdef clearerr
+diff -x _inst -x _build -x .svn -ur libcxx.old/include/utility libcxx.new/include/utility
+--- libcxx.old/include/utility 2016-07-08 12:46:02.570334913 +0000
++++ libcxx.new/include/utility 2016-07-08 12:51:00.760636878 +0000
+@@ -217,7 +217,7 @@
+ }
+
+ template
+-inline _LIBCPP_INLINE_VISIBILITY
++inline __attribute__ ((__always_inline__))
+ void
+ swap(_Tp (&__a)[_Np], _Tp (&__b)[_Np]) _NOEXCEPT_(__is_nothrow_swappable<_Tp>::value)
+ {
diff --git a/nixpkgs-mozilla/pkgs/firefox-nightly-bin/default.nix b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/default.nix
new file mode 100644
index 0000000..fb6264b
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/default.nix
@@ -0,0 +1,28 @@
+{ pkgs
+}:
+
+let
+
+ unwrapped = pkgs.callPackage "${pkgs.path}/pkgs/applications/networking/browsers/firefox-bin" {
+ inherit (pkgs) stdenv;
+ channel = "nightly";
+ generated = import (./. + "/sources.nix");
+ gconf = pkgs.gnome2.GConf;
+ inherit (pkgs.gnome2) libgnome libgnomeui;
+ inherit (pkgs.gnome3) defaultIconTheme;
+ };
+
+ name = "firefox-nightly-bin-${(builtins.parseDrvName unwrapped.name).version}";
+
+ self = pkgs.wrapFirefox unwrapped {
+ browserName = "firefox";
+ desktopName = "Firefox Nightly";
+ inherit name;
+ };
+
+in self // {
+ updateScript = import ./update.nix {
+ inherit name;
+ inherit (pkgs) writeScript xidel coreutils gnused gnugrep curl jq;
+ };
+}
diff --git a/nixpkgs-mozilla/pkgs/firefox-nightly-bin/sources.nix b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/sources.nix
new file mode 100644
index 0000000..b09f75d
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/sources.nix
@@ -0,0 +1,10 @@
+{
+ version = "56.0a1" + "-" + "20170717100212";
+ sources = [
+ { url = "http://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/firefox-56.0a1.en-US.linux-x86_64.tar.bz2";
+ locale = "en-US";
+ arch = "linux-x86_64";
+ sha512 = "389ada65229fa6225a918041f77eed26cff321d649b8e9206835364e967fe3312dba9f7de9fbea52daf934265b804de447dddee60932d5019f8361884c9f3bde";
+ }
+ ];
+}
diff --git a/nixpkgs-mozilla/pkgs/firefox-nightly-bin/update.nix b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/update.nix
new file mode 100644
index 0000000..9f8f694
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/firefox-nightly-bin/update.nix
@@ -0,0 +1,46 @@
+{ name
+, writeScript
+, xidel
+, coreutils
+, gnused
+, gnugrep
+, curl
+, jq
+}:
+
+let
+ version = (builtins.parseDrvName name).version;
+in writeScript "update-firefox-nightly-bin" ''
+ PATH=${coreutils}/bin:${gnused}/bin:${gnugrep}/bin:${xidel}/bin:${curl}/bin:${jq}/bin
+
+ #set -eux
+ pushd pkgs/firefox-nightly-bin
+
+ tmpfile=`mktemp`
+ url=http://archive.mozilla.org/pub/firefox/nightly/latest-mozilla-central/
+
+ nightly_file=`xidel -q $url --extract //a | \
+ grep firefox | \
+ grep linux-x86_64.json | \
+ tail -1 | \
+ sed -e 's/.json//'`
+ nightly_json=`curl --silent $url$nightly_file.json`
+
+ cat > $tmpfile <
+ //
+Index: gcc-4_7-branch/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc
+===================================================================
+--- gcc-4_7-branch/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (revision 194579)
++++ gcc-4_7-branch/libstdc++-v3/testsuite/20_util/make_unsigned/requirements/typedefs-2.cc (revision 194580)
+@@ -1,5 +1,5 @@
+ // { dg-options "-std=gnu++0x -funsigned-char -fshort-enums" }
+-// { dg-options "-std=gnu++0x -funsigned-char -fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++// { dg-options "-std=gnu++0x -funsigned-char -fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+
+ // 2007-05-03 Benjamin Kosnik
+ //
+Index: gcc-4_7-branch/libjava/configure.ac
+===================================================================
+--- gcc-4_7-branch/libjava/configure.ac (revision 194579)
++++ gcc-4_7-branch/libjava/configure.ac (revision 194580)
+@@ -931,7 +931,7 @@
+ # on Darwin -single_module speeds up loading of the dynamic libraries.
+ extra_ldflags_libjava=-Wl,-single_module
+ ;;
+-arm*linux*eabi)
++arm*-*-linux*eabi*)
+ # Some of the ARM unwinder code is actually in libstdc++. We
+ # could in principle replicate it in libgcj, but it's better to
+ # have a dependency on libstdc++.
+Index: gcc-4_7-branch/libjava/configure
+===================================================================
+--- gcc-4_7-branch/libjava/configure (revision 194579)
++++ gcc-4_7-branch/libjava/configure (revision 194580)
+@@ -20542,7 +20542,7 @@
+ # on Darwin -single_module speeds up loading of the dynamic libraries.
+ extra_ldflags_libjava=-Wl,-single_module
+ ;;
+-arm*linux*eabi)
++arm*-*-linux*eabi*)
+ # Some of the ARM unwinder code is actually in libstdc++. We
+ # could in principle replicate it in libgcj, but it's better to
+ # have a dependency on libstdc++.
+Index: gcc-4_7-branch/libgcc/config.host
+===================================================================
+--- gcc-4_7-branch/libgcc/config.host (revision 194579)
++++ gcc-4_7-branch/libgcc/config.host (revision 194580)
+@@ -327,7 +327,7 @@
+ arm*-*-linux*) # ARM GNU/Linux with ELF
+ tmake_file="${tmake_file} arm/t-arm t-fixedpoint-gnu-prefix"
+ case ${host} in
+- arm*-*-linux-*eabi)
++ arm*-*-linux-*eabi*)
+ tmake_file="${tmake_file} arm/t-elf arm/t-bpabi arm/t-linux-eabi t-slibgcc-libgcc"
+ tm_file="$tm_file arm/bpabi-lib.h"
+ unwind_header=config/arm/unwind-arm.h
+Index: gcc-4_7-branch/gcc/doc/install.texi
+===================================================================
+--- gcc-4_7-branch/gcc/doc/install.texi (revision 194579)
++++ gcc-4_7-branch/gcc/doc/install.texi (revision 194580)
+@@ -3222,7 +3222,7 @@
+ @heading @anchor{arm-x-eabi}arm-*-eabi
+ ARM-family processors. Subtargets that use the ELF object format
+ require GNU binutils 2.13 or newer. Such subtargets include:
+-@code{arm-*-netbsdelf}, @code{arm-*-*linux-gnueabi}
++@code{arm-*-netbsdelf}, @code{arm-*-*linux-gnueabi*}
+ and @code{arm-*-rtemseabi}.
+
+ @html
+Index: gcc-4_7-branch/gcc/testsuite/gcc.target/arm/synchronize.c
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/gcc.target/arm/synchronize.c (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/gcc.target/arm/synchronize.c (revision 194580)
+@@ -1,4 +1,4 @@
+-/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-*eabi } } } */
++/* { dg-final { scan-assembler "__sync_synchronize|dmb|mcr" { target arm*-*-linux-*eabi* } } } */
+
+ void *foo (void)
+ {
+Index: gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.jason/enum6.C
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.jason/enum6.C (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.jason/enum6.C (revision 194580)
+@@ -7,10 +7,10 @@
+ // enum-size attributes should only be emitted if there are values of
+ // enum type that can escape the compilation unit, gcc cannot currently
+ // detect this; if this facility is added then this linker option should
+-// not be needed. arm-*-linux*eabi should be a good approximation to
++// not be needed. arm-*-linux*eabi* should be a good approximation to
+ // those platforms where the EABI supplement defines enum values to be
+ // 32 bits wide.
+-// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+
+ #include
+
+Index: gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.other/enum4.C
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.other/enum4.C (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.other/enum4.C (revision 194580)
+@@ -9,10 +9,10 @@
+ // enum-size attributes should only be emitted if there are values of
+ // enum type that can escape the compilation unit, gcc cannot currently
+ // detect this; if this facility is added then this linker option should
+-// not be needed. arm-*-linux*eabi should be a good approximation to
++// not be needed. arm-*-linux*eabi* should be a good approximation to
+ // those platforms where the EABI supplement defines enum values to be
+ // 32 bits wide.
+-// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+
+ enum E {
+ a = -312
+Index: gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.law/enum9.C
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.law/enum9.C (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/g++.old-deja/g++.law/enum9.C (revision 194580)
+@@ -7,10 +7,10 @@
+ // enum-size attributes should only be emitted if there are values of
+ // enum type that can escape the compilation unit, gcc cannot currently
+ // detect this; if this facility is added then this linker option should
+-// not be needed. arm-*-linux*eabi should be a good approximation to
++// not be needed. arm-*-linux*eabi* should be a good approximation to
+ // those platforms where the EABI supplement defines enum values to be
+ // 32 bits wide.
+-// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++// { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+
+ // GROUPS passed enums
+ extern "C" int printf (const char *, ...);
+Index: gcc-4_7-branch/gcc/testsuite/lib/target-supports.exp
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/lib/target-supports.exp (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/lib/target-supports.exp (revision 194580)
+@@ -3818,7 +3818,7 @@
+ }
+ } ""
+ }]
+- } elseif { [istarget arm*-*-linux-gnueabi] } {
++ } elseif { [istarget arm*-*-linux-gnueabi*] } {
+ return [check_runtime sync_longlong_runtime {
+ #include
+ int main ()
+@@ -3860,7 +3860,7 @@
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*]
+ || [istarget alpha*-*-*]
+- || [istarget arm*-*-linux-gnueabi]
++ || [istarget arm*-*-linux-gnueabi*]
+ || [istarget bfin*-*linux*]
+ || [istarget hppa*-*linux*]
+ || [istarget s390*-*-*]
+@@ -3890,7 +3890,7 @@
+ || [istarget i?86-*-*]
+ || [istarget x86_64-*-*]
+ || [istarget alpha*-*-*]
+- || [istarget arm*-*-linux-gnueabi]
++ || [istarget arm*-*-linux-gnueabi*]
+ || [istarget hppa*-*linux*]
+ || [istarget s390*-*-*]
+ || [istarget powerpc*-*-*]
+Index: gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_9.f90
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_9.f90 (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_9.f90 (revision 194580)
+@@ -1,6 +1,6 @@
+ ! { dg-do run }
+ ! { dg-options "-fshort-enums" }
+-! { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++! { dg-options "-fshort-enums -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+ ! Program to test enumerations when option -fshort-enums is given
+
+ program main
+Index: gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_10.f90
+===================================================================
+--- gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_10.f90 (revision 194579)
++++ gcc-4_7-branch/gcc/testsuite/gfortran.dg/enum_10.f90 (revision 194580)
+@@ -1,7 +1,7 @@
+ ! { dg-do run }
+ ! { dg-additional-sources enum_10.c }
+ ! { dg-options "-fshort-enums -w" }
+-! { dg-options "-fshort-enums -w -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi } }
++! { dg-options "-fshort-enums -w -Wl,--no-enum-size-warning" { target arm*-*-linux*eabi* } }
+ ! Make sure short enums are indeed interoperable with the
+ ! corresponding C type.
+
+Index: gcc-4_7-branch/gcc/ada/gcc-interface/Makefile.in
+===================================================================
+--- gcc-4_7-branch/gcc/ada/gcc-interface/Makefile.in (revision 194579)
++++ gcc-4_7-branch/gcc/ada/gcc-interface/Makefile.in (revision 194580)
+@@ -1866,7 +1866,7 @@
+ LIBRARY_VERSION := $(LIB_VERSION)
+ endif
+
+-ifeq ($(strip $(filter-out arm% linux-gnueabi,$(arch) $(osys)-$(word 4,$(targ)))),)
++ifeq ($(strip $(filter-out arm%-linux,$(arch)-$(osys)) $(if $(findstring eabi,$(word 4,$(targ))),,$(word 4,$(targ)))),)
+ LIBGNAT_TARGET_PAIRS = \
+ a-intnam.ads zip != null && unzip != null
+ && zlib != null && boehmgc != null
+ && perl != null; # for `--enable-java-home'
+assert langAda -> gnatboot != null;
+assert langVhdl -> gnat != null;
+
+# LTO needs libelf and zlib.
+assert libelf != null -> zlib != null;
+
+# Make sure we get GNU sed.
+assert stdenv.isDarwin -> gnused != null;
+
+# The go frontend is written in c++
+assert langGo -> langCC;
+
+with stdenv.lib;
+with builtins;
+
+let version = "4.7.3";
+
+ # Whether building a cross-compiler for GNU/Hurd.
+ crossGNU = cross != null && cross.config == "i586-pc-gnu";
+
+ /* gccinstall.info says that "parallel make is currently not supported since
+ collisions in profile collecting may occur".
+
+ Parallel make of gfortran is disabled because of an apparent race
+ condition concerning the generation of "bconfig.h". Please try and
+ re-enable parallel make for a later release of gfortran to check whether
+ the error has been fixed.
+ */
+ enableParallelBuilding = !profiledCompiler && !langFortran;
+
+ patches = []
+ ++ optional enableParallelBuilding ./parallel-bconfig-4.7.patch
+ ++ optional stdenv.isArm [ ./arm-eabi.patch ]
+ ++ optional (cross != null) ./libstdc++-target.patch
+ # ++ optional noSysDirs ./no-sys-dirs.patch
+ # The GNAT Makefiles did not pay attention to CFLAGS_FOR_TARGET for its
+ # target libraries and tools.
+ ++ optional langAda ./gnat-cflags.patch
+ ++ optional langFortran ./gfortran-driving.patch;
+
+ javaEcj = fetchurl {
+ # The `$(top_srcdir)/ecj.jar' file is automatically picked up at
+ # `configure' time.
+
+ # XXX: Eventually we might want to take it from upstream.
+ url = "ftp://sourceware.org/pub/java/ecj-4.3.jar";
+ sha256 = "0jz7hvc0s6iydmhgh5h2m15yza7p2rlss2vkif30vm9y77m97qcx";
+ };
+
+ # Antlr (optional) allows the Java `gjdoc' tool to be built. We want a
+ # binary distribution here to allow the whole chain to be bootstrapped.
+ javaAntlr = fetchurl {
+ url = http://www.antlr.org/download/antlr-3.1.3.jar;
+ sha256 = "1f41j0y4kjydl71lqlvr73yagrs2jsg1fjymzjz66mjy7al5lh09";
+ };
+
+ xlibs = [
+ libX11 libXt libSM libICE libXtst libXrender libXrandr libXi
+ xproto renderproto xextproto inputproto randrproto
+ ];
+
+ javaAwtGtk = langJava && gtk != null;
+
+ /* Platform flags */
+ platformFlags = let
+ gccArch = stdenv.lib.attrByPath [ "platform" "gcc" "arch" ] null stdenv;
+ gccCpu = stdenv.lib.attrByPath [ "platform" "gcc" "cpu" ] null stdenv;
+ gccAbi = stdenv.lib.attrByPath [ "platform" "gcc" "abi" ] null stdenv;
+ gccFpu = stdenv.lib.attrByPath [ "platform" "gcc" "fpu" ] null stdenv;
+ gccFloat = stdenv.lib.attrByPath [ "platform" "gcc" "float" ] null stdenv;
+ gccMode = stdenv.lib.attrByPath [ "platform" "gcc" "mode" ] null stdenv;
+ withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
+ withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
+ withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
+ withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
+ withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
+ withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
+ in
+ (withArch +
+ withCpu +
+ withAbi +
+ withFpu +
+ withFloat +
+ withMode);
+
+ /* Cross-gcc settings */
+ crossMingw = (cross != null && cross.libc == "msvcrt");
+ crossConfigureFlags = let
+ gccArch = stdenv.lib.attrByPath [ "gcc" "arch" ] null cross;
+ gccCpu = stdenv.lib.attrByPath [ "gcc" "cpu" ] null cross;
+ gccAbi = stdenv.lib.attrByPath [ "gcc" "abi" ] null cross;
+ gccFpu = stdenv.lib.attrByPath [ "gcc" "fpu" ] null cross;
+ gccFloat = stdenv.lib.attrByPath [ "gcc" "float" ] null cross;
+ gccMode = stdenv.lib.attrByPath [ "gcc" "mode" ] null cross;
+ withArch = if gccArch != null then " --with-arch=${gccArch}" else "";
+ withCpu = if gccCpu != null then " --with-cpu=${gccCpu}" else "";
+ withAbi = if gccAbi != null then " --with-abi=${gccAbi}" else "";
+ withFpu = if gccFpu != null then " --with-fpu=${gccFpu}" else "";
+ withFloat = if gccFloat != null then " --with-float=${gccFloat}" else "";
+ withMode = if gccMode != null then " --with-mode=${gccMode}" else "";
+ in
+ "--target=${cross.config}" +
+ withArch +
+ withCpu +
+ withAbi +
+ withFpu +
+ withFloat +
+ withMode +
+ (if crossMingw && crossStageStatic then
+ " --with-headers=${libcCross}/include" +
+ " --with-gcc" +
+ " --with-gnu-as" +
+ " --with-gnu-ld" +
+ " --with-gnu-ld" +
+ " --disable-shared" +
+ " --disable-nls" +
+ " --disable-debug" +
+ " --enable-sjlj-exceptions" +
+ " --enable-threads=win32" +
+ " --disable-win32-registry"
+ else if crossStageStatic then
+ " --disable-libssp --disable-nls" +
+ " --without-headers" +
+ " --disable-threads " +
+ " --disable-libmudflap " +
+ " --disable-libgomp " +
+ " --disable-libquadmath" +
+ " --disable-shared" +
+ " --disable-decimal-float" # libdecnumber requires libc
+ else
+ " --with-headers=${libcCross}/include" +
+ " --enable-__cxa_atexit" +
+ " --enable-long-long" +
+ (if crossMingw then
+ " --enable-threads=win32" +
+ " --enable-sjlj-exceptions" +
+ " --enable-hash-synchronization" +
+ " --disable-libssp" +
+ " --disable-nls" +
+ " --with-dwarf2" +
+ # I think noone uses shared gcc libs in mingw, so we better do the same.
+ # In any case, mingw32 g++ linking is broken by default with shared libs,
+ # unless adding "-lsupc++" to any linking command. I don't know why.
+ " --disable-shared" +
+ (if cross.config == "x86_64-w64-mingw32" then
+ # To keep ABI compatibility with upstream mingw-w64
+ " --enable-fully-dynamic-string"
+ else "")
+ else (if cross.libc == "uclibc" then
+ # In uclibc cases, libgomp needs an additional '-ldl'
+ # and as I don't know how to pass it, I disable libgomp.
+ " --disable-libgomp" else "") +
+ " --enable-threads=posix" +
+ " --enable-nls" +
+ " --disable-decimal-float") # No final libdecnumber (it may work only in 386)
+ );
+ stageNameAddon = if crossStageStatic then "-stage-static" else
+ "-stage-final";
+ crossNameAddon = if cross != null then "-${cross.config}" + stageNameAddon else "";
+
+ bootstrap = cross == null && !stdenv.isArm && !stdenv.isMips;
+
+in
+
+# We need all these X libraries when building AWT with GTK+.
+assert gtk != null -> (filter (x: x == null) xlibs) == [];
+
+stdenv.mkDerivation ({
+ name = "${name}${if stripped then "" else "-debug"}-${version}" + crossNameAddon;
+
+ builder = ./builder.sh;
+
+ src = fetchurl {
+ url = "mirror://gnu/gcc/gcc-${version}/gcc-${version}.tar.bz2";
+ sha256 = "1hx9h64ivarlzi4hxvq42as5m9vlr5cyzaaq4gzj4i619zmkfz1g";
+ };
+
+ inherit patches;
+
+ postPatch =
+ if (stdenv.isGNU
+ || (libcCross != null # e.g., building `gcc.crossDrv'
+ && libcCross ? crossConfig
+ && libcCross.crossConfig == "i586-pc-gnu")
+ || (crossGNU && libcCross != null))
+ then
+ # On GNU/Hurd glibc refers to Hurd & Mach headers and libpthread is not
+ # in glibc, so add the right `-I' flags to the default spec string.
+ assert libcCross != null -> libpthreadCross != null;
+ let
+ libc = if libcCross != null then libcCross else stdenv.glibc;
+ gnu_h = "gcc/config/gnu.h";
+ extraCPPDeps =
+ libc.propagatedBuildInputs
+ ++ stdenv.lib.optional (libpthreadCross != null) libpthreadCross
+ ++ stdenv.lib.optional (libpthread != null) libpthread;
+ extraCPPSpec =
+ concatStrings (intersperse " "
+ (map (x: "-I${x}/include") extraCPPDeps));
+ extraLibSpec =
+ if libpthreadCross != null
+ then "-L${libpthreadCross}/lib ${libpthreadCross.TARGET_LDFLAGS}"
+ else "-L${libpthread}/lib";
+ in
+ '' echo "augmenting \`CPP_SPEC' in \`${gnu_h}' with \`${extraCPPSpec}'..."
+ sed -i "${gnu_h}" \
+ -es'|CPP_SPEC *"\(.*\)$|CPP_SPEC "${extraCPPSpec} \1|g'
+
+ echo "augmenting \`LIB_SPEC' in \`${gnu_h}' with \`${extraLibSpec}'..."
+ sed -i "${gnu_h}" \
+ -es'|LIB_SPEC *"\(.*\)$|LIB_SPEC "${extraLibSpec} \1|g'
+
+ echo "setting \`NATIVE_SYSTEM_HEADER_DIR' and \`STANDARD_INCLUDE_DIR' to \`${libc}/include'..."
+ sed -i "${gnu_h}" \
+ -es'|#define STANDARD_INCLUDE_DIR.*$|#define STANDARD_INCLUDE_DIR "${libc}/include"|g'
+ ''
+ else if cross != null || stdenv.gcc.libc != null then
+ # On NixOS, use the right path to the dynamic linker instead of
+ # `/lib/ld*.so'.
+ let
+ libc = if libcCross != null then libcCross else stdenv.gcc.libc;
+ in
+ '' echo "fixing the \`GLIBC_DYNAMIC_LINKER' and \`UCLIBC_DYNAMIC_LINKER' macros..."
+ for header in "gcc/config/"*-gnu.h "gcc/config/"*"/"*.h
+ do
+ grep -q LIBC_DYNAMIC_LINKER "$header" || continue
+ echo " fixing \`$header'..."
+ sed -i "$header" \
+ -e 's|define[[:blank:]]*\([UCG]\+\)LIBC_DYNAMIC_LINKER\([0-9]*\)[[:blank:]]"\([^\"]\+\)"$|define \1LIBC_DYNAMIC_LINKER\2 "${libc}\3"|g'
+ done
+ ''
+ else null;
+
+ inherit noSysDirs staticCompiler langJava crossStageStatic
+ libcCross crossMingw;
+
+ nativeBuildInputs = [ texinfo which gettext ]
+ ++ (optional (perl != null) perl)
+ ++ (optional javaAwtGtk pkgconfig);
+
+ buildInputs = [ gmp mpfr mpc libelf ]
+ ++ (optional (ppl != null) ppl)
+ ++ (optional (cloog != null) cloog)
+ ++ (optional (zlib != null) zlib)
+ ++ (optionals langJava [ boehmgc zip unzip ])
+ ++ (optionals javaAwtGtk ([ gtk libart_lgpl ] ++ xlibs))
+ ++ (optionals (cross != null) [binutilsCross])
+ ++ (optionals langAda [gnatboot])
+ ++ (optionals langVhdl [gnat])
+
+ # The builder relies on GNU sed (for instance, Darwin's `sed' fails with
+ # "-i may not be used with stdin"), and `stdenvNative' doesn't provide it.
+ ++ (optional stdenv.isDarwin gnused)
+ ;
+
+ NIX_LDFLAGS = stdenv.lib.optionalString stdenv.isSunOS "-lm -ldl";
+
+ preConfigure = ''
+ configureFlagsArray=(
+ ${stdenv.lib.optionalString (ppl != null && ppl ? dontDisableStatic && ppl.dontDisableStatic)
+ "'--with-host-libstdcxx=-lstdc++ -lgcc_s'"}
+ ${stdenv.lib.optionalString (ppl != null && stdenv.isSunOS)
+ "\"--with-host-libstdcxx=-Wl,-rpath,\$prefix/lib/amd64 -lstdc++\"
+ \"--with-boot-ldflags=-L../prev-x86_64-pc-solaris2.11/libstdc++-v3/src/.libs\""}
+ );
+ ${stdenv.lib.optionalString (stdenv.isSunOS && stdenv.is64bit)
+ ''
+ export NIX_LDFLAGS=`echo $NIX_LDFLAGS | sed -e s~$prefix/lib~$prefix/lib/amd64~g`
+ export LDFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $LDFLAGS_FOR_TARGET"
+ export CXXFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CXXFLAGS_FOR_TARGET"
+ export CFLAGS_FOR_TARGET="-Wl,-rpath,$prefix/lib/amd64 $CFLAGS_FOR_TARGET"
+ ''}
+ '';
+
+ # 'iant' at #go-nuts@freenode, gccgo maintainer, said that
+ # they have a bug in 4.7.1 if adding "--disable-static"
+ dontDisableStatic = langGo || staticCompiler;
+
+ configureFlags = "
+ ${if stdenv.isSunOS then
+ " --enable-long-long --enable-libssp --enable-threads=posix --disable-nls --enable-__cxa_atexit " +
+ # On Illumos/Solaris GNU as is preferred
+ " --with-gnu-as --without-gnu-ld "
+ else ""}
+ --enable-lto
+ ${if enableMultilib then "" else "--disable-multilib"}
+ ${if enableShared then "" else "--disable-shared"}
+ ${if enablePlugin then "--enable-plugin" else "--disable-plugin"}
+ ${if ppl != null then "--with-ppl=${ppl} --disable-ppl-version-check" else ""}
+ ${if cloog != null then
+ "--with-cloog=${cloog} --disable-cloog-version-check --enable-cloog-backend=isl"
+ else ""}
+ ${if langJava then
+ "--with-ecj-jar=${javaEcj} " +
+
+ # Follow Sun's layout for the convenience of IcedTea/OpenJDK. See
+ # .
+ "--enable-java-home --with-java-home=\${prefix}/lib/jvm/jre "
+ else ""}
+ ${if javaAwtGtk then "--enable-java-awt=gtk" else ""}
+ ${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr}" else ""}
+ --with-gmp=${gmp}
+ --with-mpfr=${mpfr}
+ --with-mpc=${mpc}
+ ${if libelf != null then "--with-libelf=${libelf}" else ""}
+ --disable-libstdcxx-pch
+ --without-included-gettext
+ --with-system-zlib
+ --enable-languages=${
+ concatStrings (intersperse ","
+ ( optional langC "c"
+ ++ optional langCC "c++"
+ ++ optional langFortran "fortran"
+ ++ optional langJava "java"
+ ++ optional langAda "ada"
+ ++ optional langVhdl "vhdl"
+ ++ optional langGo "go"
+ )
+ )
+ }
+ ${if (stdenv ? glibc && cross == null)
+ then " --with-native-system-header-dir=${stdenv.glibc}/include"
+ else ""}
+ ${if langAda then " --enable-libada" else ""}
+ ${if cross == null && stdenv.isi686 then "--with-arch=i686" else ""}
+ ${if cross != null then crossConfigureFlags else ""}
+ ${if !bootstrap then "--disable-bootstrap" else ""}
+ ${if cross == null then platformFlags else ""}
+ ";
+
+ targetConfig = if cross != null then cross.config else null;
+
+ buildFlags = if bootstrap then
+ (if profiledCompiler then "profiledbootstrap" else "bootstrap")
+ else "";
+
+ installTargets =
+ if stripped
+ then "install-strip"
+ else "install";
+
+ crossAttrs = let
+ xgccArch = stdenv.lib.attrByPath [ "gcc" "arch" ] null stdenv.cross;
+ xgccCpu = stdenv.lib.attrByPath [ "gcc" "cpu" ] null stdenv.cross;
+ xgccAbi = stdenv.lib.attrByPath [ "gcc" "abi" ] null stdenv.cross;
+ xgccFpu = stdenv.lib.attrByPath [ "gcc" "fpu" ] null stdenv.cross;
+ xgccFloat = stdenv.lib.attrByPath [ "gcc" "float" ] null stdenv.cross;
+ xwithArch = if xgccArch != null then " --with-arch=${xgccArch}" else "";
+ xwithCpu = if xgccCpu != null then " --with-cpu=${xgccCpu}" else "";
+ xwithAbi = if xgccAbi != null then " --with-abi=${xgccAbi}" else "";
+ xwithFpu = if xgccFpu != null then " --with-fpu=${xgccFpu}" else "";
+ xwithFloat = if xgccFloat != null then " --with-float=${xgccFloat}" else "";
+ in {
+ AR = "${stdenv.cross.config}-ar";
+ LD = "${stdenv.cross.config}-ld";
+ CC = "${stdenv.cross.config}-gcc";
+ CXX = "${stdenv.cross.config}-gcc";
+ AR_FOR_TARGET = "${stdenv.cross.config}-ar";
+ LD_FOR_TARGET = "${stdenv.cross.config}-ld";
+ CC_FOR_TARGET = "${stdenv.cross.config}-gcc";
+ NM_FOR_TARGET = "${stdenv.cross.config}-nm";
+ CXX_FOR_TARGET = "${stdenv.cross.config}-g++";
+ # If we are making a cross compiler, cross != null
+ NIX_GCC_CROSS = if cross == null then "${stdenv.gccCross}" else "";
+ dontStrip = true;
+ configureFlags = ''
+ ${if enableMultilib then "" else "--disable-multilib"}
+ ${if enableShared then "" else "--disable-shared"}
+ ${if ppl != null then "--with-ppl=${ppl.crossDrv}" else ""}
+ ${if cloog != null then "--with-cloog=${cloog.crossDrv} --enable-cloog-backend=isl" else ""}
+ ${if langJava then "--with-ecj-jar=${javaEcj.crossDrv}" else ""}
+ ${if javaAwtGtk then "--enable-java-awt=gtk" else ""}
+ ${if langJava && javaAntlr != null then "--with-antlr-jar=${javaAntlr.crossDrv}" else ""}
+ --with-gmp=${gmp.crossDrv}
+ --with-mpfr=${mpfr.crossDrv}
+ --disable-libstdcxx-pch
+ --without-included-gettext
+ --with-system-zlib
+ --enable-languages=${
+ concatStrings (intersperse ","
+ ( optional langC "c"
+ ++ optional langCC "c++"
+ ++ optional langFortran "fortran"
+ ++ optional langJava "java"
+ ++ optional langAda "ada"
+ ++ optional langVhdl "vhdl"
+ ++ optional langGo "go"
+ )
+ )
+ }
+ ${if langAda then " --enable-libada" else ""}
+ --target=${stdenv.cross.config}
+ ${xwithArch}
+ ${xwithCpu}
+ ${xwithAbi}
+ ${xwithFpu}
+ ${xwithFloat}
+ '';
+ buildFlags = "";
+ };
+
+
+ # Needed for the cross compilation to work
+ AR = "ar";
+ LD = "ld";
+ # http://gcc.gnu.org/install/specific.html#x86-64-x-solaris210
+ CC = if stdenv.system == "x86_64-solaris" then "gcc -m64"
+ else "gcc";
+
+ # Setting $CPATH and $LIBRARY_PATH to make sure both `gcc' and `xgcc' find
+ # the library headers and binaries, regarless of the language being
+ # compiled.
+
+ # Note: When building the Java AWT GTK+ peer, the build system doesn't
+ # honor `--with-gmp' et al., e.g., when building
+ # `libjava/classpath/native/jni/java-math/gnu_java_math_GMP.c', so we just
+ # add them to $CPATH and $LIBRARY_PATH in this case.
+ #
+ # Likewise, the LTO code doesn't find zlib.
+
+ CPATH = concatStrings
+ (intersperse ":" (map (x: x + "/include")
+ (optionals (zlib != null) [ zlib ]
+ ++ optionals langJava [ boehmgc ]
+ ++ optionals javaAwtGtk xlibs
+ ++ optionals javaAwtGtk [ gmp mpfr ]
+ ++ optional (libpthread != null) libpthread
+ ++ optional (libpthreadCross != null) libpthreadCross
+
+ # On GNU/Hurd glibc refers to Mach & Hurd
+ # headers.
+ ++ optionals (libcCross != null &&
+ hasAttr "propagatedBuildInputs" libcCross)
+ libcCross.propagatedBuildInputs)));
+
+ LIBRARY_PATH = concatStrings
+ (intersperse ":" (map (x: x + "/lib")
+ (optionals (zlib != null) [ zlib ]
+ ++ optionals langJava [ boehmgc ]
+ ++ optionals javaAwtGtk xlibs
+ ++ optionals javaAwtGtk [ gmp mpfr ]
+ ++ optional (libpthread != null) libpthread)));
+
+ EXTRA_TARGET_CFLAGS =
+ if cross != null && libcCross != null
+ then "-idirafter ${libcCross}/include"
+ else null;
+
+ EXTRA_TARGET_LDFLAGS =
+ if cross != null && libcCross != null
+ then "-B${libcCross}/lib -Wl,-L${libcCross}/lib" +
+ (optionalString (libpthreadCross != null)
+ " -L${libpthreadCross}/lib -Wl,${libpthreadCross.TARGET_LDFLAGS}")
+ else null;
+
+ passthru = { inherit langC langCC langAda langFortran langVhdl
+ langGo enableMultilib version; };
+
+ inherit enableParallelBuilding;
+
+ meta = {
+ homepage = http://gcc.gnu.org/;
+ license = "GPLv3+"; # runtime support libraries are typically LGPLv3+
+ description = "GNU Compiler Collection, version ${version}"
+ + (if stripped then "" else " (with debugging info)");
+
+ longDescription = ''
+ The GNU Compiler Collection includes compiler front ends for C, C++,
+ Objective-C, Fortran, OpenMP for C/C++/Fortran, Java, and Ada, as well
+ as libraries for these languages (libstdc++, libgcj, libgomp,...).
+
+ GCC development is a part of the GNU Project, aiming to improve the
+ compiler used in the GNU system including the GNU/Linux variant.
+ '';
+
+ maintainers = [
+ stdenv.lib.maintainers.ludo
+ stdenv.lib.maintainers.viric
+ stdenv.lib.maintainers.shlevy
+ ];
+
+ # Volunteers needed for the {Cyg,Dar}win ports of *PPL.
+ # gnatboot is not available out of linux platforms, so we disable the darwin build
+ # for the gnat (ada compiler).
+ platforms = stdenv.lib.platforms.linux ++ optionals (langAda == false && libelf == null) [ "i686-darwin" ];
+ };
+}
+
+// optionalAttrs (cross != null && cross.libc == "msvcrt" && crossStageStatic) {
+ makeFlags = [ "all-gcc" "all-target-libgcc" ];
+ installTargets = "install-gcc install-target-libgcc";
+}
+
+
+# Strip kills static libs of other archs (hence cross != null)
+// optionalAttrs (!stripped || cross != null) { dontStrip = true; NIX_STRIP_DEBUG = 0; }
+)
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/gfortran-driving.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/gfortran-driving.patch
new file mode 100644
index 0000000..7070888
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/gfortran-driving.patch
@@ -0,0 +1,20 @@
+This patch fixes interaction with Libtool.
+See , for details.
+
+--- a/gcc/fortran/gfortranspec.c
++++ b/gcc/fortran/gfortranspec.c
+@@ -461,8 +461,15 @@ For more information about these matters, see the file named COPYING\n\n"));
+ {
+ fprintf (stderr, _("Driving:"));
+ for (i = 0; i < g77_newargc; i++)
++ {
++ if (g77_new_decoded_options[i].opt_index == OPT_l)
++ /* Make sure no white space is inserted after `-l'. */
++ fprintf (stderr, " -l%s",
++ g77_new_decoded_options[i].canonical_option[1]);
++ else
+ fprintf (stderr, " %s",
+ g77_new_decoded_options[i].orig_option_with_args_text);
++ }
+ fprintf (stderr, "\n");
+ }
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/gnat-cflags.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/gnat-cflags.patch
new file mode 100644
index 0000000..bf2acf0
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/gnat-cflags.patch
@@ -0,0 +1,33 @@
+diff --git a/libada/Makefile.in b/libada/Makefile.in
+index f5057a0..337e0c6 100644
+--- a/libada/Makefile.in
++++ b/libada/Makefile.in
+@@ -55,7 +55,7 @@ GCC_WARN_CFLAGS = $(LOOSE_WARN)
+ WARN_CFLAGS = @warn_cflags@
+
+ TARGET_LIBGCC2_CFLAGS=
+-GNATLIBCFLAGS= -g -O2
++GNATLIBCFLAGS= -g -O2 $(CFLAGS)
+ GNATLIBCFLAGS_FOR_C = $(GNATLIBCFLAGS) $(TARGET_LIBGCC2_CFLAGS) -fexceptions \
+ -DIN_RTS @have_getipinfo@
+
+--- a/gcc/ada/gcc-interface/Makefile.in
++++ b/gcc/ada/gcc-interface/Makefile.in
+@@ -105,7 +105,7 @@ ADAFLAGS = -W -Wall -gnatpg -gnata
+ SOME_ADAFLAGS =-gnata
+ FORCE_DEBUG_ADAFLAGS = -g
+ GNATLIBFLAGS = -gnatpg -nostdinc
+-GNATLIBCFLAGS = -g -O2
++GNATLIBCFLAGS = -g -O2 $(CFLAGS_FOR_TARGET)
+ # Pretend that _Unwind_GetIPInfo is available for the target by default. This
+ # should be autodetected during the configuration of libada and passed down to
+ # here, but we need something for --disable-libada and hope for the best.
+@@ -193,7 +193,7 @@ RTSDIR = rts$(subst /,_,$(MULTISUBDIR))
+ # Link flags used to build gnat tools. By default we prefer to statically
+ # link with libgcc to avoid a dependency on shared libgcc (which is tricky
+ # to deal with as it may conflict with the libgcc provided by the system).
+-GCC_LINK_FLAGS=-static-libgcc
++GCC_LINK_FLAGS=-static-libgcc $(CFLAGS_FOR_TARGET)
+
+ # End of variables for you to override.
+
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/java-jvgenmain-link.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/java-jvgenmain-link.patch
new file mode 100644
index 0000000..2612e8b
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/java-jvgenmain-link.patch
@@ -0,0 +1,17 @@
+The `jvgenmain' executable must be linked against `vec.o', among others,
+since it uses its vector API.
+
+--- gcc-4.3.3/gcc/java/Make-lang.in 2008-12-05 00:00:19.000000000 +0100
++++ gcc-4.3.3/gcc/java/Make-lang.in 2009-07-03 16:11:41.000000000 +0200
+@@ -109,9 +109,9 @@ jcf-dump$(exeext): $(JCFDUMP_OBJS) $(LIB
+ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(JCFDUMP_OBJS) \
+ $(CPPLIBS) $(ZLIB) $(LDEXP_LIB) $(LIBS)
+
+-jvgenmain$(exeext): $(JVGENMAIN_OBJS) $(LIBDEPS)
++jvgenmain$(exeext): $(JVGENMAIN_OBJS) $(LIBDEPS) $(BUILD_RTL)
+ rm -f $@
+- $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(JVGENMAIN_OBJS) $(LIBS)
++ $(CC) $(ALL_CFLAGS) $(LDFLAGS) -o $@ $(JVGENMAIN_OBJS) $(BUILD_RTL) $(LIBS)
+
+ #
+ # Build hooks:
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/libstdc++-target.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/libstdc++-target.patch
new file mode 100644
index 0000000..fb622b3
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/libstdc++-target.patch
@@ -0,0 +1,32 @@
+Patch to make the target libraries 'configure' scripts find the proper CPP.
+I noticed that building the mingw32 cross compiler.
+Looking at the build script for mingw in archlinux, I think that only nixos
+needs this patch. I don't know why.
+diff --git a/Makefile.in b/Makefile.in
+index 93f66b6..d691917 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -266,6 +266,7 @@ BASE_TARGET_EXPORTS = \
+ AR="$(AR_FOR_TARGET)"; export AR; \
+ AS="$(COMPILER_AS_FOR_TARGET)"; export AS; \
+ CC="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CC; \
++ CPP="$(CC_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CC; \
+ CFLAGS="$(CFLAGS_FOR_TARGET)"; export CFLAGS; \
+ CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
+ CPPFLAGS="$(CPPFLAGS_FOR_TARGET)"; export CPPFLAGS; \
+@@ -291,11 +292,13 @@ BASE_TARGET_EXPORTS = \
+ RAW_CXX_TARGET_EXPORTS = \
+ $(BASE_TARGET_EXPORTS) \
+ CXX_FOR_TARGET="$(RAW_CXX_FOR_TARGET)"; export CXX_FOR_TARGET; \
+- CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX;
++ CXX="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \
++ CXXCPP="$(RAW_CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX;
+
+ NORMAL_TARGET_EXPORTS = \
+ $(BASE_TARGET_EXPORTS) \
+- CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX;
++ CXX="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS"; export CXX; \
++ CXXCPP="$(CXX_FOR_TARGET) $(XGCC_FLAGS_FOR_TARGET) $$TFLAGS -E"; export CXX;
+
+ # Where to find GMP
+ HOST_GMPLIBS = @gmplibs@
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/no-sys-dirs.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/no-sys-dirs.patch
new file mode 100644
index 0000000..7990170
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/no-sys-dirs.patch
@@ -0,0 +1,41 @@
+diff -ru gcc-4.3.1-orig/gcc/cppdefault.c gcc-4.3.1/gcc/cppdefault.c
+--- gcc-4.3.1-orig/gcc/cppdefault.c 2007-07-26 10:37:01.000000000 +0200
++++ gcc-4.3.1/gcc/cppdefault.c 2008-06-25 17:48:23.000000000 +0200
+@@ -41,6 +41,10 @@
+ # undef CROSS_INCLUDE_DIR
+ #endif
+
++#undef LOCAL_INCLUDE_DIR
++#undef SYSTEM_INCLUDE_DIR
++#undef STANDARD_INCLUDE_DIR
++
+ const struct default_include cpp_include_defaults[]
+ #ifdef INCLUDE_DEFAULTS
+ = INCLUDE_DEFAULTS;
+diff -ru gcc-4.3.1-orig/gcc/gcc.c gcc-4.3.1/gcc/gcc.c
+--- gcc-4.3.1-orig/gcc/gcc.c 2008-03-02 23:55:19.000000000 +0100
++++ gcc-4.3.1/gcc/gcc.c 2008-06-25 17:52:53.000000000 +0200
+@@ -1478,10 +1478,10 @@
+ /* Default prefixes to attach to command names. */
+
+ #ifndef STANDARD_STARTFILE_PREFIX_1
+-#define STANDARD_STARTFILE_PREFIX_1 "/lib/"
++#define STANDARD_STARTFILE_PREFIX_1 ""
+ #endif
+ #ifndef STANDARD_STARTFILE_PREFIX_2
+-#define STANDARD_STARTFILE_PREFIX_2 "/usr/lib/"
++#define STANDARD_STARTFILE_PREFIX_2 ""
+ #endif
+
+ #ifdef CROSS_DIRECTORY_STRUCTURE /* Don't use these prefixes for a cross compiler. */
+--- gcc-4.3.1-orig/gcc/Makefile.in 2008-05-11 20:54:15.000000000 +0200
++++ gcc-4.3.1/gcc/Makefile.in 2008-06-25 17:48:23.000000000 +0200
+@@ -3277,7 +3281,7 @@
+ -DGPLUSPLUS_INCLUDE_DIR=\"$(gcc_gxx_include_dir)\" \
+ -DGPLUSPLUS_TOOL_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/$(target_noncanonical)\" \
+ -DGPLUSPLUS_BACKWARD_INCLUDE_DIR=\"$(gcc_gxx_include_dir)/backward\" \
+- -DLOCAL_INCLUDE_DIR=\"$(local_includedir)\" \
++ -DLOCAL_INCLUDE_DIR=\"/no-such-dir\" \
+ -DCROSS_INCLUDE_DIR=\"$(CROSS_SYSTEM_HEADER_DIR)\" \
+ -DTOOL_INCLUDE_DIR=\"$(gcc_tooldir)/include\" \
+ -DPREFIX=\"$(prefix)/\" \
diff --git a/nixpkgs-mozilla/pkgs/gcc-4.7/parallel-bconfig-4.7.patch b/nixpkgs-mozilla/pkgs/gcc-4.7/parallel-bconfig-4.7.patch
new file mode 100644
index 0000000..bdf0fa4
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gcc-4.7/parallel-bconfig-4.7.patch
@@ -0,0 +1,30 @@
+diff --git a/gcc/Makefile.in b/gcc/Makefile.in
+index 0f6735a..ba93e9b 100644
+--- a/gcc/Makefile.in
++++ b/gcc/Makefile.in
+@@ -3904,21 +3904,21 @@ build/genflags.o : genflags.c $(RTL_BASE_H) $(OBSTACK_H) $(BCONFIG_H) \
+ $(SYSTEM_H) coretypes.h $(GTM_H) errors.h $(READ_MD_H) gensupport.h
+ build/gengenrtl.o : gengenrtl.c $(BCONFIG_H) $(SYSTEM_H) rtl.def
+ gengtype-lex.o build/gengtype-lex.o : gengtype-lex.c gengtype.h $(SYSTEM_H)
+-gengtype-lex.o: $(CONFIG_H)
++gengtype-lex.o: $(CONFIG_H) $(BCONFIG_H)
+ build/gengtype-lex.o: $(BCONFIG_H)
+ gengtype-parse.o build/gengtype-parse.o : gengtype-parse.c gengtype.h \
+ $(SYSTEM_H)
+-gengtype-parse.o: $(CONFIG_H)
++gengtype-parse.o: $(CONFIG_H) $(BCONFIG_H)
+ build/gengtype-parse.o: $(BCONFIG_H)
+ gengtype-state.o build/gengtype-state.o: gengtype-state.c $(SYSTEM_H) \
+ gengtype.h errors.h double-int.h version.h $(HASHTAB_H) $(OBSTACK_H) \
+ $(XREGEX_H)
+-gengtype-state.o: $(CONFIG_H)
++gengtype-state.o: $(CONFIG_H) $(BCONFIG_H)
+ build/gengtype-state.o: $(BCONFIG_H)
+ gengtype.o build/gengtype.o : gengtype.c $(SYSTEM_H) gengtype.h \
+ rtl.def insn-notes.def errors.h double-int.h version.h $(HASHTAB_H) \
+ $(OBSTACK_H) $(XREGEX_H)
+-gengtype.o: $(CONFIG_H)
++gengtype.o: $(CONFIG_H) $(BCONFIG_H)
+ build/gengtype.o: $(BCONFIG_H)
+ build/genmddeps.o: genmddeps.c $(BCONFIG_H) $(SYSTEM_H) coretypes.h \
+ errors.h $(READ_MD_H)
diff --git a/nixpkgs-mozilla/pkgs/gecko/default.nix b/nixpkgs-mozilla/pkgs/gecko/default.nix
new file mode 100644
index 0000000..56778c3
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gecko/default.nix
@@ -0,0 +1,119 @@
+{ geckoSrc ? null
+, lib
+, pkgs
+}:
+
+let
+
+ inherit (lib) updateFromGitHub;
+ inherit (pkgs) fetchFromGitHub pythonFull which autoconf213
+ perl unzip zip gnumake yasm pkgconfig xlibs gnome2 pango dbus dbus_glib
+ alsaLib libpulseaudio gstreamer gst_plugins_base gtk3 glib
+ gobjectIntrospection git mercurial openssl cmake;
+ inherit (pkgs) valgrind gdb rr;
+ inherit (pkgs.pythonPackages) setuptools;
+ inherit (pkgs.stdenv) mkDerivation;
+ inherit (pkgs.lib) importJSON optionals inNixShell;
+ inherit (pkgs.rust) rustc cargo;
+
+ # Gecko sources are huge, we do not want to import them in the nix-store when
+ # we use this expression for making a build environment.
+ src =
+ if inNixShell then
+ null
+ else if geckoSrc == null then
+ fetchFromGitHub (importJSON ./source.json)
+ else
+ geckoSrc;
+
+ version = "HEAD"; # XXX: builtins.readFile "${src}/browser/config/version.txt";
+
+in mkDerivation {
+ name = "gecko-dev-${version}";
+ inherit src;
+ buildInputs = [
+
+ # Expected by "mach"
+ pythonFull setuptools which autoconf213
+
+ # Expected by the configure script
+ perl unzip zip gnumake yasm pkgconfig
+
+ xlibs.libICE xlibs.libSM xlibs.libX11 xlibs.libXau xlibs.libxcb
+ xlibs.libXdmcp xlibs.libXext xlibs.libXt xlibs.printproto
+ xlibs.renderproto xlibs.xextproto xlibs.xproto xlibs.libXcomposite
+ xlibs.compositeproto xlibs.libXfixes xlibs.fixesproto
+ xlibs.damageproto xlibs.libXdamage xlibs.libXrender xlibs.kbproto
+
+ gnome2.libart_lgpl gnome2.libbonobo gnome2.libbonoboui
+ gnome2.libgnome gnome2.libgnomecanvas gnome2.libgnomeui
+ gnome2.libIDL
+
+ pango
+
+ dbus dbus_glib
+
+ alsaLib libpulseaudio
+ gstreamer gst_plugins_base
+
+ gtk3 glib gobjectIntrospection
+
+ rustc cargo
+
+ # "mach vendor rust" wants to list modified files by using the vcs.
+ git mercurial
+
+ # needed for compiling cargo-vendor and its dependencies
+ openssl cmake
+
+ ] ++ optionals inNixShell [
+ valgrind gdb rr
+ ];
+
+ # Useful for debugging this Nix expression.
+ tracePhases = true;
+
+ configurePhase = ''
+ export MOZBUILD_STATE_PATH=$(pwd)/.mozbuild
+ export MOZ_CONFIG=$(pwd)/.mozconfig
+ export builddir=$(pwd)/builddir
+
+ mkdir -p $MOZBUILD_STATE_PATH $builddir
+ echo > $MOZ_CONFIG "
+ . $src/build/mozconfig.common
+
+ mk_add_options MOZ_OBJDIR=$builddir
+ mk_add_options AUTOCONF=${autoconf213}/bin/autoconf
+ ac_add_options --prefix=$out
+ ac_add_options --enable-application=browser
+ ac_add_options --enable-official-branding
+ export AUTOCONF=${autoconf213}/bin/autoconf
+ "
+ '';
+
+ AUTOCONF = "${autoconf213}/bin/autoconf";
+
+ buildPhase = ''
+ cd $builddir
+ $src/mach build
+ '';
+
+ installPhase = ''
+ cd $builddir
+ $src/mach install
+ '';
+
+ # TODO: are there tests we would like to run? or should we package them separately?
+ doCheck = false;
+ doInstallCheck = false;
+
+ shellHook = ''
+ export MOZBUILD_STATE_PATH=$PWD/.mozbuild
+ '';
+ passthru.updateScript = updateFromGitHub {
+ owner = "mozilla";
+ repo = "gecko-dev";
+ branch = "master";
+ path = "pkgs/gecko/source.json";
+ };
+}
diff --git a/nixpkgs-mozilla/pkgs/gecko/source.json b/nixpkgs-mozilla/pkgs/gecko/source.json
new file mode 100644
index 0000000..f2b2da3
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/gecko/source.json
@@ -0,0 +1,6 @@
+{
+ "owner": "mozilla",
+ "repo": "gecko-dev",
+ "rev": "fee636af734a0ce6dc7335691cc94664bafc385d",
+ "sha256": "0nnkqmglbi2znkz1avnyn064i5hngvsqrmhw8ccg6g4ga9bac8fv"
+}
diff --git a/nixpkgs-mozilla/pkgs/lib/default.nix b/nixpkgs-mozilla/pkgs/lib/default.nix
new file mode 100644
index 0000000..0557d1b
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/lib/default.nix
@@ -0,0 +1,7 @@
+{ pkgs }:
+
+let
+ update = import ./update.nix { inherit pkgs; };
+in
+ { inherit update; }
+ // update
diff --git a/nixpkgs-mozilla/pkgs/lib/update.nix b/nixpkgs-mozilla/pkgs/lib/update.nix
new file mode 100644
index 0000000..2b97a26
--- /dev/null
+++ b/nixpkgs-mozilla/pkgs/lib/update.nix
@@ -0,0 +1,50 @@
+{ pkgs }:
+
+let
+ inherit (pkgs) cacert nix jq curl gnused gnugrep coreutils;
+in {
+
+ updateFromGitHub = { owner, repo, path, branch }: ''
+ export SSL_CERT_FILE=${cacert}/etc/ssl/certs/ca-bundle.crt
+
+ github_rev() {
+ ${curl.bin}/bin/curl -sSf "https://api.github.com/repos/$1/$2/branches/$3" | \
+ ${jq}/bin/jq '.commit.sha' | \
+ ${gnused}/bin/sed 's/"//g'
+ }
+
+ github_sha256() {
+ ${nix}/bin/nix-prefetch-url \
+ --unpack \
+ --type sha256 \
+ "https://github.com/$1/$2/archive/$3.tar.gz" 2>&1 | \
+ tail -1
+ }
+
+ echo "=== ${owner}/${repo}@${branch} ==="
+
+ echo -n "Looking up latest revision ... "
+ rev=$(github_rev "${owner}" "${repo}" "${branch}");
+ echo "revision is \`$rev\`."
+
+ sha256=$(github_sha256 "${owner}" "${repo}" "$rev");
+ echo "sha256 is \`$sha256\`."
+
+ if [ "$sha256" == "" ]; then
+ echo "sha256 is not valid!"
+ exit 2
+ fi
+ source_file=${path}
+ echo "Content of source file (``$source_file``) written."
+ cat < {};
+ _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 {
+ 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
diff --git a/nixpkgs-mozilla/rust-overlay-install.sh b/nixpkgs-mozilla/rust-overlay-install.sh
new file mode 100755
index 0000000..fac41ae
--- /dev/null
+++ b/nixpkgs-mozilla/rust-overlay-install.sh
@@ -0,0 +1,12 @@
+#!/bin/sh -e
+
+cd "$(dirname "$0")" || exit
+
+overlay_dir=$HOME/.config/nixpkgs/overlays
+name=rust-overlay.nix
+
+echo Installing $name as an overlay
+
+set -x
+mkdir -p "$overlay_dir"
+ln -s "$PWD/$name" "$overlay_dir/$name"
diff --git a/nixpkgs-mozilla/rust-overlay.nix b/nixpkgs-mozilla/rust-overlay.nix
new file mode 100644
index 0000000..ddf38bc
--- /dev/null
+++ b/nixpkgs-mozilla/rust-overlay.nix
@@ -0,0 +1,276 @@
+# This file provide a Rust overlay, which provides pre-packaged bleeding edge versions of rustc
+# and cargo.
+self: super:
+
+let
+ fromTOML = (import ./lib/parseTOML.nix).fromTOML;
+
+ # See https://github.com/rust-lang-nursery/rustup.rs/blob/master/src/rustup-dist/src/dist.rs
+ defaultDistRoot = "https://static.rust-lang.org";
+ manifest_v1_url = {
+ dist_root ? defaultDistRoot + "/dist",
+ date ? null,
+ staging ? false,
+ # A channel can be "nightly", "beta", "stable", "\d{1}.\d{1}.\d{1}", or "\d{1}.\d{2\d{1}".
+ channel ? "nightly"
+ }:
+ if date == null && staging == false
+ then "${dist_root}/channel-rust-${channel}"
+ else if date != null && staging == false
+ then "${dist_root}/${date}/channel-rust-${channel}"
+ else if date == null && staging == true
+ then "${dist_root}/staging/channel-rust-${channel}"
+ else throw "not a real-world case";
+
+ manifest_v2_url = args: (manifest_v1_url args) + ".toml";
+
+ # Intersection of rustup-dist/src/dist.rs listed platforms and stdenv/default.nix.
+ hostTripleOf = system: { # switch
+ "i686-linux" = "i686-unknown-linux-gnu";
+ "x86_64-linux" = "x86_64-unknown-linux-gnu";
+ "armv5tel-linux" = "arm-unknown-linux-gnueabi";
+ "armv6l-linux" = "arm-unknown-linux-gnueabi";
+ "armv7l-linux" = "armv7-unknown-linux-gnueabihf";
+ "aarch64-linux" = "aarch64-unknown-linux-gnu";
+ "mips64el-linux" = "mips64el-unknown-linux-gnuabi64";
+ "x86_64-darwin" = "x86_64-apple-darwin";
+ "i686-cygwin" = "i686-pc-windows-gnu"; # or msvc?
+ "x86_64-cygwin" = "x86_64-pc-windows-gnu"; # or msvc?
+ "x86_64-freebsd" = "x86_64-unknown-freebsd";
+ }.${system} or (throw "Rust overlay does not support ${system} yet.");
+
+ getComponentsWithFixedPlatform = pkgs: pkgname: stdenv:
+ let
+ pkg = pkgs.${pkgname};
+ srcInfo = pkg.target.${hostTripleOf stdenv.system} or pkg.target."*";
+ components = srcInfo.components or [];
+ componentNamesList =
+ builtins.map (pkg: pkg.pkg) (builtins.filter (pkg: (pkg.target != "*")) components);
+ in
+ componentNamesList;
+
+ getExtensions = pkgs: pkgname: stdenv:
+ let
+ inherit (super.lib) unique;
+ pkg = pkgs.${pkgname};
+ srcInfo = pkg.target.${hostTripleOf stdenv.system} or pkg.target."*";
+ extensions = srcInfo.extensions or [];
+ extensionNamesList = unique (builtins.map (pkg: pkg.pkg) extensions);
+ in
+ extensionNamesList;
+
+ hasTarget = pkgs: pkgname: target:
+ pkgs ? ${pkgname}.target.${target};
+
+ getTuples = pkgs: name: targets:
+ builtins.map (target: { inherit name target; }) (builtins.filter (target: hasTarget pkgs name target) targets);
+
+ # In the manifest, a package might have different components which are bundled with it, as opposed as the extensions which can be added.
+ # By default, a package will include the components for the same architecture, and offers them as extensions for other architectures.
+ #
+ # This functions returns a list of { name, target } attribute sets, which includes the current system package, and all its components for the selected targets.
+ # The list contains the package for the pkgTargets as well as the packages for components for all compTargets
+ getTargetPkgTuples = pkgs: pkgname: pkgTargets: compTargets: stdenv:
+ let
+ inherit (builtins) elem;
+ inherit (super.lib) intersectLists;
+ components = getComponentsWithFixedPlatform pkgs pkgname stdenv;
+ extensions = getExtensions pkgs pkgname stdenv;
+ compExtIntersect = intersectLists components extensions;
+ tuples = (getTuples pkgs pkgname pkgTargets) ++ (builtins.map (name: getTuples pkgs name compTargets) compExtIntersect);
+ in
+ tuples;
+
+ getFetchUrl = pkgs: pkgname: target: stdenv: fetchurl:
+ let
+ pkg = pkgs.${pkgname};
+ srcInfo = pkg.target.${target};
+ in
+ (fetchurl { url = srcInfo.url; sha256 = srcInfo.hash; });
+
+ checkMissingExtensions = pkgs: pkgname: stdenv: extensions:
+ let
+ inherit (builtins) head;
+ inherit (super.lib) concatStringsSep subtractLists;
+ availableExtensions = getExtensions pkgs pkgname stdenv;
+ missingExtensions = subtractLists availableExtensions extensions;
+ extensionsToInstall =
+ if missingExtensions == [] then extensions else throw ''
+ While compiling ${pkgname}: the extension ${head missingExtensions} is not available.
+ Select extensions from the following list:
+ ${concatStringsSep "\n" availableExtensions}'';
+ in
+ extensionsToInstall;
+
+ getSrcs = pkgs: pkgname: targets: extensions: targetExtensions: stdenv: fetchurl:
+ let
+ inherit (builtins) head map;
+ inherit (super.lib) flatten remove subtractLists unique;
+ targetExtensionsToInstall = checkMissingExtensions pkgs pkgname stdenv targetExtensions;
+ extensionsToInstall = checkMissingExtensions pkgs pkgname stdenv extensions;
+ hostTargets = [ "*" (hostTripleOf stdenv.system)];
+ pkgTuples = flatten (getTargetPkgTuples pkgs pkgname hostTargets targets stdenv);
+ extensionTuples = flatten (map (name: getTargetPkgTuples pkgs name hostTargets targets stdenv) extensionsToInstall);
+ targetExtensionTuples = flatten (map (name: getTargetPkgTuples pkgs name targets targets stdenv) targetExtensionsToInstall);
+ pkgsTuples = pkgTuples ++ extensionTuples ++ targetExtensionTuples;
+ missingTargets = subtractLists (map (tuple: tuple.target) pkgsTuples) (remove "*" targets);
+ pkgsTuplesToInstall =
+ if missingTargets == [] then pkgsTuples else throw ''
+ While compiling ${pkgname}: the target ${head missingTargets} is not available for any package.'';
+ in
+ map (tuple: (getFetchUrl pkgs tuple.name tuple.target stdenv fetchurl)) pkgsTuplesToInstall;
+
+ # Manifest files are organized as follow:
+ # { date = "2017-03-03";
+ # pkg.cargo.version= "0.18.0-nightly (5db6d64 2017-03-03)";
+ # pkg.cargo.target.x86_64-unknown-linux-gnu = {
+ # available = true;
+ # hash = "abce..."; # sha256
+ # url = "https://static.rust-lang.org/dist/....tar.gz";
+ # };
+ # }
+ #
+ # The packages available usually are:
+ # cargo, rust-analysis, rust-docs, rust-src, rust-std, rustc, and
+ # rust, which aggregates them in one package.
+ #
+ # For each package the following options are available:
+ # extensions - The extensions that should be installed for the package.
+ # For example, install the package rust and add the extension rust-src.
+ # targets - The package will always be installed for the host system, but with this option
+ # extra targets can be specified, e.g. "mips-unknown-linux-musl". The target
+ # will only apply to components of the package that support being installed for
+ # a different architecture. For example, the rust package will install rust-std
+ # for the host system and the targets.
+ # targetExtensions - If you want to force extensions to be installed for the given targets, this is your option.
+ # All extensions in this list will be installed for the target architectures.
+ # *Attention* If you want to install an extension like rust-src, that has no fixed architecture (arch *),
+ # you will need to specify this extension in the extensions options or it will not be installed!
+ fromManifestFile = manifest: { stdenv, fetchurl, patchelf }:
+ let
+ inherit (builtins) elemAt;
+ inherit (super) makeOverridable;
+ inherit (super.lib) flip mapAttrs;
+ pkgs = fromTOML (builtins.readFile manifest);
+ in
+ flip mapAttrs pkgs.pkg (name: pkg:
+ makeOverridable ({extensions, targets, targetExtensions}:
+ let
+ version' = builtins.match "([^ ]*) [(]([^ ]*) ([^ ]*)[)]" pkg.version;
+ version = "${elemAt version' 0}-${elemAt version' 2}-${elemAt version' 1}";
+ srcs = getSrcs pkgs.pkg name targets extensions targetExtensions stdenv fetchurl;
+ in
+ stdenv.mkDerivation {
+ name = name + "-" + version;
+ inherit srcs;
+ sourceRoot = ".";
+ # (@nbp) TODO: Check on Windows and Mac.
+ # This code is inspired by patchelf/setup-hook.sh to iterate over all binaries.
+ installPhase = ''
+ for i in * ; do
+ if [ -d "$i" ]; then
+ cd $i
+ patchShebangs install.sh
+ CFG_DISABLE_LDCONFIG=1 ./install.sh --prefix=$out --verbose
+ cd ..
+ fi
+ done
+
+ setInterpreter() {
+ local dir="$1"
+ [ -e "$dir" ] || return 0
+
+ header "Patching interpreter of ELF executables and libraries in $dir"
+ local i
+ while IFS= read -r -d ''$'\0' i; do
+ if [[ "$i" =~ .build-id ]]; then continue; fi
+ if ! isELF "$i"; then continue; fi
+ echo "setting interpreter of $i"
+ patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" "$i" || true
+ done < <(find "$dir" -type f -print0)
+ }
+
+ setInterpreter $out
+ '';
+
+ postFixup = ''
+ # Function moves well-known files from etc/
+ handleEtc() {
+ local oldIFS="$IFS"
+
+ # Directories we are aware of, given as substitution lists
+ for paths in \
+ "etc/bash_completion.d","share/bash_completion/completions","etc/bash_completions.d","share/bash_completions/completions";
+ do
+ # Some directoties may be missing in some versions. If so we just skip them.
+ # See https://github.com/mozilla/nixpkgs-mozilla/issues/48 for more infomation.
+ if [ ! -e $paths ]; then continue; fi
+
+ IFS=","
+ set -- $paths
+ IFS="$oldIFS"
+
+ local orig_path="$1"
+ local wanted_path="$2"
+
+ # Rename the files
+ if [ -d ./"$orig_path" ]; then
+ mkdir -p "$(dirname ./"$wanted_path")"
+ fi
+ mv -v ./"$orig_path" ./"$wanted_path"
+
+ # Fail explicitly if etc is not empty so we can add it to the list and/or report it upstream
+ rmdir ./etc || {
+ echo Installer tries to install to /etc:
+ find ./etc
+ exit 1
+ }
+ done
+ }
+
+ if [ -d "$out"/etc ]; then
+ pushd "$out"
+ handleEtc
+ popd
+ fi
+ '';
+ }
+ ) { extensions = []; targets = []; targetExtensions = []; }
+ );
+
+ fromManifest = manifest: { stdenv, fetchurl, patchelf }:
+ fromManifestFile (builtins.fetchurl manifest) { inherit stdenv fetchurl patchelf; };
+
+in rec
+
+{
+ lib = super.lib // {
+ inherit fromTOML;
+ rustLib = {
+ inherit fromManifest fromManifestFile manifest_v2_url;
+ };
+ };
+
+ rustChannelOf = manifest_args: fromManifest
+ (manifest_v2_url manifest_args)
+ { inherit (self) stdenv fetchurl patchelf; }
+ ;
+
+ rustChannels = {
+ nightly = rustChannelOf { channel = "nightly"; };
+ beta = rustChannelOf { channel = "beta"; };
+ stable = rustChannelOf { channel = "stable"; };
+ };
+
+ # For each channel:
+ # rustChannels.nightly.cargo
+ # rustChannels.nightly.rust # Aggregate all others. (recommended)
+ # rustChannels.nightly.rustc
+ # rustChannels.nightly.rust-analysis
+ # rustChannels.nightly.rust-docs
+ # rustChannels.nightly.rust-src
+ # rustChannels.nightly.rust-std
+
+ # For a specific date:
+ # rustChannelOf { date = "2017-06-06"; channel = "beta"; }.rust
+}
diff --git a/nixpkgs-mozilla/update.nix b/nixpkgs-mozilla/update.nix
new file mode 100755
index 0000000..6ea2c03
--- /dev/null
+++ b/nixpkgs-mozilla/update.nix
@@ -0,0 +1,144 @@
+let
+ _pkgs = import {};
+ _nixpkgs = _pkgs.fetchFromGitHub (_pkgs.lib.importJSON ./pkgs/nixpkgs.json);
+in
+
+{ pkgs ? import _nixpkgs {}
+, package ? null
+, maintainer ? null
+, dont_prompt ? false
+}:
+
+# TODO: add assert statements
+
+let
+
+ pkgs-mozilla = import ./default.nix { inherit pkgs; };
+
+ dont_prompt_str = if dont_prompt then "yes" else "no";
+
+ packagesWith = cond: return: set:
+ pkgs.lib.flatten
+ (pkgs.lib.mapAttrsToList
+ (name: pkg:
+ let
+ result = builtins.tryEval (
+ if pkgs.lib.isDerivation pkg && cond name pkg
+ then [(return name pkg)]
+ else if pkg.recurseForDerivations or false || pkg.recurseForRelease or false
+ then packagesWith cond return pkg
+ else []
+ );
+ in
+ if result.success then result.value
+ else []
+ )
+ set
+ );
+
+ packagesWithUpdateScriptAndMaintainer = maintainer':
+ let
+ maintainer =
+ if ! builtins.hasAttr maintainer' pkgs.lib.maintainers then
+ builtins.throw "Maintainer with name `${maintainer'} does not exist in `lib/maintainers.nix`."
+ else
+ builtins.getAttr maintainer' pkgs.lib.maintainers;
+ in
+ packagesWith (name: pkg: builtins.hasAttr "updateScript" pkg &&
+ (if builtins.hasAttr "maintainers" pkg.meta
+ then (if builtins.isList pkg.meta.maintainers
+ then builtins.elem maintainer pkg.meta.maintainers
+ else maintainer == pkg.meta.maintainers
+ )
+ else false
+ )
+ )
+ (name: pkg: pkg)
+ pkgs-mozilla;
+
+ packageByName = name:
+ let
+ package = pkgs.lib.attrByPath (pkgs.lib.splitString "." name) null pkgs-mozilla;
+ in
+ if package == null then
+ builtins.throw "Package with an attribute name `${name}` does not exists."
+ else if ! builtins.hasAttr "updateScript" package then
+ builtins.throw "Package with an attribute name `${name}` does have an `passthru.updateScript` defined."
+ else
+ package;
+
+ packages =
+ if package != null then
+ [ (packageByName package) ]
+ else if maintainer != null then
+ packagesWithUpdateScriptAndMaintainer maintainer
+ else
+ builtins.throw "No arguments provided.\n\n${helpText}";
+
+ helpText = ''
+ Please run:
+
+ % nix-shell maintainers/scripts/update.nix --argstr maintainer garbas
+
+ to run all update scripts for all packages that lists \`garbas\` as a maintainer
+ and have \`updateScript\` defined, or:
+
+ % nix-shell maintainers/scripts/update.nix --argstr package garbas
+
+ to run update script for specific package.
+ '';
+
+ runUpdateScript = package: ''
+ echo -ne " - ${package.name}: UPDATING ..."\\r
+ ${package.updateScript} &> ${(builtins.parseDrvName package.name).name}.log
+ CODE=$?
+ if [ "$CODE" != "0" ]; then
+ echo " - ${package.name}: ERROR "
+ echo ""
+ echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
+ echo ""
+ cat ${(builtins.parseDrvName package.name).name}.log
+ echo ""
+ echo "--- SHOWING ERROR LOG FOR ${package.name} ----------------------"
+ exit $CODE
+ else
+ rm ${(builtins.parseDrvName package.name).name}.log
+ fi
+ echo " - ${package.name}: DONE. "
+ '';
+
+in pkgs.stdenv.mkDerivation {
+ name = "nixpkgs-mozilla-update-script";
+ buildCommand = ''
+ echo ""
+ echo "----------------------------------------------------------------"
+ echo ""
+ echo "Not possible to update packages using \`nix-build\`"
+ echo ""
+ echo "${helpText}"
+ echo "----------------------------------------------------------------"
+ exit 1
+ '';
+ shellHook = ''
+ echo ""
+ echo "Going to be running update for following packages:"
+ echo "${builtins.concatStringsSep "\n" (map (x: " - ${x.name}") packages)}"
+ echo ""
+ if [ "${dont_prompt_str}" = "no" ]; then
+ read -n1 -r -p "Press space to continue..." confirm
+ else
+ confirm=""
+ fi
+ if [ "$confirm" = "" ]; then
+ echo ""
+ echo "Running update for:"
+ ${builtins.concatStringsSep "\n" (map runUpdateScript packages)}
+ echo ""
+ echo "Packages updated!"
+ exit 0
+ else
+ echo "Aborting!"
+ exit 1
+ fi
+ '';
+}