| 1 | # Copyright 1999-2003 Gentoo Technologies, Inc. |
1 | # Copyright 1999-2004 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.67 2003/11/18 18:45:04 vapier Exp $ |
3 | # $Header: /var/cvsroot/gentoo-x86/eclass/eutils.eclass,v 1.76 2004/01/26 23:40:07 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 |
| … | |
… | |
| 962 | ;; |
1057 | ;; |
| 963 | esac |
1058 | esac |
| 964 | debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" |
1059 | debug-print "Detected Makeself version ${ver} ... using ${skip} as offset" |
| 965 | fi |
1060 | fi |
| 966 | |
1061 | |
| 967 | # we do this because otherwise a failure in gzip will cause 0 bytes to be sent |
1062 | # lets grab the first few bytes of the file to figure out what kind of archive it is |
| 968 | # to tar which will make tar not extract anything and exit with 0 |
1063 | local tmpfile="`mymktemp ${T}`" |
| 969 | tail -n +${skip} ${src} 2>/dev/null \ |
1064 | tail -n +${skip} ${src} 2>/dev/null | head -c 512 > ${tmpfile} |
| 970 | | gzip -cd 2>/dev/null \ |
1065 | local filetype="`file -b ${tmpfile}`" |
| 971 | | tar -x --no-same-owner -f - 2>/dev/null |
1066 | case ${filetype} in |
| 972 | local pipestatus="${PIPESTATUS[*]}" |
1067 | *tar\ archive) |
| 973 | pipestatus="${pipestatus// }" |
1068 | tail -n +${skip} ${src} | tar --no-same-owner -xf - |
| 974 | if [ "${pipestatus//0}" != "" ] |
1069 | ;; |
| 975 | then |
1070 | bzip2*) |
| 976 | # maybe it isnt gzipped ... they usually are, but not always ... |
1071 | tail -n +${skip} ${src} | bzip2 -dc | tar --no-same-owner -xf - |
| 977 | tail -n +${skip} ${src} 2>/dev/null \ |
1072 | ;; |
| 978 | | tar -x --no-same-owner -f - 2>/dev/null |
1073 | gzip*) |
| 979 | pipestatus="${pipestatus// }" |
1074 | tail -n +${skip} ${src} | tar --no-same-owner -xzf - |
| 980 | if [ "${pipestatus//0}" != "" ] |
1075 | ;; |
| 981 | then |
1076 | *) |
| 982 | # and every once in a while they are bzipped2 ... |
1077 | false |
| 983 | tail -n +${skip} ${src} 2>/dev/null \ |
1078 | ;; |
| 984 | | bunzip2 -c 2>/dev/null \ |
1079 | esac |
| 985 | | tar -x --no-same-owner -f - 2>/dev/null \ |
|
|
| 986 | || die "failure unpacking makeself ${shrtsrc} ('${ver}' +${skip})" |
1080 | assert "failure unpacking (${filetype}) makeself ${shrtsrc} ('${ver}' +${skip})" |
| 987 | fi |
|
|
| 988 | fi |
|
|
| 989 | } |
1081 | } |
| 990 | |
1082 | |
| 991 | # Display a license for user to accept. |
1083 | # Display a license for user to accept. |
| 992 | # |
1084 | # |
| 993 | # Usage: check_license [license] |
1085 | # Usage: check_license [license] |
| … | |
… | |
| 1009 | local l="`basename ${lic}`" |
1101 | local l="`basename ${lic}`" |
| 1010 | |
1102 | |
| 1011 | # here is where we check for the licenses the user already |
1103 | # here is where we check for the licenses the user already |
| 1012 | # accepted ... if we don't find a match, we make the user accept |
1104 | # accepted ... if we don't find a match, we make the user accept |
| 1013 | local alic |
1105 | local alic |
| 1014 | for alic in ${ACCEPT_LICENSE} ; do |
1106 | for alic in "${ACCEPT_LICENSE}" ; do |
| 1015 | [ "${alic}" == "*" ] && return 0 |
1107 | [ "${alic}" == "*" ] && return 0 |
| 1016 | [ "${alic}" == "${l}" ] && return 0 |
1108 | [ "${alic}" == "${l}" ] && return 0 |
| 1017 | done |
1109 | done |
| 1018 | |
1110 | |
| 1019 | local licmsg="`mymktemp ${T}`" |
1111 | local licmsg="`mymktemp ${T}`" |
| … | |
… | |
| 1039 | eerror "You MUST accept the license to continue! Exiting!" |
1131 | eerror "You MUST accept the license to continue! Exiting!" |
| 1040 | die "Failed to accept license" |
1132 | die "Failed to accept license" |
| 1041 | ;; |
1133 | ;; |
| 1042 | esac |
1134 | esac |
| 1043 | } |
1135 | } |
|
|
1136 | |
|
|
1137 | # Aquire cd(s) for those lovely cd-based emerges. Yes, this violates |
|
|
1138 | # the whole 'non-interactive' policy, but damnit I want CD support ! |
|
|
1139 | # |
|
|
1140 | # with these cdrom functions we handle all the user interaction and |
|
|
1141 | # standardize everything. all you have to do is call cdrom_get_cds() |
|
|
1142 | # and when the function returns, you can assume that the cd has been |
|
|
1143 | # found at CDROM_ROOT. |
|
|
1144 | # |
|
|
1145 | # normally the cdrom functions will refer to the cds as 'cd #1', 'cd #2', |
|
|
1146 | # etc... if you want to give the cds better names, then just export |
|
|
1147 | # the CDROM_NAME_X variables before calling cdrom_get_cds(). |
|
|
1148 | # |
|
|
1149 | # for those multi cd ebuilds, see the cdrom_load_next_cd() below. |
|
|
1150 | # |
|
|
1151 | # Usage: cdrom_get_cds <file on cd1> [file on cd2] [file on cd3] [...] |
|
|
1152 | # - this will attempt to locate a cd based upon a file that is on |
|
|
1153 | # the cd ... the more files you give this function, the more cds |
|
|
1154 | # the cdrom functions will handle |
|
|
1155 | cdrom_get_cds() { |
|
|
1156 | # first we figure out how many cds we're dealing with by |
|
|
1157 | # the # of files they gave us |
|
|
1158 | local cdcnt=0 |
|
|
1159 | local f= |
|
|
1160 | for f in "$@" ; do |
|
|
1161 | cdcnt=$((cdcnt + 1)) |
|
|
1162 | export CDROM_CHECK_${cdcnt}="$f" |
|
|
1163 | done |
|
|
1164 | export CDROM_TOTAL_CDS=${cdcnt} |
|
|
1165 | export CDROM_CURRENT_CD=1 |
|
|
1166 | |
|
|
1167 | # now we see if the user gave use CD_ROOT ... |
|
|
1168 | # if they did, let's just believe them that it's correct |
|
|
1169 | if [ ! -z "${CD_ROOT}" ] ; then |
|
|
1170 | export CDROM_ROOT="${CD_ROOT}" |
|
|
1171 | einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" |
|
|
1172 | return |
|
|
1173 | fi |
|
|
1174 | # do the same for CD_ROOT_X |
|
|
1175 | if [ ! -z "${CD_ROOT_1}" ] ; then |
|
|
1176 | local var= |
|
|
1177 | cdcnt=0 |
|
|
1178 | while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do |
|
|
1179 | cdcnt=$((cdcnt + 1)) |
|
|
1180 | var="CD_ROOT_${cdcnt}" |
|
|
1181 | if [ -z "${!var}" ] ; then |
|
|
1182 | eerror "You must either use just the CD_ROOT" |
|
|
1183 | eerror "or specify ALL the CD_ROOT_X variables." |
|
|
1184 | eerror "In this case, you will need ${CDROM_TOTAL_CDS} CD_ROOT_X variables." |
|
|
1185 | die "could not locate CD_ROOT_${cdcnt}" |
|
|
1186 | fi |
|
|
1187 | export CDROM_ROOTS_${cdcnt}="${!var}" |
|
|
1188 | done |
|
|
1189 | export CDROM_ROOT=${CDROM_ROOTS_1} |
|
|
1190 | einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" |
|
|
1191 | return |
|
|
1192 | fi |
|
|
1193 | |
|
|
1194 | if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then |
|
|
1195 | einfon "This ebuild will need the " |
|
|
1196 | if [ -z "${CDROM_NAME}" ] ; then |
|
|
1197 | echo "cdrom for ${PN}." |
|
|
1198 | else |
|
|
1199 | echo "${CDROM_NAME}." |
|
|
1200 | fi |
|
|
1201 | echo |
|
|
1202 | einfo "If you do not have the CD, but have the data files" |
|
|
1203 | einfo "mounted somewhere on your filesystem, just export" |
|
|
1204 | einfo "the variable CD_ROOT so that it points to the" |
|
|
1205 | einfo "directory containing the files." |
|
|
1206 | echo |
|
|
1207 | else |
|
|
1208 | einfo "This package will need access to ${CDROM_TOTAL_CDS} cds." |
|
|
1209 | cdcnt=0 |
|
|
1210 | while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do |
|
|
1211 | cdcnt=$((cdcnt + 1)) |
|
|
1212 | var="CDROM_NAME_${cdcnt}" |
|
|
1213 | [ ! -z "${!var}" ] && einfo " CD ${cdcnt}: ${!var}" |
|
|
1214 | done |
|
|
1215 | echo |
|
|
1216 | einfo "If you do not have the CDs, but have the data files" |
|
|
1217 | einfo "mounted somewhere on your filesystem, just export" |
|
|
1218 | einfo "the following variables so they point to the right place:" |
|
|
1219 | einfon "" |
|
|
1220 | cdcnt=0 |
|
|
1221 | while [ ${cdcnt} -lt ${CDROM_TOTAL_CDS} ] ; do |
|
|
1222 | cdcnt=$((cdcnt + 1)) |
|
|
1223 | echo -n " CD_ROOT_${cdcnt}" |
|
|
1224 | done |
|
|
1225 | echo |
|
|
1226 | einfo "Or, if you have all the files in the same place, or" |
|
|
1227 | einfo "you only have one cdrom, you can export CD_ROOT" |
|
|
1228 | einfo "and that place will be used as the same data source" |
|
|
1229 | einfo "for all the CDs." |
|
|
1230 | echo |
|
|
1231 | fi |
|
|
1232 | export CDROM_CURRENT_CD=0 |
|
|
1233 | cdrom_load_next_cd |
|
|
1234 | } |
|
|
1235 | |
|
|
1236 | # this is only used when you need access to more than one cd. |
|
|
1237 | # when you have finished using the first cd, just call this function. |
|
|
1238 | # when it returns, CDROM_ROOT will be pointing to the second cd. |
|
|
1239 | # remember, you can only go forward in the cd chain, you can't go back. |
|
|
1240 | cdrom_load_next_cd() { |
|
|
1241 | export CDROM_CURRENT_CD=$((CDROM_CURRENT_CD + 1)) |
|
|
1242 | local var= |
|
|
1243 | |
|
|
1244 | unset CDROM_ROOT |
|
|
1245 | var=CDROM_ROOTS_${CDROM_CURRENT_CD} |
|
|
1246 | if [ -z "${!var}" ] ; then |
|
|
1247 | var="CDROM_CHECK_${CDROM_CURRENT_CD}" |
|
|
1248 | cdrom_locate_file_on_cd ${!var} |
|
|
1249 | else |
|
|
1250 | export CDROM_ROOT="${!var}" |
|
|
1251 | fi |
|
|
1252 | |
|
|
1253 | einfo "Found CD #${CDROM_CURRENT_CD} root at ${CDROM_ROOT}" |
|
|
1254 | } |
|
|
1255 | |
|
|
1256 | # this is used internally by the cdrom_get_cds() and cdrom_load_next_cd() |
|
|
1257 | # functions. this should *never* be called from an ebuild. |
|
|
1258 | # all it does is try to locate a give file on a cd ... if the cd isn't |
|
|
1259 | # found, then a message asking for the user to insert the cdrom will be |
|
|
1260 | # displayed and we'll hang out here until: |
|
|
1261 | # (1) the file is found on a mounted cdrom |
|
|
1262 | # (2) the user hits CTRL+C |
|
|
1263 | cdrom_locate_file_on_cd() { |
|
|
1264 | while [ -z "${CDROM_ROOT}" ] ; do |
|
|
1265 | local dir="$(dirname ${@})" |
|
|
1266 | local file="$(basename ${@})" |
|
|
1267 | local mline="" |
|
|
1268 | local showedmsg=0 |
|
|
1269 | |
|
|
1270 | for mline in `mount | egrep -e '(iso|cdrom)' | awk '{print $3}'` ; do |
|
|
1271 | [ -d "${mline}/${dir}" ] || continue |
|
|
1272 | [ ! -z "$(find ${mline}/${dir} -iname ${file} -maxdepth 1)" ] \ |
|
|
1273 | && export CDROM_ROOT=${mline} |
|
|
1274 | done |
|
|
1275 | |
|
|
1276 | if [ -z "${CDROM_ROOT}" ] ; then |
|
|
1277 | echo |
|
|
1278 | if [ ${showedmsg} -eq 0 ] ; then |
|
|
1279 | if [ ${CDROM_TOTAL_CDS} -eq 1 ] ; then |
|
|
1280 | if [ -z "${CDROM_NAME}" ] ; then |
|
|
1281 | einfo "Please insert the cdrom for ${PN} now !" |
|
|
1282 | else |
|
|
1283 | einfo "Please insert the ${CDROM_NAME} cdrom now !" |
|
|
1284 | fi |
|
|
1285 | else |
|
|
1286 | if [ -z "${CDROM_NAME_1}" ] ; then |
|
|
1287 | einfo "Please insert cd #${CDROM_CURRENT_CD} for ${PN} now !" |
|
|
1288 | else |
|
|
1289 | local var="CDROM_NAME_${CDROM_CURRENT_CD}" |
|
|
1290 | einfo "Please insert+mount the ${!var} cdrom now !" |
|
|
1291 | fi |
|
|
1292 | fi |
|
|
1293 | showedmsg=1 |
|
|
1294 | fi |
|
|
1295 | einfo "Press return to scan for the cd again" |
|
|
1296 | einfo "or hit CTRL+C to abort the emerge." |
|
|
1297 | read |
|
|
1298 | fi |
|
|
1299 | done |
|
|
1300 | } |