diff options
Diffstat (limited to 'pkgs/os-specific/linux/ati-drivers/builder.sh')
-rw-r--r-- | pkgs/os-specific/linux/ati-drivers/builder.sh | 242 |
1 files changed, 144 insertions, 98 deletions
diff --git a/pkgs/os-specific/linux/ati-drivers/builder.sh b/pkgs/os-specific/linux/ati-drivers/builder.sh index d1ca1b35452..8df03910146 100644 --- a/pkgs/os-specific/linux/ati-drivers/builder.sh +++ b/pkgs/os-specific/linux/ati-drivers/builder.sh @@ -8,126 +8,129 @@ die(){ echo $@; exit 1; } # custom unpack: unzip $src -run_file=$(echo amd-catalyst-*) +run_file=$(echo fglrx-*/amd-driver-installer-*) sh $run_file --extract . eval "$patchPhase" -kernelVersion=$(cd ${kernel}/lib/modules && ls) -kernelBuild=$(echo ${kernel}/lib/modules/$kernelVersion/build) -linuxsources=$(echo ${kernel}/lib/modules/$kernelVersion/source) +case "$system" in + x86_64-linux) + arch=x86_64 + lib_arch=lib64 + DIR_DEPENDING_ON_XORG_VERSION=xpic_64a + ;; + i686-linux) + arch=x86 + lib_arch=lib + DIR_DEPENDING_ON_XORG_VERSION=xpic + ;; + *) exit 1;; +esac +# Handle/Build the kernel module. +if test -z "$libsOnly"; then -# note: maybe the .config file should be used to determine this ? -# current kbuild infrastructure allows using CONFIG_* defines -# but ati sources don't use them yet.. -# copy paste from make.sh -setSMP(){ + kernelVersion=$(cd ${kernel}/lib/modules && ls) + kernelBuild=$(echo ${kernel}/lib/modules/$kernelVersion/build) + linuxsources=$(echo ${kernel}/lib/modules/$kernelVersion/source) - linuxincludes=$kernelBuild/include + # note: maybe the .config file should be used to determine this ? + # current kbuild infrastructure allows using CONFIG_* defines + # but ati sources don't use them yet.. + # copy paste from make.sh + setSMP(){ - # copied and stripped. source: make.sh: + linuxincludes=$kernelBuild/include - # 3 - # linux/autoconf.h may contain this: #define CONFIG_SMP 1 + # copied and stripped. source: make.sh: + # 3 + # linux/autoconf.h may contain this: #define CONFIG_SMP 1 - # Before 2.6.33 autoconf.h is under linux/. - # For 2.6.33 and later autoconf.h is under generated/. - if [ -f $linuxincludes/generated/autoconf.h ]; then - autoconf_h=$linuxincludes/generated/autoconf.h - else - autoconf_h=$linuxincludes/linux/autoconf.h - fi - src_file=$autoconf_h + # Before 2.6.33 autoconf.h is under linux/. + # For 2.6.33 and later autoconf.h is under generated/. + if [ -f $linuxincludes/generated/autoconf.h ]; then + autoconf_h=$linuxincludes/generated/autoconf.h + else + autoconf_h=$linuxincludes/linux/autoconf.h + fi + src_file=$autoconf_h - [ -e $src_file ] || die "$src_file not found" + [ -e $src_file ] || die "$src_file not found" - if [ `cat $src_file | grep "#undef" | grep "CONFIG_SMP" -c` = 0 ]; then - SMP=`cat $src_file | grep CONFIG_SMP | cut -d' ' -f3` - echo "file $src_file says: SMP=$SMP" - fi + if [ `cat $src_file | grep "#undef" | grep "CONFIG_SMP" -c` = 0 ]; then + SMP=`cat $src_file | grep CONFIG_SMP | cut -d' ' -f3` + echo "file $src_file says: SMP=$SMP" + fi - if [ "$SMP" = 0 ]; then - echo "assuming default: SMP=$SMP" - fi + if [ "$SMP" = 0 ]; then + echo "assuming default: SMP=$SMP" + fi - # act on final result - if [ ! "$SMP" = 0 ]; then - smp="-SMP" - def_smp=-D__SMP__ - fi + # act on final result + if [ ! "$SMP" = 0 ]; then + smp="-SMP" + def_smp=-D__SMP__ + fi -} + } -setModVersions(){ - ! grep CONFIG_MODVERSIONS=y $kernel/config || - def_modversions="-DMODVERSIONS" - # make.sh contains much more code to determine this whether its enabled -} + setModVersions(){ + ! grep CONFIG_MODVERSIONS=y $kernelBuild/.config || + def_modversions="-DMODVERSIONS" + # make.sh contains much more code to determine this whether its enabled + } -# ============================================================== -# resolve if we are building for a kernel with a fix for CVE-2010-3081 -# On kernels with the fix, use arch_compat_alloc_user_space instead -# of compat_alloc_user_space since the latter is GPL-only + # ============================================================== + # resolve if we are building for a kernel with a fix for CVE-2010-3081 + # On kernels with the fix, use arch_compat_alloc_user_space instead + # of compat_alloc_user_space since the latter is GPL-only -COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space + COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space -for src_file in \ + for src_file in \ $kernelBuild/arch/x86/include/asm/compat.h \ $linuxsources/arch/x86/include/asm/compat.h \ $kernelBuild/include/asm-x86_64/compat.h \ $linuxsources/include/asm-x86_64/compat.h \ $kernelBuild/include/asm/compat.h; -do - if [ -e $src_file ]; - then - break - fi -done -if [ ! -e $src_file ]; -then - echo "Warning: x86 compat.h not found in kernel headers" - echo "neither arch/x86/include/asm/compat.h nor include/asm-x86_64/compat.h" - echo "could be found in $kernelBuild or $linuxsources" - echo "" -else - if [ `cat $src_file | grep -c arch_compat_alloc_user_space` -gt 0 ] - then - COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space + do + if [ -e $src_file ]; + then + break + fi + done + if [ ! -e $src_file ]; + then + echo "Warning: x86 compat.h not found in kernel headers" + echo "neither arch/x86/include/asm/compat.h nor include/asm-x86_64/compat.h" + echo "could be found in $kernelBuild or $linuxsources" + echo "" + else + if [ `cat $src_file | grep -c arch_compat_alloc_user_space` -gt 0 ] + then + COMPAT_ALLOC_USER_SPACE=arch_compat_alloc_user_space + fi + echo "file $src_file says: COMPAT_ALLOC_USER_SPACE=$COMPAT_ALLOC_USER_SPACE" fi - echo "file $src_file says: COMPAT_ALLOC_USER_SPACE=$COMPAT_ALLOC_USER_SPACE" -fi + # make.sh contains some code figuring out whether to use these or not.. + PAGE_ATTR_FIX=0 + setSMP + setModVersions + CC=gcc + MODULE=fglrx + LIBIP_PREFIX=$TMP/arch/$arch/lib/modules/fglrx/build_mod + [ -d $LIBIP_PREFIX ] + GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" -# make.sh contains some code figuring out whether to use these or not.. -PAGE_ATTR_FIX=0 -setSMP -setModVersions -CC=gcc -MODULE=fglrx -case "$system" in - x86_64-linux) - arch=x86_64 - lib_arch=lib64 - ;; - i686-linux) - arch=x86 - lib_arch=lib - ;; - *) exit 1;; -esac -LIBIP_PREFIX=$TMP/arch/$arch/lib/modules/fglrx/build_mod -[ -d $LIBIP_PREFIX ] -GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" + { # build .ko module + cd ./common/lib/modules/fglrx/build_mod/2.6.x + echo .lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd + echo 'This is a dummy file created to suppress this warning: could not find /lib/modules/fglrx/build_mod/2.6.x/.libfglrx_ip.a.GCC4.cmd for /lib/modules/fglrx/build_mod/2.6.x/libfglrx_ip.a.GCC4' > lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd -{ # build .ko module - cd ./common/lib/modules/fglrx/build_mod/2.6.x - echo .lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd - echo 'This is a dummy file created to suppress this warning: could not find /lib/modules/fglrx/build_mod/2.6.x/.libfglrx_ip.a.GCC4.cmd for /lib/modules/fglrx/build_mod/2.6.x/libfglrx_ip.a.GCC4' > lib${MODULE}_ip.a.GCC${GCC_MAJOR}.cmd + sed -i -e "s@COMPAT_ALLOC_USER_SPACE@$COMPAT_ALLOC_USER_SPACE@" ../kcl_ioctl.c - sed -i -e "s@COMPAT_ALLOC_USER_SPACE@$COMPAT_ALLOC_USER_SPACE@" ../kcl_ioctl.c - - make CC=${CC} \ + make CC=${CC} \ LIBIP_PREFIX=$(echo "$LIBIP_PREFIX" | sed -e 's|^\([^/]\)|../\1|') \ MODFLAGS="-DMODULE -DATI -DFGL -DPAGE_ATTR_FIX=$PAGE_ATTR_FIX -DCOMPAT_ALLOC_USER_SPACE=$COMPAT_ALLOC_USER_SPACE $def_smp $def_modversions" \ KVER=$kernelVersion \ @@ -135,8 +138,10 @@ GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" PAGE_ATTR_FIX=$PAGE_ATTR_FIX \ -j4 - cd $TMP -} + cd $TMP + } + +fi { # install @@ -152,13 +157,15 @@ GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" # what are those files used for? cp -r common/etc $out - DIR_DEPENDING_ON_XORG_VERSION=xpic_64a cp -r $DIR_DEPENDING_ON_XORG_VERSION/usr/X11R6/$lib_arch/* $out/lib/xorg - t=$out/lib/modules/${kernelVersion}/kernel/drivers/misc - mkdir -p $t + # install kernel module + if test -z "$libsOnly"; then + t=$out/lib/modules/${kernelVersion}/kernel/drivers/misc + mkdir -p $t - cp ./common/lib/modules/fglrx/build_mod/2.6.x/fglrx.ko $t + cp ./common/lib/modules/fglrx/build_mod/2.6.x/fglrx.ko $t + fi # should this be installed at all? # its used by the example fglrx_gamma only @@ -181,10 +188,47 @@ GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" # make xorg use the ati version ln -s $out/lib/xorg/modules/extensions/{fglrx/fglrx-libglx.so,libglx.so} + # Correct some paths that are hardcoded into binary libs. + if [ "$arch" == "x86_64" ]; then + for lib in \ + lib/xorg/modules/extensions/fglrx/fglrx-libglx.so \ + lib/xorg/modules/glesx.so \ + lib/dri/fglrx_dri.so \ + lib/fglrx_dri.so \ + lib/fglrx-libGL.so.1.2 + do + oldPaths="/usr/X11R6/lib/modules/dri" + newPaths="/run/opengl-driver/lib/dri" + sed -i -e "s|$oldPaths|$newPaths|" $out/$lib + done + else + oldPaths="/usr/X11R6/lib32/modules/dri\x00/usr/lib32/dri" + newPaths="/run/opengl-driver-32/lib/dri\x00/dev/null/dri" + sed -i -e "s|$oldPaths|$newPaths|" \ + $out/lib/xorg/modules/extensions/fglrx/fglrx-libglx.so + + for lib in \ + lib/dri/fglrx_dri.so \ + lib/fglrx_dri.so \ + lib/xorg/modules/glesx.so + do + oldPaths="/usr/X11R6/lib32/modules/dri/" + newPaths="/run/opengl-driver-32/lib/dri" + sed -i -e "s|$oldPaths|$newPaths|" $out/$lib + done + + oldPaths="/usr/X11R6/lib32/modules/dri\x00" + newPaths="/run/opengl-driver-32/lib/dri" + sed -i -e "s|$oldPaths|$newPaths|" $out/lib/fglrx-libGL.so.1.2 + fi + # libstdc++ and gcc are needed by some libs patchelf --set-rpath $gcc/$lib_arch $out/lib/libatiadlxx.so + patchelf --set-rpath $gcc/$lib_arch $out/lib/xorg/modules/glesx.so } +if test -z "$libsOnly"; then + { # build samples mkdir -p $out/bin @@ -221,7 +265,7 @@ GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" cp $BIN/* $out/bin for prog in $BIN/*; do patchelf --set-interpreter $(echo $glibc/lib/ld-linux*.so.2) $out/bin/$(basename $prog) - wrapProgram $out/bin/$(basename $prog) --prefix LD_LIBRARY_PATH : $out/lib:$LD_LIBRARY_PATH + wrapProgram $out/bin/$(basename $prog) --prefix LD_LIBRARY_PATH : $out/lib:$gcc/lib:$qt4/lib:$LD_LIBRARY_PATH done } @@ -229,6 +273,8 @@ GCC_MAJOR="`gcc --version | grep -o -e ") ." | head -1 | cut -d " " -f 2`" } +fi + for p in $extraDRIlibs; do for lib in $p/lib/*.so*; do ln -s $lib $out/lib/ |