| 1 | # Copyright 1999-2003 Gentoo Technologies, Inc. |
1 | # Copyright 1999-2003 Gentoo Technologies, Inc. |
| 2 | # Distributed under the terms of the GNU General Public License v2 |
2 | # Distributed under the terms of the GNU General Public License v2 |
| 3 | # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.68 2003/11/26 20:15:10 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.73 2003/12/01 20:13:00 vapier Exp $ |
| 4 | # |
4 | # |
| 5 | # Author: Martin Schlemmer <azarah@gentoo.org> |
5 | # Author: Martin Schlemmer <azarah@gentoo.org> |
| 6 | # |
6 | # |
| 7 | # This eclass is for general purpose functions that most ebuilds |
7 | # This eclass is for general purpose functions that most ebuilds |
| 8 | # have to implement themselves. |
8 | # have to implement themselves. |
| … | |
… | |
| 896 | |
896 | |
| 897 | done |
897 | done |
| 898 | |
898 | |
| 899 | } |
899 | } |
| 900 | |
900 | |
|
|
901 | # for internal use only (unpack_pdv and unpack_makeself) |
|
|
902 | find_unpackable_file() { |
|
|
903 | local src="$1" |
|
|
904 | if [ -z "${src}" ] |
|
|
905 | then |
|
|
906 | src="${DISTDIR}/${A}" |
|
|
907 | else |
|
|
908 | if [ -e "${DISTDIR}/${src}" ] |
|
|
909 | then |
|
|
910 | src="${DISTDIR}/${src}" |
|
|
911 | elif [ -e "${PWD}/${src}" ] |
|
|
912 | then |
|
|
913 | src="${PWD}/${src}" |
|
|
914 | elif [ -e "${src}" ] |
|
|
915 | then |
|
|
916 | src="${src}" |
|
|
917 | fi |
|
|
918 | fi |
|
|
919 | [ ! -e "${src}" ] && die "Could not find requested archive ${src}" |
|
|
920 | echo "${src}" |
|
|
921 | } |
|
|
922 | |
|
|
923 | # Unpack those pesky pdv generated files ... |
|
|
924 | # They're self-unpacking programs with the binary package stuffed in |
|
|
925 | # the middle of the archive. Valve seems to use it a lot ... too bad |
|
|
926 | # it seems to like to segfault a lot :(. So lets take it apart ourselves. |
|
|
927 | # |
|
|
928 | # Usage: unpack_pdv [file to unpack] [size of off_t] |
|
|
929 | # - you have to specify the off_t size ... i have no idea how to extract that |
|
|
930 | # information out of the binary executable myself. basically you pass in |
|
|
931 | # the size of the off_t type (in bytes) on the machine that built the pdv |
|
|
932 | # archive. one way to determine this is by running the following commands: |
|
|
933 | # strings <pdv archive> | grep lseek |
|
|
934 | # strace -elseek <pdv archive> |
|
|
935 | # basically look for the first lseek command (we do the strings/grep because |
|
|
936 | # sometimes the function call is _llseek or something) and steal the 2nd |
|
|
937 | # parameter. here is an example: |
|
|
938 | # root@vapier 0 pdv_unpack # strings hldsupdatetool.bin | grep lseek |
|
|
939 | # lseek |
|
|
940 | # root@vapier 0 pdv_unpack # strace -elseek ./hldsupdatetool.bin |
|
|
941 | # lseek(3, -4, SEEK_END) = 2981250 |
|
|
942 | # thus we would pass in the value of '4' as the second parameter. |
|
|
943 | unpack_pdv() { |
|
|
944 | local src="`find_unpackable_file $1`" |
|
|
945 | local sizeoff_t="$2" |
|
|
946 | |
|
|
947 | [ -z "${sizeoff_t}" ] && die "No idea what off_t size was used for this pdv :(" |
|
|
948 | |
|
|
949 | local shrtsrc="`basename ${src}`" |
|
|
950 | echo ">>> Unpacking ${shrtsrc} to ${PWD}" |
|
|
951 | local metaskip=`tail -c ${sizeoff_t} ${src} | hexdump -e \"%i\"` |
|
|
952 | local tailskip=`tail -c $((${sizeoff_t}*2)) ${src} | head -c ${sizeoff_t} | hexdump -e \"%i\"` |
|
|
953 | |
|
|
954 | # grab metadata for debug reasons |
|
|
955 | local metafile="`mymktemp ${T}`" |
|
|
956 | tail -c +$((${metaskip}+1)) ${src} > ${metafile} |
|
|
957 | |
|
|
958 | # rip out the final file name from the metadata |
|
|
959 | local datafile="`tail -c +$((${metaskip}+1)) ${src} | strings | head -n 1`" |
|
|
960 | datafile="`basename ${datafile}`" |
|
|
961 | |
|
|
962 | # now lets uncompress/untar the file if need be |
|
|
963 | local tmpfile="`mymktemp ${T}`" |
|
|
964 | tail -c +$((${tailskip}+1)) ${src} 2>/dev/null | head -c 512 > ${tmpfile} |
|
|
965 | |
|
|
966 | local iscompressed="`file -b ${tmpfile}`" |
|
|
967 | if [ "${iscompressed:0:8}" == "compress" ] ; then |
|
|
968 | iscompressed=1 |
|
|
969 | mv ${tmpfile}{,.Z} |
|
|
970 | gunzip ${tmpfile} |
|
|
971 | else |
|
|
972 | iscompressed=0 |
|
|
973 | fi |
|
|
974 | local istar="`file -b ${tmpfile}`" |
|
|
975 | if [ "${istar:0:9}" == "POSIX tar" ] ; then |
|
|
976 | istar=1 |
|
|
977 | else |
|
|
978 | istar=0 |
|
|
979 | fi |
|
|
980 | |
|
|
981 | #for some reason gzip dies with this ... dd cant provide buffer fast enough ? |
|
|
982 | #dd if=${src} ibs=${metaskip} count=1 \ |
|
|
983 | # | dd ibs=${tailskip} skip=1 \ |
|
|
984 | # | gzip -dc \ |
|
|
985 | # > ${datafile} |
|
|
986 | if [ ${iscompressed} -eq 1 ] ; then |
|
|
987 | if [ ${istar} -eq 1 ] ; then |
|
|
988 | tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \ |
|
|
989 | | head -c $((${metaskip}-${tailskip})) \ |
|
|
990 | | tar -xzf - |
|
|
991 | else |
|
|
992 | tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \ |
|
|
993 | | head -c $((${metaskip}-${tailskip})) \ |
|
|
994 | | gzip -dc \ |
|
|
995 | > ${datafile} |
|
|
996 | fi |
|
|
997 | else |
|
|
998 | if [ ${istar} -eq 1 ] ; then |
|
|
999 | tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \ |
|
|
1000 | | head -c $((${metaskip}-${tailskip})) \ |
|
|
1001 | | tar --no-same-owner -xf - |
|
|
1002 | else |
|
|
1003 | tail -c +$((${tailskip}+1)) ${src} 2>/dev/null \ |
|
|
1004 | | head -c $((${metaskip}-${tailskip})) \ |
|
|
1005 | > ${datafile} |
|
|
1006 | fi |
|
|
1007 | fi |
|
|
1008 | true |
|
|
1009 | #[ -s "${datafile}" ] || die "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" |
|
|
1010 | #assert "failure unpacking pdv ('${metaskip}' '${tailskip}' '${datafile}')" |
|
|
1011 | } |
|
|
1012 | |
| 901 | # Unpack those pesky makeself generated files ... |
1013 | # Unpack those pesky makeself generated files ... |
| 902 | # They're shell scripts with the binary package tagged onto |
1014 | # They're shell scripts with the binary package tagged onto |
| 903 | # the end of the archive. Loki utilized the format as does |
1015 | # the end of the archive. Loki utilized the format as does |
| 904 | # many other game companies. |
1016 | # many other game companies. |
| 905 | # |
1017 | # |
| 906 | # Usage: unpack_makeself [file to unpack] [offset] |
1018 | # Usage: unpack_makeself [file to unpack] [offset] |
| 907 | # - If the file is not specified then unpack will utilize ${A}. |
1019 | # - If the file is not specified then unpack will utilize ${A}. |
| 908 | # - If the offset is not specified then we will attempt to extract |
1020 | # - If the offset is not specified then we will attempt to extract |
| 909 | # the proper offset from the script itself. |
1021 | # the proper offset from the script itself. |
| 910 | unpack_makeself() { |
1022 | unpack_makeself() { |
| 911 | local src="$1" |
1023 | local src="`find_unpackable_file $1`" |
| 912 | local skip="$2" |
1024 | local skip="$2" |
| 913 | |
|
|
| 914 | if [ -z "${src}" ] |
|
|
| 915 | then |
|
|
| 916 | src="${DISTDIR}/${A}" |
|
|
| 917 | else |
|
|
| 918 | if [ -e "${DISTDIR}/${src}" ] |
|
|
| 919 | then |
|
|
| 920 | src="${DISTDIR}/${src}" |
|
|
| 921 | elif [ -e "${PWD}/${src}" ] |
|
|
| 922 | then |
|
|
| 923 | src="${PWD}/${src}" |
|
|
| 924 | elif [ -e "${src}" ] |
|
|
| 925 | then |
|
|
| 926 | src="${src}" |
|
|
| 927 | fi |
|
|
| 928 | fi |
|
|
| 929 | [ ! -e "${src}" ] && die "Could not find requested makeself archive ${src}" |
|
|
| 930 | |
1025 | |
| 931 | local shrtsrc="`basename ${src}`" |
1026 | local shrtsrc="`basename ${src}`" |
| 932 | echo ">>> Unpacking ${shrtsrc} to ${PWD}" |
1027 | echo ">>> Unpacking ${shrtsrc} to ${PWD}" |
| 933 | if [ -z "${skip}" ] |
1028 | if [ -z "${skip}" ] |
| 934 | then |
1029 | then |
| … | |
… | |
| 968 | local tmpfile="`mymktemp ${T}`" |
1063 | local tmpfile="`mymktemp ${T}`" |
| 969 | tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile} |
1064 | tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile} |
| 970 | local filetype="`file -b ${tmpfile}`" |
1065 | local filetype="`file -b ${tmpfile}`" |
| 971 | case ${filetype} in |
1066 | case ${filetype} in |
| 972 | *tar\ archive) |
1067 | *tar\ archive) |
| 973 | tail -n +${skip} ${src} | tar -xf - |
1068 | tail -n +${skip} ${src} | tar --no-same-owner -xf - |
| 974 | ;; |
1069 | ;; |
| 975 | bzip2*) |
1070 | bzip2*) |
| 976 | tail -n +${skip} ${src} | bzip2 -dc | tar -xf - |
1071 | tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf - |
|
|
1072 | ;; |
| 977 | gzip*) |
1073 | gzip*) |
| 978 | tail -n +${skip} ${src} | tar -xzf - |
1074 | tail -n +${skip} ${src} | tar --no-same-owner -xzf - |
| 979 | ;; |
1075 | ;; |
| 980 | *) |
1076 | *) |
| 981 | false |
1077 | false |
| 982 | ;; |
1078 | ;; |
| 983 | esac |
1079 | esac |