diff --git a/pkgs/applications/science/electronics/ghdl/default.nix b/pkgs/applications/science/electronics/ghdl/default.nix new file mode 100644 index 000000000000..7451c3f07243 --- /dev/null +++ b/pkgs/applications/science/electronics/ghdl/default.nix @@ -0,0 +1,18 @@ +{stdenv, fetchurl, gnat}: +stdenv.mkDerivation rec { + name = "ghdl-0.28"; + + src = fetchurl { + url = "http://ghdl.free.fr/${name}.tar.bz2"; + sha256 = "0l3ah3zw2yhr9rv9d5ck1cinsf11r28m6bzl2sdibngl2bgc2jsf"; + }; + + buildInputs = [ gnat ]; + + meta = { + description = "Complete VHDL simulator, using the GCC technology"; + homepage = http://ghdl.free.fr/; + # There is a mixture of licenses per file + license = "free"; + }; +} diff --git a/pkgs/build-support/gnat-wrapper/add-flags b/pkgs/build-support/gnat-wrapper/add-flags new file mode 100644 index 000000000000..26e536f6d575 --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/add-flags @@ -0,0 +1,28 @@ +# `-B@out@/bin' forces gcc to use ld-wrapper.sh when calling ld. +export NIX_CFLAGS_COMPILE="-B@out@/bin/ $NIX_CFLAGS_COMPILE" + +if test -e @out@/nix-support/libc-cflags; then + export NIX_CFLAGS_COMPILE="$(cat @out@/nix-support/libc-cflags) $NIX_CFLAGS_COMPILE" +fi + +if test -e @out@/nix-support/gcc-cflags; then + export NIX_CFLAGS_COMPILE="$(cat @out@/nix-support/gcc-cflags) $NIX_CFLAGS_COMPILE" +fi + +if test -e @out@/nix-support/gnat-cflags; then + export NIX_GNATFLAGS_COMPILE="$(cat @out@/nix-support/gnat-cflags) $NIX_GNATFLAGS_COMPILE" +fi + +if test -e @out@/nix-support/libc-ldflags; then + export NIX_LDFLAGS="$NIX_LDFLAGS $(cat @out@/nix-support/libc-ldflags)" +fi + +if test -e @out@/nix-support/gcc-ldflags; then + export NIX_LDFLAGS="$NIX_LDFLAGS $(cat @out@/nix-support/gcc-ldflags)" +fi + +if test -e @out@/nix-support/libc-ldflags-before; then + export NIX_LDFLAGS_BEFORE="$(cat @out@/nix-support/libc-ldflags-before) $NIX_LDFLAGS_BEFORE" +fi + +export NIX_GCC_WRAPPER_FLAGS_SET=1 diff --git a/pkgs/build-support/gnat-wrapper/builder.sh b/pkgs/build-support/gnat-wrapper/builder.sh new file mode 100644 index 000000000000..9befd517439d --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/builder.sh @@ -0,0 +1,180 @@ +source $stdenv/setup + + +ensureDir $out/bin +ensureDir $out/nix-support + + +if test -z "$nativeLibc"; then + dynamicLinker="$libc/lib/$dynamicLinker" + echo $dynamicLinker > $out/nix-support/dynamic-linker + + if test -e $libc/lib/32/ld-linux.so.2; then + echo $libc/lib/32/ld-linux.so.2 > $out/nix-support/dynamic-linker-m32 + fi + + # The "-B$libc/lib/" flag is a quick hack to force gcc to link + # against the crt1.o from our own glibc, rather than the one in + # /usr/lib. (This is only an issue when using an `impure' + # compiler/linker, i.e., one that searches /usr/lib and so on.) + # + # Unfortunately, setting -B appears to override the default search + # path. Thus, the gcc-specific "../includes-fixed" directory is + # now longer searched and glibc's header fails to + # compile, because it uses "#include_next " to find the + # limits.h file in ../includes-fixed. To remedy the problem, + # another -idirafter is necessary to add that directory again. + echo "-B$libc/lib/ -idirafter $libc/include -idirafter $gcc/lib/gcc/*/*/include-fixed" > $out/nix-support/libc-cflags + + echo "-L$libc/lib" > $out/nix-support/libc-ldflags + + # The dynamic linker is passed in `ldflagsBefore' to allow + # explicit overrides of the dynamic linker by callers to gcc/ld + # (the *last* value counts, so ours should come first). + echo "-dynamic-linker $dynamicLinker" > $out/nix-support/libc-ldflags-before +fi + +if test -n "$nativeTools"; then + gccPath="$nativePrefix/bin" + ldPath="$nativePrefix/bin" +else + if test -e "$gcc/lib64"; then + gccLDFlags="$gccLDFlags -L$gcc/lib64" + fi + gccLDFlags="$gccLDFlags -L$gcc/lib" + echo "$gccLDFlags" > $out/nix-support/gcc-ldflags + + # GCC shows $gcc/lib in `gcc -print-search-dirs', but not + # $gcc/lib64 (even though it does actually search there...).. + # This confuses libtool. So add it to the compiler tool search + # path explicitly. + if test -e "$gcc/lib64"; then + gccCFlags="$gccCFlags -B$gcc/lib64" + fi + gccCFlags="$gccCFlags -B$gcc/lib/gnatgcc/x86_64-pc-linux-gnu/4.1/ -I$gcc/lib/gnatgcc/x86_64-pc-linux-gnu/4.1/adainclude" + echo "$gccCFlags" > $out/nix-support/gcc-cflags + + gnatCFlags="-aI$gcc/lib/gnatgcc/x86_64-pc-linux-gnu/4.1/adainclude -aO$gcc/lib/gnatgcc/x86_64-pc-linux-gnu/4.1/adalib" + echo "$gnatCFlags" > $out/nix-support/gnat-cflags + + gccPath="$gcc/bin" + ldPath="$binutils/bin" +fi + + +doSubstitute() { + local src=$1 + local dst=$2 + # Can't use substitute() here, because replace may not have been + # built yet (in the bootstrap). + sed \ + -e "s^@out@^$out^g" \ + -e "s^@shell@^$shell^g" \ + -e "s^@gcc@^$gcc^g" \ + -e "s^@gccProg@^$gccProg^g" \ + -e "s^@gnatProg@^$gnatProg^g" \ + -e "s^@gnatlinkProg@^$gnatlinkProg^g" \ + -e "s^@binutils@^$binutils^g" \ + -e "s^@coreutils@^$coreutils^g" \ + -e "s^@libc@^$libc^g" \ + -e "s^@ld@^$ldPath/ld^g" \ + < "$src" > "$dst" +} + + +# Make wrapper scripts around gcc, g++, and gfortran. Also make symlinks +# cc, c++, and f77. +mkGccWrapper() { + local dst=$1 + local src=$2 + + if ! test -f "$src"; then + echo "$src does not exist (skipping)" + return 1 + fi + + gccProg="$src" + doSubstitute "$gccWrapper" "$dst" + chmod +x "$dst" +} + +mkGnatWrapper() { + local dst=$1 + local src=$2 + + if ! test -f "$src"; then + echo "$src does not exist (skipping)" + return 1 + fi + + gnatProg="$src" + doSubstitute "$gnatWrapper" "$dst" + chmod +x "$dst" +} + +mkGnatLinkWrapper() { + local dst=$1 + local src=$2 + + if ! test -f "$src"; then + echo "$src does not exist (skipping)" + return 1 + fi + + gnatlinkProg="$src" + doSubstitute "$gnatlinkWrapper" "$dst" + chmod +x "$dst" +} + +if mkGccWrapper $out/bin/gcc $gccPath/gcc +then + ln -sv gcc $out/bin/cc +fi + +if mkGccWrapper $out/bin/g++ $gccPath/g++ +then + ln -sv g++ $out/bin/c++ +fi + +if mkGccWrapper $out/bin/gfortran $gccPath/gfortran +then + ln -sv gfortran $out/bin/g77 + ln -sv gfortran $out/bin/f77 +fi + +mkGccWrapper $out/bin/gcj $gccPath/gcj || true + +mkGccWrapper $out/bin/gnatgcc $gccPath/gnatgcc || true +mkGnatWrapper $out/bin/gnatmake $gccPath/gnatmake || true +mkGnatWrapper $out/bin/gnatbind $gccPath/gnatbind || true +mkGnatLinkWrapper $out/bin/gnatlink $gccPath/gnatlink || true + +# Create a symlink to as (the assembler). This is useful when a +# gcc-wrapper is installed in a user environment, as it ensures that +# the right assembler is called. +ln -s $ldPath/as $out/bin/as + + +# Make a wrapper around the linker. +doSubstitute "$ldWrapper" "$out/bin/ld" +chmod +x "$out/bin/ld" + + +# Emit a setup hook. Also store the path to the original GCC and +# Glibc. +test -n "$gcc" && echo $gcc > $out/nix-support/orig-gcc +test -n "$libc" && echo $libc > $out/nix-support/orig-libc + +doSubstitute "$addFlags" "$out/nix-support/add-flags.sh" + +doSubstitute "$setupHook" "$out/nix-support/setup-hook" + +cp -p $utils $out/nix-support/utils.sh + + +# Propagate the wrapped gcc so that if you install the wrapper, you get +# tools like gcov, the manpages, etc. as well (including for binutils +# and Glibc). +if test -z "$nativeTools"; then + echo $gcc $binutils $libc > $out/nix-support/propagated-user-env-packages +fi diff --git a/pkgs/build-support/gnat-wrapper/default.nix b/pkgs/build-support/gnat-wrapper/default.nix new file mode 100644 index 000000000000..700de9d20f49 --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/default.nix @@ -0,0 +1,66 @@ +# The Nix `gcc' stdenv.mkDerivation is not directly usable, since it doesn't +# know where the C library and standard header files are. Therefore +# the compiler produced by that package cannot be installed directly +# in a user environment and used from the command line. This +# stdenv.mkDerivation provides a wrapper that sets up the right environment +# variables so that the compiler and the linker just "work". + +{ name ? "", stdenv, nativeTools, nativeLibc, nativePrefix ? "" +, gcc ? null, libc ? null, binutils ? null, coreutils ? null, shell ? "" +}: + +assert nativeTools -> nativePrefix != ""; +assert !nativeTools -> gcc != null && binutils != null && coreutils != null; +assert !nativeLibc -> libc != null; + +let + + gccVersion = (builtins.parseDrvName gcc.name).version; + gccName = (builtins.parseDrvName gcc.name).name; + +in + +stdenv.mkDerivation { + name = + (if name != "" then name else gccName + "-wrapper") + + (if gcc != null && gccVersion != "" then "-" + gccVersion else ""); + + builder = ./builder.sh; + setupHook = ./setup-hook.sh; + gccWrapper = ./gcc-wrapper.sh; + gnatWrapper = ./gnat-wrapper.sh; + gnatlinkWrapper = ./gnatlink-wrapper.sh; + ldWrapper = ./ld-wrapper.sh; + utils = ./utils.sh; + addFlags = ./add-flags; + + inherit nativeTools nativeLibc nativePrefix gcc; + libc = if nativeLibc then null else libc; + binutils = if nativeTools then null else binutils; + # The wrapper scripts use 'cat', so we may need coreutils + coreutils = if nativeTools then null else coreutils; + + langC = if nativeTools then true else gcc.langC; + langCC = if nativeTools then true else gcc.langCC; + langFortran = if nativeTools then false else gcc ? langFortran; + langAda = if nativeTools then false else gcc ? langAda; + shell = if shell == "" then stdenv.shell else shell; + + meta = + let gcc_ = if gcc != null then gcc else {}; in + (if gcc_ ? meta then removeAttrs gcc.meta ["priority"] else {}) // + { description = + stdenv.lib.attrByPath ["meta" "description"] "System C compiler" gcc_ + + " (wrapper script)"; + }; + + # The dynamic linker has different names on different Linux platforms. + dynamicLinker = + if !nativeLibc then + (if stdenv.system == "i686-linux" then "ld-linux.so.2" else + if stdenv.system == "x86_64-linux" then "ld-linux-x86-64.so.2" else + if stdenv.system == "armv5tel-linux" then "ld-linux.so.3" else + if stdenv.system == "powerpc-linux" then "ld.so.1" else + abort "don't know the name of the dynamic linker for this platform") + else ""; +} diff --git a/pkgs/build-support/gnat-wrapper/gcc-wrapper.sh b/pkgs/build-support/gnat-wrapper/gcc-wrapper.sh new file mode 100644 index 000000000000..8a49fcb9b06e --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/gcc-wrapper.sh @@ -0,0 +1,148 @@ +#! @shell@ -e + +if test -n "$NIX_GCC_WRAPPER_START_HOOK"; then + source "$NIX_GCC_WRAPPER_START_HOOK" +fi + +if test -z "$NIX_GCC_WRAPPER_FLAGS_SET"; then + source @out@/nix-support/add-flags.sh +fi + +source @out@/nix-support/utils.sh + + +# Figure out if linker flags should be passed. GCC prints annoying +# warnings when they are not needed. +dontLink=0 +getVersion=0 +nonFlagArgs=0 + +for i in "$@"; do + if test "$i" = "-c"; then + dontLink=1 + elif test "$i" = "-S"; then + dontLink=1 + elif test "$i" = "-E"; then + dontLink=1 + elif test "$i" = "-E"; then + dontLink=1 + elif test "$i" = "-M"; then + dontLink=1 + elif test "$i" = "-MM"; then + dontLink=1 + elif test "${i:0:1}" != "-"; then + nonFlagArgs=1 + elif test "$i" = "-m32"; then + if test -e @out@/nix-support/dynamic-linker-m32; then + NIX_LDFLAGS="$NIX_LDFLAGS -dynamic-linker $(cat @out@/nix-support/dynamic-linker-m32)" + fi + fi +done + +# If we pass a flag like -Wl, then gcc will call the linker unless it +# can figure out that it has to do something else (e.g., because of a +# "-c" flag). So if no non-flag arguments are given, don't pass any +# linker flags. This catches cases like "gcc" (should just print +# "gcc: no input files") and "gcc -v" (should print the version). +if test "$nonFlagArgs" = "0"; then + dontLink=1 +fi + + +# Optionally filter out paths not refering to the store. +params=("$@") +if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE"; then + rest=() + n=0 + while test $n -lt ${#params[*]}; do + p=${params[n]} + p2=${params[$((n+1))]} + if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then + skip $p + elif test "$p" = "-L" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + elif test "${p:0:3}" = "-I/" && badPath "${p:2}"; then + skip $p + elif test "$p" = "-I" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + elif test "$p" = "-isystem" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + else + rest=("${rest[@]}" "$p") + fi + n=$((n + 1)) + done + params=("${rest[@]}") +fi + + +# Add the flags for the C compiler proper. +extraAfter=($NIX_CFLAGS_COMPILE) +extraBefore=() + +if test "$dontLink" != "1"; then + + # Add the flags that should only be passed to the compiler when + # linking. + extraAfter=(${extraAfter[@]} $NIX_CFLAGS_LINK) + + # Add the flags that should be passed to the linker (and prevent + # `ld-wrapper' from adding NIX_LDFLAGS again). + for i in $NIX_LDFLAGS_BEFORE; do + extraBefore=(${extraBefore[@]} "-Wl,$i") + done + for i in $NIX_LDFLAGS; do + if test "${i:0:3}" = "-L/"; then + extraAfter=(${extraAfter[@]} "$i") + else + extraAfter=(${extraAfter[@]} "-Wl,$i") + fi + done + export NIX_LDFLAGS_SET=1 + + if test "$NIX_STRIP_DEBUG" = "1"; then + # Add executable-stripping flags. + extraAfter=(${extraAfter[@]} $NIX_CFLAGS_STRIP) + fi +fi + +# As a very special hack, if the arguments are just `-v', then don't +# add anything. This is to prevent `gcc -v' (which normally prints +# out the version number and returns exit code 0) from printing out +# `No input files specified' and returning exit code 1. +if test "$*" = "-v"; then + extraAfter=() + extraBefore=() +fi + +# Optionally print debug info. +if test "$NIX_DEBUG" = "1"; then + echo "original flags to @gccProg@:" >&2 + for i in "${params[@]}"; do + echo " $i" >&2 + done + echo "extraBefore flags to @gccProg@:" >&2 + for i in ${extraBefore[@]}; do + echo " $i" >&2 + done + echo "extraAfter flags to @gccProg@:" >&2 + for i in ${extraAfter[@]}; do + echo " $i" >&2 + done +fi + +if test -n "$NIX_GCC_WRAPPER_EXEC_HOOK"; then + source "$NIX_GCC_WRAPPER_EXEC_HOOK" +fi + + +# Call the real `gcc'. Filter out warnings from stderr about unused +# `-B' flags, since they confuse some programs. Deep bash magic to +# apply grep to stderr (by swapping stdin/stderr twice). +if test -z "$NIX_GCC_NEEDS_GREP"; then + @gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} +else + (@gccProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} 3>&2 2>&1 1>&3- \ + | (grep -v 'file path prefix' || true); exit ${PIPESTATUS[0]}) 3>&2 2>&1 1>&3- + exit $? +fi diff --git a/pkgs/build-support/gnat-wrapper/gnat-wrapper.sh b/pkgs/build-support/gnat-wrapper/gnat-wrapper.sh new file mode 100644 index 000000000000..f6fa4b18400a --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/gnat-wrapper.sh @@ -0,0 +1,113 @@ +#! @shell@ -e + +if test -n "$NIX_GNAT_WRAPPER_START_HOOK"; then + source "$NIX_GNAT_WRAPPER_START_HOOK" +fi + +if test -z "$NIX_GNAT_WRAPPER_FLAGS_SET"; then + source @out@/nix-support/add-flags.sh +fi + +source @out@/nix-support/utils.sh + + +# Figure out if linker flags should be passed. GCC prints annoying +# warnings when they are not needed. +dontLink=0 +getVersion=0 +nonFlagArgs=0 + +for i in "$@"; do + if test "$i" = "-c"; then + dontLink=1 + elif test "$i" = "-M"; then + dontLink=1 + elif test "${i:0:1}" != "-"; then + nonFlagArgs=1 + elif test "$i" = "-m32"; then + if test -e @out@/nix-support/dynamic-linker-m32; then + NIX_LDFLAGS="$NIX_LDFLAGS -dynamic-linker $(cat @out@/nix-support/dynamic-linker-m32)" + fi + fi +done + +# If we pass a flag like -Wl, then gcc will call the linker unless it +# can figure out that it has to do something else (e.g., because of a +# "-c" flag). So if no non-flag arguments are given, don't pass any +# linker flags. This catches cases like "gcc" (should just print +# "gcc: no input files") and "gcc -v" (should print the version). +if test "$nonFlagArgs" = "0"; then + dontLink=1 +fi + + +# Optionally filter out paths not refering to the store. +params=("$@") +if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE"; then + rest=() + n=0 + while test $n -lt ${#params[*]}; do + p=${params[n]} + p2=${params[$((n+1))]} + if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then + skip $p + elif test "${p:0:3}" = "-I/" && badPath "${p:2}"; then + skip $p + elif test "${p:0:4}" = "-aI/" && badPath "${p:3}"; then + skip $p + elif test "${p:0:4}" = "-aO/" && badPath "${p:3}"; then + skip $p + else + rest=("${rest[@]}" "$p") + fi + n=$((n + 1)) + done + params=("${rest[@]}") +fi + + +# Add the flags for the GNAT compiler proper. +extraAfter=($NIX_GNATFLAGS_COMPILE) +extraBefore=() + +if [ "`basename $0`x" = "gnatmakex" ]; then + extraBefore=("--GNATBIND=@out@/bin/gnatbind --GNATLINK=@out@/bin/gnatlink ") +fi + +# Add the flags that should be passed to the linker (and prevent +# `ld-wrapper' from adding NIX_LDFLAGS again). +#for i in $NIX_LDFLAGS_BEFORE; do +# extraBefore=(${extraBefore[@]} "-largs $i") +#done + +# Optionally print debug info. +if test "$NIX_DEBUG" = "1"; then + echo "original flags to @gnatProg@:" >&2 + for i in "${params[@]}"; do + echo " $i" >&2 + done + echo "extraBefore flags to @gnatProg@:" >&2 + for i in ${extraBefore[@]}; do + echo " $i" >&2 + done + echo "extraAfter flags to @gnatProg@:" >&2 + for i in ${extraAfter[@]}; do + echo " $i" >&2 + done +fi + +if test -n "$NIX_GNAT_WRAPPER_EXEC_HOOK"; then + source "$NIX_GNAT_WRAPPER_EXEC_HOOK" +fi + + +# Call the real `gcc'. Filter out warnings from stderr about unused +# `-B' flags, since they confuse some programs. Deep bash magic to +# apply grep to stderr (by swapping stdin/stderr twice). +if test -z "$NIX_GNAT_NEEDS_GREP"; then + @gnatProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} +else + (@gnatProg@ ${extraBefore[@]} "${params[@]}" ${extraAfter[@]} 3>&2 2>&1 1>&3- \ + | (grep -v 'file path prefix' || true); exit ${PIPESTATUS[0]}) 3>&2 2>&1 1>&3- + exit $? +fi diff --git a/pkgs/build-support/gnat-wrapper/gnatlink-wrapper.sh b/pkgs/build-support/gnat-wrapper/gnatlink-wrapper.sh new file mode 100644 index 000000000000..850ba0f83480 --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/gnatlink-wrapper.sh @@ -0,0 +1,43 @@ +#! @shell@ -e + +# Add the flags for the GNAT compiler proper. +extraAfter="--GCC=@out@/bin/gnatgcc" +extraBefore=() + +# Add the flags that should be passed to the linker (and prevent +# `ld-wrapper' from adding NIX_LDFLAGS again). +#for i in $NIX_LDFLAGS_BEFORE; do +# extraBefore=(${extraBefore[@]} "-largs $i") +#done + +# Optionally print debug info. +if test "$NIX_DEBUG" = "1"; then + echo "original flags to @gnatlinkProg@:" >&2 + for i in "$@"; do + echo " $i" >&2 + done + echo "extraBefore flags to @gnatlinkProg@:" >&2 + for i in ${extraBefore[@]}; do + echo " $i" >&2 + done + echo "extraAfter flags to @gnatlinkProg@:" >&2 + for i in ${extraAfter[@]}; do + echo " $i" >&2 + done +fi + +if test -n "$NIX_GNAT_WRAPPER_EXEC_HOOK"; then + source "$NIX_GNAT_WRAPPER_EXEC_HOOK" +fi + + +# Call the real `gcc'. Filter out warnings from stderr about unused +# `-B' flags, since they confuse some programs. Deep bash magic to +# apply grep to stderr (by swapping stdin/stderr twice). +if test -z "$NIX_GNAT_NEEDS_GREP"; then + @gnatlinkProg@ ${extraBefore[@]} "$@" ${extraAfter[@]} +else + (@gnatlinkProg@ ${extraBefore[@]} "$@" ${extraAfter[@]} 3>&2 2>&1 1>&3- \ + | (grep -v 'file path prefix' || true); exit ${PIPESTATUS[0]}) 3>&2 2>&1 1>&3- + exit $? +fi diff --git a/pkgs/build-support/gnat-wrapper/ld-wrapper.sh b/pkgs/build-support/gnat-wrapper/ld-wrapper.sh new file mode 100644 index 000000000000..bf3c2620f29e --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/ld-wrapper.sh @@ -0,0 +1,155 @@ +#! @shell@ -e + +if test -n "$NIX_LD_WRAPPER_START_HOOK"; then + source "$NIX_LD_WRAPPER_START_HOOK" +fi + +if test -z "$NIX_GCC_WRAPPER_FLAGS_SET"; then + source @out@/nix-support/add-flags.sh +fi + +source @out@/nix-support/utils.sh + + +# Optionally filter out paths not refering to the store. +params=("$@") +if test "$NIX_ENFORCE_PURITY" = "1" -a -n "$NIX_STORE" \ + -a \( -z "$NIX_IGNORE_LD_THROUGH_GCC" -o -z "$NIX_LDFLAGS_SET" \); then + rest=() + n=0 + while test $n -lt ${#params[*]}; do + p=${params[n]} + p2=${params[$((n+1))]} + if test "${p:0:3}" = "-L/" && badPath "${p:2}"; then + skip $p + elif test "$p" = "-L" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + elif test "$p" = "-rpath" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + elif test "$p" = "-dynamic-linker" && badPath "$p2"; then + n=$((n + 1)); skip $p2 + elif test "${p:0:1}" = "/" && badPath "$p"; then + # We cannot skip this; barf. + echo "impure path \`$p' used in link" >&2 + exit 1 + else + rest=("${rest[@]}" "$p") + fi + n=$((n + 1)) + done + params=("${rest[@]}") +fi + + +extra=() +extraBefore=() + +if test -z "$NIX_LDFLAGS_SET"; then + extra=(${extra[@]} $NIX_LDFLAGS) + extraBefore=(${extraBefore[@]} $NIX_LDFLAGS_BEFORE) +fi + + +# Add all used dynamic libraries to the rpath. +if test "$NIX_DONT_SET_RPATH" != "1"; then + + # First, find all -L... switches. + allParams=("${params[@]}" ${extra[@]}) + libPath="" + addToLibPath() { + local path="$1" + if test "${path:0:1}" != "/"; then return 0; fi + case "$path" in + *..*|*./*|*/.*|*//*) + local path2 + if path2=$(readlink -f "$path"); then + path="$path2" + fi + ;; + esac + case $libPath in + *\ $path\ *) return 0 ;; + esac + libPath="$libPath $path " + } + n=0 + while test $n -lt ${#allParams[*]}; do + p=${allParams[n]} + p2=${allParams[$((n+1))]} + if test "${p:0:3}" = "-L/"; then + addToLibPath ${p:2} + elif test "$p" = "-L"; then + addToLibPath ${p2} + n=$((n + 1)) + elif $(echo "$p" | grep -q '^[^-].*\.so\($\|\.\)'); then + path="$(dirname "$p")"; + addToLibPath "${path}" + fi + n=$((n + 1)) + done + + # Second, for each directory in the library search path (-L...), + # see if it contains a dynamic library used by a -l... flag. If + # so, add the directory to the rpath. + rpath="" + + addToRPath() { + # If the path is not in the store, don't add it to the rpath. + # This typically happens for libraries in /tmp that are later + # copied to $out/lib. If not, we're screwed. + if test "${1:0:${#NIX_STORE}}" != "$NIX_STORE"; then return 0; fi + case $rpath in + *\ $1\ *) return 0 ;; + esac + rpath="$rpath $1 " + } + + for i in $libPath; do + n=0 + while test $n -lt ${#allParams[*]}; do + p=${allParams[n]} + p2=${allParams[$((n+1))]} + if test "${p:0:2}" = "-l" -a -f "$i/lib${p:2}.so"; then + addToRPath $i + break + elif test "$p" = "-l" -a -f "$i/lib${p2}"; then + # I haven't seen `-l foo', but you never know... + addToRPath $i + break + elif $(echo "$p" | grep -q '^[^-].*\.so\($\|\.\)'); then + path="$(dirname "$p")"; + if test "$path" == "$i"; then + addToRPath $i + break; + fi + fi + n=$((n + 1)) + done + + done + + + # Finally, add `-rpath' switches. + for i in $rpath; do + extra=(${extra[@]} -rpath $i) + done +fi + + +# Optionally print debug info. +if test "$NIX_DEBUG" = "1"; then + echo "original flags to @ld@:" >&2 + for i in "${params[@]}"; do + echo " $i" >&2 + done + echo "extra flags to @ld@:" >&2 + for i in ${extra[@]}; do + echo " $i" >&2 + done +fi + +if test -n "$NIX_LD_WRAPPER_EXEC_HOOK"; then + source "$NIX_LD_WRAPPER_EXEC_HOOK" +fi + +exec @ld@ ${extraBefore[@]} "${params[@]}" ${extra[@]} diff --git a/pkgs/build-support/gnat-wrapper/setup-hook.sh b/pkgs/build-support/gnat-wrapper/setup-hook.sh new file mode 100644 index 000000000000..513ab8053a7e --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/setup-hook.sh @@ -0,0 +1,33 @@ +addCVars () { + if test -d $1/include; then + export NIX_CFLAGS_COMPILE="$NIX_CFLAGS_COMPILE -I$1/include" + fi + + if test -d $1/lib64; then + export NIX_LDFLAGS="$NIX_LDFLAGS -L$1/lib64" + fi + + if test -d $1/lib; then + export NIX_LDFLAGS="$NIX_LDFLAGS -L$1/lib" + fi +} + +envHooks=(${envHooks[@]} addCVars) + +# Note: these come *after* $out in the PATH (see setup.sh). + +if test -n "@gcc@"; then + addToSearchPath PATH @gcc@/bin +fi + +if test -n "@binutils@"; then + addToSearchPath PATH @binutils@/bin +fi + +if test -n "@libc@"; then + addToSearchPath PATH @libc@/bin +fi + +if test -n "@coreutils@"; then + addToSearchPath PATH @coreutils@/bin +fi diff --git a/pkgs/build-support/gnat-wrapper/utils.sh b/pkgs/build-support/gnat-wrapper/utils.sh new file mode 100644 index 000000000000..9a664e1d1e6b --- /dev/null +++ b/pkgs/build-support/gnat-wrapper/utils.sh @@ -0,0 +1,23 @@ +skip () { + if test "$NIX_DEBUG" = "1"; then + echo "skipping impure path $1" >&2 + fi +} + + +# Checks whether a path is impure. E.g., `/lib/foo.so' is impure, but +# `/nix/store/.../lib/foo.so' isn't. +badPath() { + local p=$1 + + # Relative paths are okay (since they're presumably relative to + # the temporary build directory). + if test "${p:0:1}" != "/"; then return 1; fi + + # Otherwise, the path should refer to the store or some temporary + # directory (including the build directory). + test \ + "${p:0:${#NIX_STORE}}" != "$NIX_STORE" -a \ + "${p:0:4}" != "/tmp" -a \ + "${p:0:${#NIX_BUILD_TOP}}" != "$NIX_BUILD_TOP" +} diff --git a/pkgs/development/compilers/gcc-4.4/default.nix b/pkgs/development/compilers/gcc-4.4/default.nix index fef453e44931..26140ab6ae23 100644 --- a/pkgs/development/compilers/gcc-4.4/default.nix +++ b/pkgs/development/compilers/gcc-4.4/default.nix @@ -1,6 +1,7 @@ { stdenv, fetchurl, noSysDirs , langC ? true, langCC ? true, langFortran ? false, langTreelang ? false , langJava ? false +, langAda ? false , profiledCompiler ? false , staticCompiler ? false , enableShared ? true @@ -13,6 +14,7 @@ , libX11 ? null, libXt ? null, libSM ? null, libICE ? null, libXtst ? null , libXrender ? null, xproto ? null, renderproto ? null, xextproto ? null , libXrandr ? null, libXi ? null, inputproto ? null, randrproto ? null +, gnatboot ? null , enableMultilib ? false , name ? "gcc" , cross ? null @@ -24,6 +26,7 @@ assert langTreelang -> bison != null && flex != null; assert langJava -> zip != null && unzip != null && zlib != null && boehmgc != null; +assert langAda -> gnatboot != null; with stdenv.lib; @@ -83,7 +86,7 @@ stdenv.mkDerivation ({ src = (import ./sources.nix) { inherit fetchurl optional version; - inherit langC langCC langFortran langJava; + inherit langC langCC langFortran langJava langAda; }; patches = @@ -97,7 +100,10 @@ stdenv.mkDerivation ({ # (fixed in gcc 4.4.3) bad mixture of build/target flags ./libstdc++-target.patch ] - ++ optional noSysDirs ./no-sys-dirs.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; inherit noSysDirs profiledCompiler staticCompiler langJava crossStageStatic libcCross; @@ -111,6 +117,7 @@ stdenv.mkDerivation ({ ++ (optionals langJava [zip unzip]) ++ (optionals javaAwtGtk [gtk pkgconfig libart_lgpl] ++ xlibs) ++ (optionals (cross != null) [binutilsCross]) + ++ (optionals langAda [gnatboot]) ; configureFlags = " @@ -133,9 +140,11 @@ stdenv.mkDerivation ({ ++ optional langFortran "fortran" ++ optional langJava "java" ++ optional langTreelang "treelang" + ++ optional langAda "ada" ) ) } + ${if langAda then " --enable-libada" else ""} ${if stdenv.isi686 then "--with-arch=i686" else ""} ${if cross != null then crossConfigureFlags else ""} "; @@ -169,7 +178,7 @@ stdenv.mkDerivation ({ ++ optionals javaAwtGtk [ gmp mpfr ]))); - passthru = { inherit langC langCC langFortran langTreelang enableMultilib; }; + passthru = { inherit langC langCC langAda langFortran langTreelang enableMultilib; }; meta = { homepage = http://gcc.gnu.org/; diff --git a/pkgs/development/compilers/gcc-4.4/sources.nix b/pkgs/development/compilers/gcc-4.4/sources.nix index 54cf14749bfd..6da3d48e941c 100644 --- a/pkgs/development/compilers/gcc-4.4/sources.nix +++ b/pkgs/development/compilers/gcc-4.4/sources.nix @@ -1,6 +1,6 @@ /* Automatically generated by `update-gcc.sh', do not edit. For GCC 4.4.2. */ -{ fetchurl, optional, version, langC, langCC, langFortran, langJava }: +{ fetchurl, optional, version, langC, langCC, langFortran, langJava, langAda }: assert version == "4.4.2"; optional /* langC */ true (fetchurl { @@ -19,4 +19,8 @@ optional langJava (fetchurl { url = "mirror://gcc/releases/gcc-${version}/gcc-java-${version}.tar.bz2"; sha256 = "0ydk0qyhi1fdyz2xvj6m6l7cav4wg3962a1jxpf2j3nppm0p1dvp"; }) ++ +optional langAda (fetchurl { + url = "mirror://gcc/releases/gcc-${version}/gcc-ada-${version}.tar.bz2"; + sha256 = "1isz90b772j7ar5d4265fxzwiwgljssi0kpmrkybsj545615s0wi"; +}) ++ [] diff --git a/pkgs/development/compilers/gnatboot/default.nix b/pkgs/development/compilers/gnatboot/default.nix new file mode 100644 index 000000000000..1637cf5f927d --- /dev/null +++ b/pkgs/development/compilers/gnatboot/default.nix @@ -0,0 +1,50 @@ +{stdenv, fetchurl}: + +stdenv.mkDerivation { + name = "gentoo-gnatboot-4.1"; + + src = if (stdenv.system == "i686-linux") then + fetchurl { + url = "mirror://gentoo/distfiles/gnatboot-4.1-i386.tar.bz2"; + sha256 = "0665zk71598204bf521vw68i5y6ccqarq9fcxsqp7ccgycb4lysr"; + } + else if (stdenv.system == "x86_64-linux") then + fetchurl { + url = "mirror://gentoo/distfiles/gnatboot-4.1-amd64.tar.bz2"; + sha256 = "1li4d52lmbnfs6llcshlbqyik2q2q4bvpir0f7n38nagp0h6j0d4"; + } else throw "Platform not supported"; + + dontStrip=1; + + installPhase = '' + ensureDir $out + cp -R * $out + cd $out/bin + set +e + for a in *; do + patchelf --interpreter $(cat $NIX_GCC/nix-support/dynamic-linker) \ + --set-rpath $(cat $NIX_GCC/nix-support/orig-libc)/lib:$(cat + $NIX_GCC/nix-support/orig-gcc) $a + done + set -e + mv $out/bin/gnatgcc_2wrap $out/bin/gnatgcc + ln -s $out/bin/gnatgcc $out/bin/gcc + ''; + + passthru = { + langC = true; /* TRICK for gcc-wrapper to wrap it */ + langCC = false; + langFortran = false; + langAda = true; + }; + + meta = { + homepage = http://gentoo.org; + license = "GPLv3+"; # runtime support libraries are typically LGPLv3+ + maintainers = [ + stdenv.lib.maintainers.viric + ]; + + platforms = stdenv.lib.platforms.linux; + }; +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 93d7cad5d350..b6bdc36b75c7 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -1852,6 +1852,13 @@ let profiledCompiler = true; })); + gcc44_real2 = lowPrio (wrapGCC (makeOverridable (import + ../development/compilers/gcc-4.4-copy) { + inherit fetchurl stdenv texinfo gmp mpfr ppl cloogppl + gettext which noSysDirs; + profiledCompiler = true; + })); + gccApple = wrapGCC ( (if stdenv.system == "i686-darwin" then import ../development/compilers/gcc-apple else import ../development/compilers/gcc-apple64) { inherit fetchurl stdenv noSysDirs; @@ -1920,6 +1927,25 @@ let libXrandr xproto renderproto xextproto inputproto randrproto; }); + gnat = gnat44; + + gnat44 = wrapGNAT (gcc44_real2.gcc.override { + name = "gnat"; + langCC = false; + langC = true; + langAda = true; + profiledCompiler = false; + inherit gnatboot; + # We can't use the ppl stuff, because we would have + # libstdc++ problems. + cloogppl = null; + ppl = null; + }); + + gnatboot = wrapGNAT (import ../development/compilers/gnatboot { + inherit fetchurl stdenv; + }); + /* Broken; fails because of unability to find its own symbols during linking @@ -2272,6 +2298,7 @@ let }; wrapGCC = wrapGCCWith (import ../build-support/gcc-wrapper) glibc; + wrapGNAT = wrapGCCWith (import ../build-support/gnat-wrapper) glibc; wrapGCCCross = {gcc, libc, binutils, cross, shell ? "", name ? "gcc-cross-wrapper"}: @@ -8282,6 +8309,10 @@ let inherit fetchurl stdenv readline; }; + ghdl = import ../applications/science/electronics/ghdl { + inherit fetchurl stdenv; + gnat = gnatboot; + }; ### SCIENCE / MATH