diff options
| author | Richard Purdie <rpurdie@linux.intel.com> | 2010-03-19 23:12:06 +0000 |
|---|---|---|
| committer | Richard Purdie <rpurdie@linux.intel.com> | 2010-03-19 23:12:06 +0000 |
| commit | 9c5386c1fd74d832cf6e2acad3c69b1cc90de6b2 (patch) | |
| tree | aa2db23da10e883f0f8627f5993cd2cfade2e705 | |
| parent | 185cb38f1319856b4bdaaf4d9a73b5056be53d54 (diff) | |
| download | poky-9c5386c1fd74d832cf6e2acad3c69b1cc90de6b2.tar.gz | |
base.bbclass: Split up as per the patch in OE.dev by Chris Larson making code more readable and modularised
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
| -rw-r--r-- | meta/classes/base.bbclass | 729 | ||||
| -rw-r--r-- | meta/classes/metadata_scm.bbclass | 77 | ||||
| -rw-r--r-- | meta/classes/mirrors.bbclass | 58 | ||||
| -rw-r--r-- | meta/classes/staging.bbclass | 146 | ||||
| -rw-r--r-- | meta/classes/utility-tasks.bbclass | 97 | ||||
| -rw-r--r-- | meta/classes/utils.bbclass | 340 | ||||
| -rw-r--r-- | meta/conf/bitbake.conf | 15 |
7 files changed, 740 insertions, 722 deletions
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass index 256f89954c..51a514570b 100644 --- a/meta/classes/base.bbclass +++ b/meta/classes/base.bbclass | |||
| @@ -1,87 +1,6 @@ | |||
| 1 | BB_DEFAULT_TASK ?= "build" | 1 | BB_DEFAULT_TASK ?= "build" |
| 2 | 2 | ||
| 3 | # like os.path.join but doesn't treat absolute RHS specially | 3 | inherit utils |
| 4 | def base_path_join(a, *p): | ||
| 5 | path = a | ||
| 6 | for b in p: | ||
| 7 | if path == '' or path.endswith('/'): | ||
| 8 | path += b | ||
| 9 | else: | ||
| 10 | path += '/' + b | ||
| 11 | return path | ||
| 12 | |||
| 13 | # for MD5/SHA handling | ||
| 14 | def base_chk_load_parser(config_path): | ||
| 15 | import ConfigParser | ||
| 16 | parser = ConfigParser.ConfigParser() | ||
| 17 | if not len(parser.read(config_path)) == 1: | ||
| 18 | bb.note("Can not open the '%s' ini file" % config_path) | ||
| 19 | raise Exception("Can not open the '%s'" % config_path) | ||
| 20 | |||
| 21 | return parser | ||
| 22 | |||
| 23 | def base_chk_file(parser, pn, pv, src_uri, localpath, data): | ||
| 24 | no_checksum = False | ||
| 25 | # Try PN-PV-SRC_URI first and then try PN-SRC_URI | ||
| 26 | # we rely on the get method to create errors | ||
| 27 | pn_pv_src = "%s-%s-%s" % (pn,pv,src_uri) | ||
| 28 | pn_src = "%s-%s" % (pn,src_uri) | ||
| 29 | if parser.has_section(pn_pv_src): | ||
| 30 | md5 = parser.get(pn_pv_src, "md5") | ||
| 31 | sha256 = parser.get(pn_pv_src, "sha256") | ||
| 32 | elif parser.has_section(pn_src): | ||
| 33 | md5 = parser.get(pn_src, "md5") | ||
| 34 | sha256 = parser.get(pn_src, "sha256") | ||
| 35 | elif parser.has_section(src_uri): | ||
| 36 | md5 = parser.get(src_uri, "md5") | ||
| 37 | sha256 = parser.get(src_uri, "sha256") | ||
| 38 | else: | ||
| 39 | no_checksum = True | ||
| 40 | |||
| 41 | # md5 and sha256 should be valid now | ||
| 42 | if not os.path.exists(localpath): | ||
| 43 | bb.note("The localpath does not exist '%s'" % localpath) | ||
| 44 | raise Exception("The path does not exist '%s'" % localpath) | ||
| 45 | |||
| 46 | |||
| 47 | # Calculate the MD5 and 256-bit SHA checksums | ||
| 48 | md5data = bb.utils.md5_file(localpath) | ||
| 49 | shadata = bb.utils.sha256_file(localpath) | ||
| 50 | |||
| 51 | # sha256_file() can return None if we are running on Python 2.4 (hashlib is | ||
| 52 | # 2.5 onwards, sha in 2.4 is 160-bit only), so check for this and call the | ||
| 53 | # standalone shasum binary if required. | ||
| 54 | if shadata is None: | ||
| 55 | try: | ||
| 56 | shapipe = os.popen('PATH=%s oe_sha256sum %s' % (bb.data.getVar('PATH', data, True), localpath)) | ||
| 57 | shadata = (shapipe.readline().split() or [ "" ])[0] | ||
| 58 | shapipe.close() | ||
| 59 | except OSError: | ||
| 60 | raise Exception("Executing shasum failed, please build shasum-native") | ||
| 61 | |||
| 62 | if no_checksum == True: # we do not have conf/checksums.ini entry | ||
| 63 | try: | ||
| 64 | file = open("%s/checksums.ini" % bb.data.getVar("TMPDIR", data, 1), "a") | ||
| 65 | except: | ||
| 66 | return False | ||
| 67 | |||
| 68 | if not file: | ||
| 69 | raise Exception("Creating checksums.ini failed") | ||
| 70 | |||
| 71 | file.write("[%s]\nmd5=%s\nsha256=%s\n\n" % (src_uri, md5data, shadata)) | ||
| 72 | file.close() | ||
| 73 | return False | ||
| 74 | |||
| 75 | if not md5 == md5data: | ||
| 76 | bb.note("The MD5Sums did not match. Wanted: '%s' and Got: '%s'" % (md5,md5data)) | ||
| 77 | raise Exception("MD5 Sums do not match. Wanted: '%s' Got: '%s'" % (md5, md5data)) | ||
| 78 | |||
| 79 | if not sha256 == shadata: | ||
| 80 | bb.note("The SHA256 Sums do not match. Wanted: '%s' Got: '%s'" % (sha256,shadata)) | ||
| 81 | raise Exception("SHA256 Sums do not match. Wanted: '%s' Got: '%s'" % (sha256, shadata)) | ||
| 82 | |||
| 83 | return True | ||
| 84 | |||
| 85 | 4 | ||
| 86 | def base_dep_prepend(d): | 5 | def base_dep_prepend(d): |
| 87 | # | 6 | # |
| @@ -112,62 +31,11 @@ def base_dep_prepend(d): | |||
| 112 | deps += " virtual/${TARGET_PREFIX}gcc virtual/libc " | 31 | deps += " virtual/${TARGET_PREFIX}gcc virtual/libc " |
| 113 | return deps | 32 | return deps |
| 114 | 33 | ||
| 115 | def base_read_file(filename): | ||
| 116 | try: | ||
| 117 | f = file( filename, "r" ) | ||
| 118 | except IOError, reason: | ||
| 119 | return "" # WARNING: can't raise an error now because of the new RDEPENDS handling. This is a bit ugly. :M: | ||
| 120 | else: | ||
| 121 | return f.read().strip() | ||
| 122 | return None | ||
| 123 | |||
| 124 | def base_conditional(variable, checkvalue, truevalue, falsevalue, d): | ||
| 125 | if bb.data.getVar(variable,d,1) == checkvalue: | ||
| 126 | return truevalue | ||
| 127 | else: | ||
| 128 | return falsevalue | ||
| 129 | |||
| 130 | def base_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): | ||
| 131 | if float(bb.data.getVar(variable,d,1)) <= float(checkvalue): | ||
| 132 | return truevalue | ||
| 133 | else: | ||
| 134 | return falsevalue | ||
| 135 | |||
| 136 | def base_version_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): | ||
| 137 | result = bb.vercmp(bb.data.getVar(variable,d,True), checkvalue) | ||
| 138 | if result <= 0: | ||
| 139 | return truevalue | ||
| 140 | else: | ||
| 141 | return falsevalue | ||
| 142 | |||
| 143 | def base_contains(variable, checkvalues, truevalue, falsevalue, d): | ||
| 144 | matches = 0 | ||
| 145 | if type(checkvalues).__name__ == "str": | ||
| 146 | checkvalues = [checkvalues] | ||
| 147 | for value in checkvalues: | ||
| 148 | if bb.data.getVar(variable,d,1).find(value) != -1: | ||
| 149 | matches = matches + 1 | ||
| 150 | if matches == len(checkvalues): | ||
| 151 | return truevalue | ||
| 152 | return falsevalue | ||
| 153 | |||
| 154 | def base_both_contain(variable1, variable2, checkvalue, d): | ||
| 155 | if bb.data.getVar(variable1,d,1).find(checkvalue) != -1 and bb.data.getVar(variable2,d,1).find(checkvalue) != -1: | ||
| 156 | return checkvalue | ||
| 157 | else: | ||
| 158 | return "" | ||
| 159 | 34 | ||
| 160 | DEPENDS_prepend="${@base_dep_prepend(d)} " | 35 | DEPENDS_prepend="${@base_dep_prepend(d)} " |
| 161 | DEPENDS_virtclass-native_prepend="${@base_dep_prepend(d)} " | 36 | DEPENDS_virtclass-native_prepend="${@base_dep_prepend(d)} " |
| 162 | DEPENDS_virtclass-nativesdk_prepend="${@base_dep_prepend(d)} " | 37 | DEPENDS_virtclass-nativesdk_prepend="${@base_dep_prepend(d)} " |
| 163 | 38 | ||
| 164 | def base_prune_suffix(var, suffixes, d): | ||
| 165 | # See if var ends with any of the suffixes listed and | ||
| 166 | # remove it if found | ||
| 167 | for suffix in suffixes: | ||
| 168 | if var.endswith(suffix): | ||
| 169 | return var.replace(suffix, "") | ||
| 170 | return var | ||
| 171 | 39 | ||
| 172 | def base_set_filespath(path, d): | 40 | def base_set_filespath(path, d): |
| 173 | filespath = [] | 41 | filespath = [] |
| @@ -180,13 +48,6 @@ def base_set_filespath(path, d): | |||
| 180 | 48 | ||
| 181 | FILESPATH = "${@base_set_filespath([ "${FILE_DIRNAME}/${PF}", "${FILE_DIRNAME}/${P}", "${FILE_DIRNAME}/${PN}", "${FILE_DIRNAME}/${BP}", "${FILE_DIRNAME}/${BPN}", "${FILE_DIRNAME}/files", "${FILE_DIRNAME}" ], d)}" | 49 | FILESPATH = "${@base_set_filespath([ "${FILE_DIRNAME}/${PF}", "${FILE_DIRNAME}/${P}", "${FILE_DIRNAME}/${PN}", "${FILE_DIRNAME}/${BP}", "${FILE_DIRNAME}/${BPN}", "${FILE_DIRNAME}/files", "${FILE_DIRNAME}" ], d)}" |
| 182 | 50 | ||
| 183 | def oe_filter(f, str, d): | ||
| 184 | from re import match | ||
| 185 | return " ".join(filter(lambda x: match(f, x, 0), str.split())) | ||
| 186 | |||
| 187 | def oe_filter_out(f, str, d): | ||
| 188 | from re import match | ||
| 189 | return " ".join(filter(lambda x: not match(f, x, 0), str.split())) | ||
| 190 | 51 | ||
| 191 | die() { | 52 | die() { |
| 192 | oefatal "$*" | 53 | oefatal "$*" |
| @@ -223,173 +84,6 @@ oe_runmake() { | |||
| 223 | ${MAKE} ${EXTRA_OEMAKE} "$@" || die "oe_runmake failed" | 84 | ${MAKE} ${EXTRA_OEMAKE} "$@" || die "oe_runmake failed" |
| 224 | } | 85 | } |
| 225 | 86 | ||
| 226 | oe_soinstall() { | ||
| 227 | # Purpose: Install shared library file and | ||
| 228 | # create the necessary links | ||
| 229 | # Example: | ||
| 230 | # | ||
| 231 | # oe_ | ||
| 232 | # | ||
| 233 | #oenote installing shared library $1 to $2 | ||
| 234 | # | ||
| 235 | libname=`basename $1` | ||
| 236 | install -m 755 $1 $2/$libname | ||
| 237 | sonamelink=`${HOST_PREFIX}readelf -d $1 |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` | ||
| 238 | solink=`echo $libname | sed -e 's/\.so\..*/.so/'` | ||
| 239 | ln -sf $libname $2/$sonamelink | ||
| 240 | ln -sf $libname $2/$solink | ||
| 241 | } | ||
| 242 | |||
| 243 | oe_libinstall() { | ||
| 244 | # Purpose: Install a library, in all its forms | ||
| 245 | # Example | ||
| 246 | # | ||
| 247 | # oe_libinstall libltdl ${STAGING_LIBDIR}/ | ||
| 248 | # oe_libinstall -C src/libblah libblah ${D}/${libdir}/ | ||
| 249 | dir="" | ||
| 250 | libtool="" | ||
| 251 | silent="" | ||
| 252 | require_static="" | ||
| 253 | require_shared="" | ||
| 254 | staging_install="" | ||
| 255 | while [ "$#" -gt 0 ]; do | ||
| 256 | case "$1" in | ||
| 257 | -C) | ||
| 258 | shift | ||
| 259 | dir="$1" | ||
| 260 | ;; | ||
| 261 | -s) | ||
| 262 | silent=1 | ||
| 263 | ;; | ||
| 264 | -a) | ||
| 265 | require_static=1 | ||
| 266 | ;; | ||
| 267 | -so) | ||
| 268 | require_shared=1 | ||
| 269 | ;; | ||
| 270 | -*) | ||
| 271 | oefatal "oe_libinstall: unknown option: $1" | ||
| 272 | ;; | ||
| 273 | *) | ||
| 274 | break; | ||
| 275 | ;; | ||
| 276 | esac | ||
| 277 | shift | ||
| 278 | done | ||
| 279 | |||
| 280 | libname="$1" | ||
| 281 | shift | ||
| 282 | destpath="$1" | ||
| 283 | if [ -z "$destpath" ]; then | ||
| 284 | oefatal "oe_libinstall: no destination path specified" | ||
| 285 | fi | ||
| 286 | if echo "$destpath/" | egrep '^${STAGING_LIBDIR}/' >/dev/null | ||
| 287 | then | ||
| 288 | staging_install=1 | ||
| 289 | fi | ||
| 290 | |||
| 291 | __runcmd () { | ||
| 292 | if [ -z "$silent" ]; then | ||
| 293 | echo >&2 "oe_libinstall: $*" | ||
| 294 | fi | ||
| 295 | $* | ||
| 296 | } | ||
| 297 | |||
| 298 | if [ -z "$dir" ]; then | ||
| 299 | dir=`pwd` | ||
| 300 | fi | ||
| 301 | |||
| 302 | dotlai=$libname.lai | ||
| 303 | |||
| 304 | # Sanity check that the libname.lai is unique | ||
| 305 | number_of_files=`(cd $dir; find . -name "$dotlai") | wc -l` | ||
| 306 | if [ $number_of_files -gt 1 ]; then | ||
| 307 | oefatal "oe_libinstall: $dotlai is not unique in $dir" | ||
| 308 | fi | ||
| 309 | |||
| 310 | |||
| 311 | dir=$dir`(cd $dir;find . -name "$dotlai") | sed "s/^\.//;s/\/$dotlai\$//;q"` | ||
| 312 | olddir=`pwd` | ||
| 313 | __runcmd cd $dir | ||
| 314 | |||
| 315 | lafile=$libname.la | ||
| 316 | |||
| 317 | # If such file doesn't exist, try to cut version suffix | ||
| 318 | if [ ! -f "$lafile" ]; then | ||
| 319 | libname1=`echo "$libname" | sed 's/-[0-9.]*$//'` | ||
| 320 | lafile1=$libname.la | ||
| 321 | if [ -f "$lafile1" ]; then | ||
| 322 | libname=$libname1 | ||
| 323 | lafile=$lafile1 | ||
| 324 | fi | ||
| 325 | fi | ||
| 326 | |||
| 327 | if [ -f "$lafile" ]; then | ||
| 328 | # libtool archive | ||
| 329 | eval `cat $lafile|grep "^library_names="` | ||
| 330 | libtool=1 | ||
| 331 | else | ||
| 332 | library_names="$libname.so* $libname.dll.a" | ||
| 333 | fi | ||
| 334 | |||
| 335 | __runcmd install -d $destpath/ | ||
| 336 | dota=$libname.a | ||
| 337 | if [ -f "$dota" -o -n "$require_static" ]; then | ||
| 338 | rm -f $destpath/$dota | ||
| 339 | __runcmd install -m 0644 $dota $destpath/ | ||
| 340 | fi | ||
| 341 | if [ -f "$dotlai" -a -n "$libtool" ]; then | ||
| 342 | if test -n "$staging_install" | ||
| 343 | then | ||
| 344 | # stop libtool using the final directory name for libraries | ||
| 345 | # in staging: | ||
| 346 | __runcmd rm -f $destpath/$libname.la | ||
| 347 | __runcmd sed -e 's/^installed=yes$/installed=no/' \ | ||
| 348 | -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' \ | ||
| 349 | -e "/^dependency_libs=/s,\([[:space:]']\)${libdir},\1${STAGING_LIBDIR},g" \ | ||
| 350 | $dotlai >$destpath/$libname.la | ||
| 351 | else | ||
| 352 | rm -f $destpath/$libname.la | ||
| 353 | __runcmd install -m 0644 $dotlai $destpath/$libname.la | ||
| 354 | fi | ||
| 355 | fi | ||
| 356 | |||
| 357 | for name in $library_names; do | ||
| 358 | files=`eval echo $name` | ||
| 359 | for f in $files; do | ||
| 360 | if [ ! -e "$f" ]; then | ||
| 361 | if [ -n "$libtool" ]; then | ||
| 362 | oefatal "oe_libinstall: $dir/$f not found." | ||
| 363 | fi | ||
| 364 | elif [ -L "$f" ]; then | ||
| 365 | __runcmd cp -P "$f" $destpath/ | ||
| 366 | elif [ ! -L "$f" ]; then | ||
| 367 | libfile="$f" | ||
| 368 | rm -f $destpath/$libfile | ||
| 369 | __runcmd install -m 0755 $libfile $destpath/ | ||
| 370 | fi | ||
| 371 | done | ||
| 372 | done | ||
| 373 | |||
| 374 | if [ -z "$libfile" ]; then | ||
| 375 | if [ -n "$require_shared" ]; then | ||
| 376 | oefatal "oe_libinstall: unable to locate shared library" | ||
| 377 | fi | ||
| 378 | elif [ -z "$libtool" ]; then | ||
| 379 | # special case hack for non-libtool .so.#.#.# links | ||
| 380 | baselibfile=`basename "$libfile"` | ||
| 381 | if (echo $baselibfile | grep -qE '^lib.*\.so\.[0-9.]*$'); then | ||
| 382 | sonamelink=`${HOST_PREFIX}readelf -d $libfile |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` | ||
| 383 | solink=`echo $baselibfile | sed -e 's/\.so\..*/.so/'` | ||
| 384 | if [ -n "$sonamelink" -a x"$baselibfile" != x"$sonamelink" ]; then | ||
| 385 | __runcmd ln -sf $baselibfile $destpath/$sonamelink | ||
| 386 | fi | ||
| 387 | __runcmd ln -sf $baselibfile $destpath/$solink | ||
| 388 | fi | ||
| 389 | fi | ||
| 390 | |||
| 391 | __runcmd cd "$olddir" | ||
| 392 | } | ||
| 393 | 87 | ||
| 394 | def package_stagefile(file, d): | 88 | def package_stagefile(file, d): |
| 395 | 89 | ||
| @@ -409,81 +103,7 @@ package_stagefile_shell() { | |||
| 409 | fi | 103 | fi |
| 410 | } | 104 | } |
| 411 | 105 | ||
| 412 | oe_machinstall() { | 106 | inherit utility-tasks |
| 413 | # Purpose: Install machine dependent files, if available | ||
| 414 | # If not available, check if there is a default | ||
| 415 | # If no default, just touch the destination | ||
| 416 | # Example: | ||
| 417 | # $1 $2 $3 $4 | ||
| 418 | # oe_machinstall -m 0644 fstab ${D}/etc/fstab | ||
| 419 | # | ||
| 420 | # TODO: Check argument number? | ||
| 421 | # | ||
| 422 | filename=`basename $3` | ||
| 423 | dirname=`dirname $3` | ||
| 424 | |||
| 425 | for o in `echo ${OVERRIDES} | tr ':' ' '`; do | ||
| 426 | if [ -e $dirname/$o/$filename ]; then | ||
| 427 | oenote $dirname/$o/$filename present, installing to $4 | ||
| 428 | install $1 $2 $dirname/$o/$filename $4 | ||
| 429 | return | ||
| 430 | fi | ||
| 431 | done | ||
| 432 | # oenote overrides specific file NOT present, trying default=$3... | ||
| 433 | if [ -e $3 ]; then | ||
| 434 | oenote $3 present, installing to $4 | ||
| 435 | install $1 $2 $3 $4 | ||
| 436 | else | ||
| 437 | oenote $3 NOT present, touching empty $4 | ||
| 438 | touch $4 | ||
| 439 | fi | ||
| 440 | } | ||
| 441 | |||
| 442 | addtask listtasks | ||
| 443 | do_listtasks[nostamp] = "1" | ||
| 444 | python do_listtasks() { | ||
| 445 | import sys | ||
| 446 | # emit variables and shell functions | ||
| 447 | #bb.data.emit_env(sys.__stdout__, d) | ||
| 448 | # emit the metadata which isnt valid shell | ||
| 449 | for e in d.keys(): | ||
| 450 | if bb.data.getVarFlag(e, 'task', d): | ||
| 451 | sys.__stdout__.write("%s\n" % e) | ||
| 452 | } | ||
| 453 | |||
| 454 | addtask clean | ||
| 455 | do_clean[dirs] = "${TOPDIR}" | ||
| 456 | do_clean[nostamp] = "1" | ||
| 457 | python base_do_clean() { | ||
| 458 | """clear the build and temp directories""" | ||
| 459 | dir = bb.data.expand("${WORKDIR}", d) | ||
| 460 | if dir == '//': raise bb.build.FuncFailed("wrong DATADIR") | ||
| 461 | bb.note("removing " + dir) | ||
| 462 | os.system('rm -rf ' + dir) | ||
| 463 | |||
| 464 | dir = "%s.*" % bb.data.expand(bb.data.getVar('STAMP', d), d) | ||
| 465 | bb.note("removing " + dir) | ||
| 466 | os.system('rm -f '+ dir) | ||
| 467 | } | ||
| 468 | |||
| 469 | addtask rebuild after do_${BB_DEFAULT_TASK} | ||
| 470 | do_rebuild[dirs] = "${TOPDIR}" | ||
| 471 | do_rebuild[nostamp] = "1" | ||
| 472 | python base_do_rebuild() { | ||
| 473 | """rebuild a package""" | ||
| 474 | } | ||
| 475 | |||
| 476 | #addtask mrproper | ||
| 477 | #do_mrproper[dirs] = "${TOPDIR}" | ||
| 478 | #do_mrproper[nostamp] = "1" | ||
| 479 | #python base_do_mrproper() { | ||
| 480 | # """clear downloaded sources, build and temp directories""" | ||
| 481 | # dir = bb.data.expand("${DL_DIR}", d) | ||
| 482 | # if dir == '/': bb.build.FuncFailed("wrong DATADIR") | ||
| 483 | # bb.debug(2, "removing " + dir) | ||
| 484 | # os.system('rm -rf ' + dir) | ||
| 485 | # bb.build.exec_func('do_clean', d) | ||
| 486 | #} | ||
| 487 | 107 | ||
| 488 | SCENEFUNCS += "base_scenefunction" | 108 | SCENEFUNCS += "base_scenefunction" |
| 489 | 109 | ||
| @@ -566,57 +186,6 @@ python base_do_fetch() { | |||
| 566 | raise bb.build.FuncFailed("Checksum of '%s' failed" % uri) | 186 | raise bb.build.FuncFailed("Checksum of '%s' failed" % uri) |
| 567 | } | 187 | } |
| 568 | 188 | ||
| 569 | addtask fetchall after do_fetch | ||
| 570 | do_fetchall[recrdeptask] = "do_fetch" | ||
| 571 | base_do_fetchall() { | ||
| 572 | : | ||
| 573 | } | ||
| 574 | |||
| 575 | addtask checkuri | ||
| 576 | do_checkuri[nostamp] = "1" | ||
| 577 | python do_checkuri() { | ||
| 578 | import sys | ||
| 579 | |||
| 580 | localdata = bb.data.createCopy(d) | ||
| 581 | bb.data.update_data(localdata) | ||
| 582 | |||
| 583 | src_uri = bb.data.getVar('SRC_URI', localdata, 1) | ||
| 584 | |||
| 585 | try: | ||
| 586 | bb.fetch.init(src_uri.split(),d) | ||
| 587 | except bb.fetch.NoMethodError: | ||
| 588 | (type, value, traceback) = sys.exc_info() | ||
| 589 | raise bb.build.FuncFailed("No method: %s" % value) | ||
| 590 | |||
| 591 | try: | ||
| 592 | bb.fetch.checkstatus(localdata) | ||
| 593 | except bb.fetch.MissingParameterError: | ||
| 594 | (type, value, traceback) = sys.exc_info() | ||
| 595 | raise bb.build.FuncFailed("Missing parameters: %s" % value) | ||
| 596 | except bb.fetch.FetchError: | ||
| 597 | (type, value, traceback) = sys.exc_info() | ||
| 598 | raise bb.build.FuncFailed("Fetch failed: %s" % value) | ||
| 599 | except bb.fetch.MD5SumError: | ||
| 600 | (type, value, traceback) = sys.exc_info() | ||
| 601 | raise bb.build.FuncFailed("MD5 failed: %s" % value) | ||
| 602 | except: | ||
| 603 | (type, value, traceback) = sys.exc_info() | ||
| 604 | raise bb.build.FuncFailed("Unknown fetch Error: %s" % value) | ||
| 605 | } | ||
| 606 | |||
| 607 | addtask checkuriall after do_checkuri | ||
| 608 | do_checkuriall[recrdeptask] = "do_checkuri" | ||
| 609 | do_checkuriall[nostamp] = "1" | ||
| 610 | base_do_checkuriall() { | ||
| 611 | : | ||
| 612 | } | ||
| 613 | |||
| 614 | addtask buildall after do_build | ||
| 615 | do_buildall[recrdeptask] = "do_build" | ||
| 616 | base_do_buildall() { | ||
| 617 | : | ||
| 618 | } | ||
| 619 | |||
| 620 | def subprocess_setup(): | 189 | def subprocess_setup(): |
| 621 | import signal | 190 | import signal |
| 622 | # Python installs a SIGPIPE handler by default. This is usually not what | 191 | # Python installs a SIGPIPE handler by default. This is usually not what |
| @@ -720,82 +289,7 @@ python base_do_unpack() { | |||
| 720 | raise bb.build.FuncFailed() | 289 | raise bb.build.FuncFailed() |
| 721 | } | 290 | } |
| 722 | 291 | ||
| 723 | METADATA_BRANCH ?= "${@base_detect_branch(d)}" | 292 | inherit metadata_scm |
| 724 | METADATA_REVISION ?= "${@base_detect_revision(d)}" | ||
| 725 | |||
| 726 | def base_detect_revision(d): | ||
| 727 | path = base_get_scmbasepath(d) | ||
| 728 | |||
| 729 | scms = [base_get_metadata_git_revision, \ | ||
| 730 | base_get_metadata_svn_revision] | ||
| 731 | |||
| 732 | for scm in scms: | ||
| 733 | rev = scm(path, d) | ||
| 734 | if rev <> "<unknown>": | ||
| 735 | return rev | ||
| 736 | |||
| 737 | return "<unknown>" | ||
| 738 | |||
| 739 | def base_detect_branch(d): | ||
| 740 | path = base_get_scmbasepath(d) | ||
| 741 | |||
| 742 | scms = [base_get_metadata_git_branch] | ||
| 743 | |||
| 744 | for scm in scms: | ||
| 745 | rev = scm(path, d) | ||
| 746 | if rev <> "<unknown>": | ||
| 747 | return rev.strip() | ||
| 748 | |||
| 749 | return "<unknown>" | ||
| 750 | |||
| 751 | |||
| 752 | |||
| 753 | def base_get_scmbasepath(d): | ||
| 754 | path_to_bbfiles = bb.data.getVar( 'BBFILES', d, 1 ).split() | ||
| 755 | return path_to_bbfiles[0][:path_to_bbfiles[0].rindex( "packages" )] | ||
| 756 | |||
| 757 | def base_get_metadata_monotone_branch(path, d): | ||
| 758 | monotone_branch = "<unknown>" | ||
| 759 | try: | ||
| 760 | monotone_branch = file( "%s/_MTN/options" % path ).read().strip() | ||
| 761 | if monotone_branch.startswith( "database" ): | ||
| 762 | monotone_branch_words = monotone_branch.split() | ||
| 763 | monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1] | ||
| 764 | except: | ||
| 765 | pass | ||
| 766 | return monotone_branch | ||
| 767 | |||
| 768 | def base_get_metadata_monotone_revision(path, d): | ||
| 769 | monotone_revision = "<unknown>" | ||
| 770 | try: | ||
| 771 | monotone_revision = file( "%s/_MTN/revision" % path ).read().strip() | ||
| 772 | if monotone_revision.startswith( "format_version" ): | ||
| 773 | monotone_revision_words = monotone_revision.split() | ||
| 774 | monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1] | ||
| 775 | except IOError: | ||
| 776 | pass | ||
| 777 | return monotone_revision | ||
| 778 | |||
| 779 | def base_get_metadata_svn_revision(path, d): | ||
| 780 | revision = "<unknown>" | ||
| 781 | try: | ||
| 782 | revision = file( "%s/.svn/entries" % path ).readlines()[3].strip() | ||
| 783 | except IOError: | ||
| 784 | pass | ||
| 785 | return revision | ||
| 786 | |||
| 787 | def base_get_metadata_git_branch(path, d): | ||
| 788 | branch = os.popen('cd %s; git branch | grep "^* " | tr -d "* "' % path).read() | ||
| 789 | |||
| 790 | if len(branch) != 0: | ||
| 791 | return branch | ||
| 792 | return "<unknown>" | ||
| 793 | |||
| 794 | def base_get_metadata_git_revision(path, d): | ||
| 795 | rev = os.popen("cd %s; git log -n 1 --pretty=oneline --" % path).read().split(" ")[0] | ||
| 796 | if len(rev) != 0: | ||
| 797 | return rev | ||
| 798 | return "<unknown>" | ||
| 799 | 293 | ||
| 800 | GIT_CONFIG = "${STAGING_DIR_NATIVE}/usr/etc/gitconfig" | 294 | GIT_CONFIG = "${STAGING_DIR_NATIVE}/usr/etc/gitconfig" |
| 801 | 295 | ||
| @@ -909,145 +403,7 @@ base_do_compile() { | |||
| 909 | fi | 403 | fi |
| 910 | } | 404 | } |
| 911 | 405 | ||
| 912 | 406 | inherit staging | |
| 913 | sysroot_stage_dir() { | ||
| 914 | src="$1" | ||
| 915 | dest="$2" | ||
| 916 | # This will remove empty directories so we can ignore them | ||
| 917 | rmdir "$src" 2> /dev/null || true | ||
| 918 | if [ -d "$src" ]; then | ||
| 919 | mkdir -p "$dest" | ||
| 920 | cp -fpPR "$src"/* "$dest" | ||
| 921 | fi | ||
| 922 | } | ||
| 923 | |||
| 924 | sysroot_stage_libdir() { | ||
| 925 | src="$1" | ||
| 926 | dest="$2" | ||
| 927 | |||
| 928 | olddir=`pwd` | ||
| 929 | cd $src | ||
| 930 | las=$(find . -name \*.la -type f) | ||
| 931 | cd $olddir | ||
| 932 | echo "Found la files: $las" | ||
| 933 | for i in $las | ||
| 934 | do | ||
| 935 | sed -e 's/^installed=yes$/installed=no/' \ | ||
| 936 | -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' \ | ||
| 937 | -e "/^dependency_libs=/s,\([[:space:]']\)${libdir},\1${STAGING_LIBDIR},g" \ | ||
| 938 | -i $src/$i | ||
| 939 | done | ||
| 940 | sysroot_stage_dir $src $dest | ||
| 941 | } | ||
| 942 | |||
| 943 | sysroot_stage_dirs() { | ||
| 944 | from="$1" | ||
| 945 | to="$2" | ||
| 946 | |||
| 947 | sysroot_stage_dir $from${includedir} $to${STAGING_INCDIR} | ||
| 948 | if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then | ||
| 949 | sysroot_stage_dir $from${bindir} $to${STAGING_DIR_HOST}${bindir} | ||
| 950 | sysroot_stage_dir $from${sbindir} $to${STAGING_DIR_HOST}${sbindir} | ||
| 951 | sysroot_stage_dir $from${base_bindir} $to${STAGING_DIR_HOST}${base_bindir} | ||
| 952 | sysroot_stage_dir $from${base_sbindir} $to${STAGING_DIR_HOST}${base_sbindir} | ||
| 953 | sysroot_stage_dir $from${libexecdir} $to${STAGING_DIR_HOST}${libexecdir} | ||
| 954 | sysroot_stage_dir $from${sysconfdir} $to${STAGING_DIR_HOST}${sysconfdir} | ||
| 955 | fi | ||
| 956 | if [ -d $from${libdir} ] | ||
| 957 | then | ||
| 958 | sysroot_stage_libdir $from/${libdir} $to${STAGING_LIBDIR} | ||
| 959 | fi | ||
| 960 | if [ -d $from${base_libdir} ] | ||
| 961 | then | ||
| 962 | sysroot_stage_libdir $from${base_libdir} $to${STAGING_DIR_HOST}${base_libdir} | ||
| 963 | fi | ||
| 964 | sysroot_stage_dir $from${datadir} $to${STAGING_DATADIR} | ||
| 965 | } | ||
| 966 | |||
| 967 | sysroot_stage_all() { | ||
| 968 | sysroot_stage_dirs ${D} ${SYSROOT_DESTDIR} | ||
| 969 | } | ||
| 970 | |||
| 971 | def is_legacy_staging(d): | ||
| 972 | stagefunc = bb.data.getVar('do_stage', d, True) | ||
| 973 | legacy = True | ||
| 974 | if stagefunc is None: | ||
| 975 | legacy = False | ||
| 976 | elif stagefunc.strip() == "use_do_install_for_stage": | ||
| 977 | legacy = False | ||
| 978 | elif stagefunc.strip() == "autotools_stage_all": | ||
| 979 | legacy = False | ||
| 980 | elif stagefunc.strip() == "do_stage_native" and bb.data.getVar('AUTOTOOLS_NATIVE_STAGE_INSTALL', d, 1) == "1": | ||
| 981 | legacy = False | ||
| 982 | elif bb.data.getVar('NATIVE_INSTALL_WORKS', d, 1) == "1": | ||
| 983 | legacy = False | ||
| 984 | return legacy | ||
| 985 | |||
| 986 | do_populate_sysroot[dirs] = "${STAGING_DIR_TARGET}/${bindir} ${STAGING_DIR_TARGET}/${libdir} \ | ||
| 987 | ${STAGING_DIR_TARGET}/${includedir} \ | ||
| 988 | ${STAGING_BINDIR_NATIVE} ${STAGING_LIBDIR_NATIVE} \ | ||
| 989 | ${STAGING_INCDIR_NATIVE} \ | ||
| 990 | ${STAGING_DATADIR} \ | ||
| 991 | ${S} ${B}" | ||
| 992 | |||
| 993 | # Could be compile but populate_sysroot and do_install shouldn't run at the same time | ||
| 994 | addtask populate_sysroot after do_install | ||
| 995 | |||
| 996 | PSTAGING_ACTIVE = "0" | ||
| 997 | SYSROOT_PREPROCESS_FUNCS ?= "" | ||
| 998 | SYSROOT_DESTDIR = "${WORKDIR}/sysroot-destdir/" | ||
| 999 | SYSROOT_LOCK = "${STAGING_DIR}/staging.lock" | ||
| 1000 | |||
| 1001 | python populate_sysroot_prehook () { | ||
| 1002 | return | ||
| 1003 | } | ||
| 1004 | |||
| 1005 | python populate_sysroot_posthook () { | ||
| 1006 | return | ||
| 1007 | } | ||
| 1008 | |||
| 1009 | packagedstaging_fastpath () { | ||
| 1010 | : | ||
| 1011 | } | ||
| 1012 | |||
| 1013 | python do_populate_sysroot () { | ||
| 1014 | # | ||
| 1015 | # if do_stage exists, we're legacy. In that case run the do_stage, | ||
| 1016 | # modify the SYSROOT_DESTDIR variable and then run the staging preprocess | ||
| 1017 | # functions against staging directly. | ||
| 1018 | # | ||
| 1019 | # Otherwise setup a destdir, copy the results from do_install | ||
| 1020 | # and run the staging preprocess against that | ||
| 1021 | # | ||
| 1022 | pstageactive = (bb.data.getVar("PSTAGING_ACTIVE", d, True) == "1") | ||
| 1023 | lockfile = bb.data.getVar("SYSROOT_LOCK", d, True) | ||
| 1024 | stagefunc = bb.data.getVar('do_stage', d, True) | ||
| 1025 | legacy = is_legacy_staging(d) | ||
| 1026 | if legacy: | ||
| 1027 | bb.data.setVar("SYSROOT_DESTDIR", "", d) | ||
| 1028 | bb.note("Legacy staging mode for %s" % bb.data.getVar("FILE", d, True)) | ||
| 1029 | lock = bb.utils.lockfile(lockfile) | ||
| 1030 | bb.build.exec_func('populate_sysroot_prehook', d) | ||
| 1031 | bb.build.exec_func('do_stage', d) | ||
| 1032 | for f in (bb.data.getVar('SYSROOT_PREPROCESS_FUNCS', d, True) or '').split(): | ||
| 1033 | bb.build.exec_func(f, d) | ||
| 1034 | bb.build.exec_func('populate_sysroot_posthook', d) | ||
| 1035 | bb.utils.unlockfile(lock) | ||
| 1036 | else: | ||
| 1037 | dest = bb.data.getVar('D', d, True) | ||
| 1038 | sysrootdest = bb.data.expand('${SYSROOT_DESTDIR}${STAGING_DIR_TARGET}', d) | ||
| 1039 | bb.mkdirhier(sysrootdest) | ||
| 1040 | |||
| 1041 | bb.build.exec_func("sysroot_stage_all", d) | ||
| 1042 | #os.system('cp -pPR %s/* %s/' % (dest, sysrootdest)) | ||
| 1043 | for f in (bb.data.getVar('SYSROOT_PREPROCESS_FUNCS', d, True) or '').split(): | ||
| 1044 | bb.build.exec_func(f, d) | ||
| 1045 | bb.build.exec_func("packagedstaging_fastpath", d) | ||
| 1046 | |||
| 1047 | lock = bb.utils.lockfile(lockfile) | ||
| 1048 | os.system(bb.data.expand('cp -pPR ${SYSROOT_DESTDIR}${TMPDIR}/* ${TMPDIR}/', d)) | ||
| 1049 | bb.utils.unlockfile(lock) | ||
| 1050 | } | ||
| 1051 | 407 | ||
| 1052 | addtask install after do_compile | 408 | addtask install after do_compile |
| 1053 | do_install[dirs] = "${D} ${S} ${B}" | 409 | do_install[dirs] = "${D} ${S} ${B}" |
| @@ -1066,19 +422,6 @@ addtask build after do_populate_sysroot | |||
| 1066 | do_build = "" | 422 | do_build = "" |
| 1067 | do_build[func] = "1" | 423 | do_build[func] = "1" |
| 1068 | 424 | ||
| 1069 | # Make sure MACHINE isn't exported | ||
| 1070 | # (breaks binutils at least) | ||
| 1071 | MACHINE[unexport] = "1" | ||
| 1072 | |||
| 1073 | # Make sure TARGET_ARCH isn't exported | ||
| 1074 | # (breaks Makefiles using implicit rules, e.g. quilt, as GNU make has this | ||
| 1075 | # in them, undocumented) | ||
| 1076 | TARGET_ARCH[unexport] = "1" | ||
| 1077 | |||
| 1078 | # Make sure DISTRO isn't exported | ||
| 1079 | # (breaks sysvinit at least) | ||
| 1080 | DISTRO[unexport] = "1" | ||
| 1081 | |||
| 1082 | 425 | ||
| 1083 | def base_after_parse(d): | 426 | def base_after_parse(d): |
| 1084 | import exceptions | 427 | import exceptions |
| @@ -1176,7 +519,7 @@ def base_after_parse(d): | |||
| 1176 | for pkg in packages: | 519 | for pkg in packages: |
| 1177 | pkgarch = bb.data.getVar("PACKAGE_ARCH_%s" % pkg, d, 1) | 520 | pkgarch = bb.data.getVar("PACKAGE_ARCH_%s" % pkg, d, 1) |
| 1178 | 521 | ||
| 1179 | # We could look for != PACKAGE_ARCH here but how to choose | 522 | # We could look for != PACKAGE_ARCH here but how to choose |
| 1180 | # if multiple differences are present? | 523 | # if multiple differences are present? |
| 1181 | # Look through PACKAGE_ARCHS for the priority order? | 524 | # Look through PACKAGE_ARCHS for the priority order? |
| 1182 | if pkgarch and pkgarch == mach_arch: | 525 | if pkgarch and pkgarch == mach_arch: |
| @@ -1187,8 +530,6 @@ def base_after_parse(d): | |||
| 1187 | 530 | ||
| 1188 | python () { | 531 | python () { |
| 1189 | base_after_parse(d) | 532 | base_after_parse(d) |
| 1190 | if is_legacy_staging(d): | ||
| 1191 | bb.note("Legacy staging mode for %s" % bb.data.getVar("FILE", d, True)) | ||
| 1192 | } | 533 | } |
| 1193 | 534 | ||
| 1194 | def check_app_exists(app, d): | 535 | def check_app_exists(app, d): |
| @@ -1211,63 +552,7 @@ def check_gcc3(data): | |||
| 1211 | # Patch handling | 552 | # Patch handling |
| 1212 | inherit patch | 553 | inherit patch |
| 1213 | 554 | ||
| 1214 | EXPORT_FUNCTIONS do_setscene do_clean do_fetch do_unpack do_configure do_compile do_install do_package do_populate_pkgs do_rebuild do_fetchall | 555 | EXPORT_FUNCTIONS do_setscene do_fetch do_unpack do_configure do_compile do_install do_package |
| 1215 | |||
| 1216 | MIRRORS[func] = "0" | ||
| 1217 | MIRRORS () { | ||
| 1218 | ${DEBIAN_MIRROR}/main http://snapshot.debian.net/archive/pool | ||
| 1219 | ${DEBIAN_MIRROR} ftp://ftp.de.debian.org/debian/pool | ||
| 1220 | ${DEBIAN_MIRROR} ftp://ftp.au.debian.org/debian/pool | ||
| 1221 | ${DEBIAN_MIRROR} ftp://ftp.cl.debian.org/debian/pool | ||
| 1222 | ${DEBIAN_MIRROR} ftp://ftp.hr.debian.org/debian/pool | ||
| 1223 | ${DEBIAN_MIRROR} ftp://ftp.fi.debian.org/debian/pool | ||
| 1224 | ${DEBIAN_MIRROR} ftp://ftp.hk.debian.org/debian/pool | ||
| 1225 | ${DEBIAN_MIRROR} ftp://ftp.hu.debian.org/debian/pool | ||
| 1226 | ${DEBIAN_MIRROR} ftp://ftp.ie.debian.org/debian/pool | ||
| 1227 | ${DEBIAN_MIRROR} ftp://ftp.it.debian.org/debian/pool | ||
| 1228 | ${DEBIAN_MIRROR} ftp://ftp.jp.debian.org/debian/pool | ||
| 1229 | ${DEBIAN_MIRROR} ftp://ftp.no.debian.org/debian/pool | ||
| 1230 | ${DEBIAN_MIRROR} ftp://ftp.pl.debian.org/debian/pool | ||
| 1231 | ${DEBIAN_MIRROR} ftp://ftp.ro.debian.org/debian/pool | ||
| 1232 | ${DEBIAN_MIRROR} ftp://ftp.si.debian.org/debian/pool | ||
| 1233 | ${DEBIAN_MIRROR} ftp://ftp.es.debian.org/debian/pool | ||
| 1234 | ${DEBIAN_MIRROR} ftp://ftp.se.debian.org/debian/pool | ||
| 1235 | ${DEBIAN_MIRROR} ftp://ftp.tr.debian.org/debian/pool | ||
| 1236 | ${GNU_MIRROR} ftp://mirrors.kernel.org/gnu | ||
| 1237 | ${GNU_MIRROR} ftp://ftp.matrix.com.br/pub/gnu | ||
| 1238 | ${GNU_MIRROR} ftp://ftp.cs.ubc.ca/mirror2/gnu | ||
| 1239 | ${GNU_MIRROR} ftp://sunsite.ust.hk/pub/gnu | ||
| 1240 | ${GNU_MIRROR} ftp://ftp.ayamura.org/pub/gnu | ||
| 1241 | ${KERNELORG_MIRROR} http://www.kernel.org/pub | ||
| 1242 | ${KERNELORG_MIRROR} ftp://ftp.us.kernel.org/pub | ||
| 1243 | ${KERNELORG_MIRROR} ftp://ftp.uk.kernel.org/pub | ||
| 1244 | ${KERNELORG_MIRROR} ftp://ftp.hk.kernel.org/pub | ||
| 1245 | ${KERNELORG_MIRROR} ftp://ftp.au.kernel.org/pub | ||
| 1246 | ${KERNELORG_MIRROR} ftp://ftp.jp.kernel.org/pub | ||
| 1247 | ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/ | ||
| 1248 | ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.surfnet.nl/pub/security/gnupg/ | ||
| 1249 | ftp://ftp.gnupg.org/gcrypt/ http://gulus.USherbrooke.ca/pub/appl/GnuPG/ | ||
| 1250 | ftp://dante.ctan.org/tex-archive ftp://ftp.fu-berlin.de/tex/CTAN | ||
| 1251 | ftp://dante.ctan.org/tex-archive http://sunsite.sut.ac.jp/pub/archives/ctan/ | ||
| 1252 | ftp://dante.ctan.org/tex-archive http://ctan.unsw.edu.au/ | ||
| 1253 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.gnutls.org/pub/gnutls/ | ||
| 1254 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.gnupg.org/gcrypt/gnutls/ | ||
| 1255 | ftp://ftp.gnutls.org/pub/gnutls http://www.mirrors.wiretapped.net/security/network-security/gnutls/ | ||
| 1256 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.mirrors.wiretapped.net/pub/security/network-security/gnutls/ | ||
| 1257 | ftp://ftp.gnutls.org/pub/gnutls http://josefsson.org/gnutls/releases/ | ||
| 1258 | http://ftp.info-zip.org/pub/infozip/src/ http://mirror.switch.ch/ftp/mirror/infozip/src/ | ||
| 1259 | http://ftp.info-zip.org/pub/infozip/src/ ftp://sunsite.icm.edu.pl/pub/unix/archiving/info-zip/src/ | ||
| 1260 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/ | ||
| 1261 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tau.ac.il/pub/unix/admin/ | ||
| 1262 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.cert.dfn.de/pub/tools/admin/lsof/ | ||
| 1263 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/ | ||
| 1264 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.kaizo.org/pub/lsof/ | ||
| 1265 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tu-darmstadt.de/pub/sysadmin/lsof/ | ||
| 1266 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tux.org/pub/sites/vic.cc.purdue.edu/tools/unix/lsof/ | ||
| 1267 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://gd.tuwien.ac.at/utils/admin-tools/lsof/ | ||
| 1268 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ | ||
| 1269 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://the.wiretapped.net/pub/security/host-security/lsof/ | ||
| 1270 | http://www.apache.org/dist http://archive.apache.org/dist | ||
| 1271 | 556 | ||
| 1272 | } | 557 | inherit mirrors |
| 1273 | 558 | ||
diff --git a/meta/classes/metadata_scm.bbclass b/meta/classes/metadata_scm.bbclass new file mode 100644 index 0000000000..4f66011b0d --- /dev/null +++ b/meta/classes/metadata_scm.bbclass | |||
| @@ -0,0 +1,77 @@ | |||
| 1 | METADATA_BRANCH ?= "${@base_detect_branch(d)}" | ||
| 2 | METADATA_REVISION ?= "${@base_detect_revision(d)}" | ||
| 3 | |||
| 4 | def base_detect_revision(d): | ||
| 5 | path = base_get_scmbasepath(d) | ||
| 6 | |||
| 7 | scms = [base_get_metadata_git_revision, \ | ||
| 8 | base_get_metadata_svn_revision] | ||
| 9 | |||
| 10 | for scm in scms: | ||
| 11 | rev = scm(path, d) | ||
| 12 | if rev <> "<unknown>": | ||
| 13 | return rev | ||
| 14 | |||
| 15 | return "<unknown>" | ||
| 16 | |||
| 17 | def base_detect_branch(d): | ||
| 18 | path = base_get_scmbasepath(d) | ||
| 19 | |||
| 20 | scms = [base_get_metadata_git_branch] | ||
| 21 | |||
| 22 | for scm in scms: | ||
| 23 | rev = scm(path, d) | ||
| 24 | if rev <> "<unknown>": | ||
| 25 | return rev.strip() | ||
| 26 | |||
| 27 | return "<unknown>" | ||
| 28 | |||
| 29 | |||
| 30 | |||
| 31 | def base_get_scmbasepath(d): | ||
| 32 | path_to_bbfiles = bb.data.getVar( 'BBFILES', d, 1 ).split() | ||
| 33 | return path_to_bbfiles[0][:path_to_bbfiles[0].rindex( "packages" )] | ||
| 34 | |||
| 35 | def base_get_metadata_monotone_branch(path, d): | ||
| 36 | monotone_branch = "<unknown>" | ||
| 37 | try: | ||
| 38 | monotone_branch = file( "%s/_MTN/options" % path ).read().strip() | ||
| 39 | if monotone_branch.startswith( "database" ): | ||
| 40 | monotone_branch_words = monotone_branch.split() | ||
| 41 | monotone_branch = monotone_branch_words[ monotone_branch_words.index( "branch" )+1][1:-1] | ||
| 42 | except: | ||
| 43 | pass | ||
| 44 | return monotone_branch | ||
| 45 | |||
| 46 | def base_get_metadata_monotone_revision(path, d): | ||
| 47 | monotone_revision = "<unknown>" | ||
| 48 | try: | ||
| 49 | monotone_revision = file( "%s/_MTN/revision" % path ).read().strip() | ||
| 50 | if monotone_revision.startswith( "format_version" ): | ||
| 51 | monotone_revision_words = monotone_revision.split() | ||
| 52 | monotone_revision = monotone_revision_words[ monotone_revision_words.index( "old_revision" )+1][1:-1] | ||
| 53 | except IOError: | ||
| 54 | pass | ||
| 55 | return monotone_revision | ||
| 56 | |||
| 57 | def base_get_metadata_svn_revision(path, d): | ||
| 58 | revision = "<unknown>" | ||
| 59 | try: | ||
| 60 | revision = file( "%s/.svn/entries" % path ).readlines()[3].strip() | ||
| 61 | except IOError: | ||
| 62 | pass | ||
| 63 | return revision | ||
| 64 | |||
| 65 | def base_get_metadata_git_branch(path, d): | ||
| 66 | branch = os.popen('cd %s; git branch | grep "^* " | tr -d "* "' % path).read() | ||
| 67 | |||
| 68 | if len(branch) != 0: | ||
| 69 | return branch | ||
| 70 | return "<unknown>" | ||
| 71 | |||
| 72 | def base_get_metadata_git_revision(path, d): | ||
| 73 | rev = os.popen("cd %s; git log -n 1 --pretty=oneline --" % path).read().split(" ")[0] | ||
| 74 | if len(rev) != 0: | ||
| 75 | return rev | ||
| 76 | return "<unknown>" | ||
| 77 | |||
diff --git a/meta/classes/mirrors.bbclass b/meta/classes/mirrors.bbclass new file mode 100644 index 0000000000..9b430abcee --- /dev/null +++ b/meta/classes/mirrors.bbclass | |||
| @@ -0,0 +1,58 @@ | |||
| 1 | MIRRORS[func] = "0" | ||
| 2 | MIRRORS () { | ||
| 3 | ${DEBIAN_MIRROR}/main http://snapshot.debian.net/archive/pool | ||
| 4 | ${DEBIAN_MIRROR} ftp://ftp.de.debian.org/debian/pool | ||
| 5 | ${DEBIAN_MIRROR} ftp://ftp.au.debian.org/debian/pool | ||
| 6 | ${DEBIAN_MIRROR} ftp://ftp.cl.debian.org/debian/pool | ||
| 7 | ${DEBIAN_MIRROR} ftp://ftp.hr.debian.org/debian/pool | ||
| 8 | ${DEBIAN_MIRROR} ftp://ftp.fi.debian.org/debian/pool | ||
| 9 | ${DEBIAN_MIRROR} ftp://ftp.hk.debian.org/debian/pool | ||
| 10 | ${DEBIAN_MIRROR} ftp://ftp.hu.debian.org/debian/pool | ||
| 11 | ${DEBIAN_MIRROR} ftp://ftp.ie.debian.org/debian/pool | ||
| 12 | ${DEBIAN_MIRROR} ftp://ftp.it.debian.org/debian/pool | ||
| 13 | ${DEBIAN_MIRROR} ftp://ftp.jp.debian.org/debian/pool | ||
| 14 | ${DEBIAN_MIRROR} ftp://ftp.no.debian.org/debian/pool | ||
| 15 | ${DEBIAN_MIRROR} ftp://ftp.pl.debian.org/debian/pool | ||
| 16 | ${DEBIAN_MIRROR} ftp://ftp.ro.debian.org/debian/pool | ||
| 17 | ${DEBIAN_MIRROR} ftp://ftp.si.debian.org/debian/pool | ||
| 18 | ${DEBIAN_MIRROR} ftp://ftp.es.debian.org/debian/pool | ||
| 19 | ${DEBIAN_MIRROR} ftp://ftp.se.debian.org/debian/pool | ||
| 20 | ${DEBIAN_MIRROR} ftp://ftp.tr.debian.org/debian/pool | ||
| 21 | ${GNU_MIRROR} ftp://mirrors.kernel.org/gnu | ||
| 22 | ${GNU_MIRROR} ftp://ftp.matrix.com.br/pub/gnu | ||
| 23 | ${GNU_MIRROR} ftp://ftp.cs.ubc.ca/mirror2/gnu | ||
| 24 | ${GNU_MIRROR} ftp://sunsite.ust.hk/pub/gnu | ||
| 25 | ${GNU_MIRROR} ftp://ftp.ayamura.org/pub/gnu | ||
| 26 | ${KERNELORG_MIRROR} http://www.kernel.org/pub | ||
| 27 | ${KERNELORG_MIRROR} ftp://ftp.us.kernel.org/pub | ||
| 28 | ${KERNELORG_MIRROR} ftp://ftp.uk.kernel.org/pub | ||
| 29 | ${KERNELORG_MIRROR} ftp://ftp.hk.kernel.org/pub | ||
| 30 | ${KERNELORG_MIRROR} ftp://ftp.au.kernel.org/pub | ||
| 31 | ${KERNELORG_MIRROR} ftp://ftp.jp.kernel.org/pub | ||
| 32 | ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.franken.de/pub/crypt/mirror/ftp.gnupg.org/gcrypt/ | ||
| 33 | ftp://ftp.gnupg.org/gcrypt/ ftp://ftp.surfnet.nl/pub/security/gnupg/ | ||
| 34 | ftp://ftp.gnupg.org/gcrypt/ http://gulus.USherbrooke.ca/pub/appl/GnuPG/ | ||
| 35 | ftp://dante.ctan.org/tex-archive ftp://ftp.fu-berlin.de/tex/CTAN | ||
| 36 | ftp://dante.ctan.org/tex-archive http://sunsite.sut.ac.jp/pub/archives/ctan/ | ||
| 37 | ftp://dante.ctan.org/tex-archive http://ctan.unsw.edu.au/ | ||
| 38 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.gnutls.org/pub/gnutls/ | ||
| 39 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.gnupg.org/gcrypt/gnutls/ | ||
| 40 | ftp://ftp.gnutls.org/pub/gnutls http://www.mirrors.wiretapped.net/security/network-security/gnutls/ | ||
| 41 | ftp://ftp.gnutls.org/pub/gnutls ftp://ftp.mirrors.wiretapped.net/pub/security/network-security/gnutls/ | ||
| 42 | ftp://ftp.gnutls.org/pub/gnutls http://josefsson.org/gnutls/releases/ | ||
| 43 | http://ftp.info-zip.org/pub/infozip/src/ http://mirror.switch.ch/ftp/mirror/infozip/src/ | ||
| 44 | http://ftp.info-zip.org/pub/infozip/src/ ftp://sunsite.icm.edu.pl/pub/unix/archiving/info-zip/src/ | ||
| 45 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.cerias.purdue.edu/pub/tools/unix/sysutils/lsof/ | ||
| 46 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tau.ac.il/pub/unix/admin/ | ||
| 47 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.cert.dfn.de/pub/tools/admin/lsof/ | ||
| 48 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.fu-berlin.de/pub/unix/tools/lsof/ | ||
| 49 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.kaizo.org/pub/lsof/ | ||
| 50 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tu-darmstadt.de/pub/sysadmin/lsof/ | ||
| 51 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://ftp.tux.org/pub/sites/vic.cc.purdue.edu/tools/unix/lsof/ | ||
| 52 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://gd.tuwien.ac.at/utils/admin-tools/lsof/ | ||
| 53 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://sunsite.ualberta.ca/pub/Mirror/lsof/ | ||
| 54 | ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/ ftp://the.wiretapped.net/pub/security/host-security/lsof/ | ||
| 55 | http://www.apache.org/dist http://archive.apache.org/dist | ||
| 56 | |||
| 57 | } | ||
| 58 | |||
diff --git a/meta/classes/staging.bbclass b/meta/classes/staging.bbclass new file mode 100644 index 0000000000..e03ed2a5ef --- /dev/null +++ b/meta/classes/staging.bbclass | |||
| @@ -0,0 +1,146 @@ | |||
| 1 | python populate_sysroot_prehook () { | ||
| 2 | return | ||
| 3 | } | ||
| 4 | |||
| 5 | python populate_sysroot_posthook () { | ||
| 6 | return | ||
| 7 | } | ||
| 8 | |||
| 9 | packagedstaging_fastpath () { | ||
| 10 | : | ||
| 11 | } | ||
| 12 | |||
| 13 | sysroot_stage_dir() { | ||
| 14 | src="$1" | ||
| 15 | dest="$2" | ||
| 16 | # This will remove empty directories so we can ignore them | ||
| 17 | rmdir "$src" 2> /dev/null || true | ||
| 18 | if [ -d "$src" ]; then | ||
| 19 | mkdir -p "$dest" | ||
| 20 | cp -fpPR "$src"/* "$dest" | ||
| 21 | fi | ||
| 22 | } | ||
| 23 | |||
| 24 | sysroot_stage_libdir() { | ||
| 25 | src="$1" | ||
| 26 | dest="$2" | ||
| 27 | |||
| 28 | olddir=`pwd` | ||
| 29 | cd $src | ||
| 30 | las=$(find . -name \*.la -type f) | ||
| 31 | cd $olddir | ||
| 32 | echo "Found la files: $las" | ||
| 33 | for i in $las | ||
| 34 | do | ||
| 35 | sed -e 's/^installed=yes$/installed=no/' \ | ||
| 36 | -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' \ | ||
| 37 | -e "/^dependency_libs=/s,\([[:space:]']\)${libdir},\1${STAGING_LIBDIR},g" \ | ||
| 38 | -i $src/$i | ||
| 39 | done | ||
| 40 | sysroot_stage_dir $src $dest | ||
| 41 | } | ||
| 42 | |||
| 43 | sysroot_stage_dirs() { | ||
| 44 | from="$1" | ||
| 45 | to="$2" | ||
| 46 | |||
| 47 | sysroot_stage_dir $from${includedir} $to${STAGING_INCDIR} | ||
| 48 | if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then | ||
| 49 | sysroot_stage_dir $from${bindir} $to${STAGING_DIR_HOST}${bindir} | ||
| 50 | sysroot_stage_dir $from${sbindir} $to${STAGING_DIR_HOST}${sbindir} | ||
| 51 | sysroot_stage_dir $from${base_bindir} $to${STAGING_DIR_HOST}${base_bindir} | ||
| 52 | sysroot_stage_dir $from${base_sbindir} $to${STAGING_DIR_HOST}${base_sbindir} | ||
| 53 | sysroot_stage_dir $from${libexecdir} $to${STAGING_DIR_HOST}${libexecdir} | ||
| 54 | sysroot_stage_dir $from${sysconfdir} $to${STAGING_DIR_HOST}${sysconfdir} | ||
| 55 | fi | ||
| 56 | if [ -d $from${libdir} ] | ||
| 57 | then | ||
| 58 | sysroot_stage_libdir $from/${libdir} $to${STAGING_LIBDIR} | ||
| 59 | fi | ||
| 60 | if [ -d $from${base_libdir} ] | ||
| 61 | then | ||
| 62 | sysroot_stage_libdir $from${base_libdir} $to${STAGING_DIR_HOST}${base_libdir} | ||
| 63 | fi | ||
| 64 | sysroot_stage_dir $from${datadir} $to${STAGING_DATADIR} | ||
| 65 | } | ||
| 66 | |||
| 67 | sysroot_stage_all() { | ||
| 68 | sysroot_stage_dirs ${D} ${SYSROOT_DESTDIR} | ||
| 69 | } | ||
| 70 | |||
| 71 | def is_legacy_staging(d): | ||
| 72 | stagefunc = bb.data.getVar('do_stage', d, True) | ||
| 73 | legacy = True | ||
| 74 | if stagefunc is None: | ||
| 75 | legacy = False | ||
| 76 | elif stagefunc.strip() == "use_do_install_for_stage": | ||
| 77 | legacy = False | ||
| 78 | elif stagefunc.strip() == "autotools_stage_all": | ||
| 79 | legacy = False | ||
| 80 | elif stagefunc.strip() == "do_stage_native" and bb.data.getVar('AUTOTOOLS_NATIVE_STAGE_INSTALL', d, 1) == "1": | ||
| 81 | legacy = False | ||
| 82 | elif bb.data.getVar('NATIVE_INSTALL_WORKS', d, 1) == "1": | ||
| 83 | legacy = False | ||
| 84 | return legacy | ||
| 85 | |||
| 86 | do_populate_sysroot[dirs] = "${STAGING_DIR_TARGET}/${bindir} ${STAGING_DIR_TARGET}/${libdir} \ | ||
| 87 | ${STAGING_DIR_TARGET}/${includedir} \ | ||
| 88 | ${STAGING_BINDIR_NATIVE} ${STAGING_LIBDIR_NATIVE} \ | ||
| 89 | ${STAGING_INCDIR_NATIVE} \ | ||
| 90 | ${STAGING_DATADIR} \ | ||
| 91 | ${S} ${B}" | ||
| 92 | |||
| 93 | # Could be compile but populate_sysroot and do_install shouldn't run at the same time | ||
| 94 | addtask populate_sysroot after do_install | ||
| 95 | |||
| 96 | PSTAGING_ACTIVE = "0" | ||
| 97 | SYSROOT_PREPROCESS_FUNCS ?= "" | ||
| 98 | SYSROOT_DESTDIR = "${WORKDIR}/sysroot-destdir/" | ||
| 99 | SYSROOT_LOCK = "${STAGING_DIR}/staging.lock" | ||
| 100 | |||
| 101 | |||
| 102 | python do_populate_sysroot () { | ||
| 103 | # | ||
| 104 | # if do_stage exists, we're legacy. In that case run the do_stage, | ||
| 105 | # modify the SYSROOT_DESTDIR variable and then run the staging preprocess | ||
| 106 | # functions against staging directly. | ||
| 107 | # | ||
| 108 | # Otherwise setup a destdir, copy the results from do_install | ||
| 109 | # and run the staging preprocess against that | ||
| 110 | # | ||
| 111 | pstageactive = (bb.data.getVar("PSTAGING_ACTIVE", d, True) == "1") | ||
| 112 | lockfile = bb.data.getVar("SYSROOT_LOCK", d, True) | ||
| 113 | stagefunc = bb.data.getVar('do_stage', d, True) | ||
| 114 | legacy = is_legacy_staging(d) | ||
| 115 | if legacy: | ||
| 116 | bb.data.setVar("SYSROOT_DESTDIR", "", d) | ||
| 117 | bb.note("Legacy staging mode for %s" % bb.data.getVar("FILE", d, True)) | ||
| 118 | lock = bb.utils.lockfile(lockfile) | ||
| 119 | bb.build.exec_func('populate_sysroot_prehook', d) | ||
| 120 | bb.build.exec_func('do_stage', d) | ||
| 121 | for f in (bb.data.getVar('SYSROOT_PREPROCESS_FUNCS', d, True) or '').split(): | ||
| 122 | bb.build.exec_func(f, d) | ||
| 123 | bb.build.exec_func('populate_sysroot_posthook', d) | ||
| 124 | bb.utils.unlockfile(lock) | ||
| 125 | else: | ||
| 126 | dest = bb.data.getVar('D', d, True) | ||
| 127 | sysrootdest = bb.data.expand('${SYSROOT_DESTDIR}${STAGING_DIR_TARGET}', d) | ||
| 128 | bb.mkdirhier(sysrootdest) | ||
| 129 | |||
| 130 | bb.build.exec_func("sysroot_stage_all", d) | ||
| 131 | #os.system('cp -pPR %s/* %s/' % (dest, sysrootdest)) | ||
| 132 | for f in (bb.data.getVar('SYSROOT_PREPROCESS_FUNCS', d, True) or '').split(): | ||
| 133 | bb.build.exec_func(f, d) | ||
| 134 | bb.build.exec_func("packagedstaging_fastpath", d) | ||
| 135 | |||
| 136 | lock = bb.utils.lockfile(lockfile) | ||
| 137 | os.system(bb.data.expand('cp -pPR ${SYSROOT_DESTDIR}${TMPDIR}/* ${TMPDIR}/', d)) | ||
| 138 | bb.utils.unlockfile(lock) | ||
| 139 | } | ||
| 140 | |||
| 141 | python () { | ||
| 142 | if is_legacy_staging(d): | ||
| 143 | bb.note("Legacy staging mode for %s" % bb.data.getVar("FILE", d, True)) | ||
| 144 | } | ||
| 145 | |||
| 146 | |||
diff --git a/meta/classes/utility-tasks.bbclass b/meta/classes/utility-tasks.bbclass new file mode 100644 index 0000000000..d4d47bfa42 --- /dev/null +++ b/meta/classes/utility-tasks.bbclass | |||
| @@ -0,0 +1,97 @@ | |||
| 1 | addtask listtasks | ||
| 2 | do_listtasks[nostamp] = "1" | ||
| 3 | python do_listtasks() { | ||
| 4 | import sys | ||
| 5 | # emit variables and shell functions | ||
| 6 | #bb.data.emit_env(sys.__stdout__, d) | ||
| 7 | # emit the metadata which isnt valid shell | ||
| 8 | for e in d.keys(): | ||
| 9 | if bb.data.getVarFlag(e, 'task', d): | ||
| 10 | sys.__stdout__.write("%s\n" % e) | ||
| 11 | } | ||
| 12 | |||
| 13 | addtask clean | ||
| 14 | do_clean[dirs] = "${TOPDIR}" | ||
| 15 | do_clean[nostamp] = "1" | ||
| 16 | python base_do_clean() { | ||
| 17 | """clear the build and temp directories""" | ||
| 18 | dir = bb.data.expand("${WORKDIR}", d) | ||
| 19 | if dir == '//': raise bb.build.FuncFailed("wrong DATADIR") | ||
| 20 | bb.note("removing " + dir) | ||
| 21 | os.system('rm -rf ' + dir) | ||
| 22 | |||
| 23 | dir = "%s.*" % bb.data.expand(bb.data.getVar('STAMP', d), d) | ||
| 24 | bb.note("removing " + dir) | ||
| 25 | os.system('rm -f '+ dir) | ||
| 26 | } | ||
| 27 | |||
| 28 | addtask rebuild after do_${BB_DEFAULT_TASK} | ||
| 29 | do_rebuild[dirs] = "${TOPDIR}" | ||
| 30 | do_rebuild[nostamp] = "1" | ||
| 31 | python base_do_rebuild() { | ||
| 32 | """rebuild a package""" | ||
| 33 | } | ||
| 34 | |||
| 35 | #addtask mrproper | ||
| 36 | #do_mrproper[dirs] = "${TOPDIR}" | ||
| 37 | #do_mrproper[nostamp] = "1" | ||
| 38 | #python base_do_mrproper() { | ||
| 39 | # """clear downloaded sources, build and temp directories""" | ||
| 40 | # dir = bb.data.expand("${DL_DIR}", d) | ||
| 41 | # if dir == '/': bb.build.FuncFailed("wrong DATADIR") | ||
| 42 | # bb.debug(2, "removing " + dir) | ||
| 43 | # os.system('rm -rf ' + dir) | ||
| 44 | # bb.build.exec_func('do_clean', d) | ||
| 45 | #} | ||
| 46 | |||
| 47 | addtask checkuri | ||
| 48 | do_checkuri[nostamp] = "1" | ||
| 49 | python do_checkuri() { | ||
| 50 | import sys | ||
| 51 | |||
| 52 | localdata = bb.data.createCopy(d) | ||
| 53 | bb.data.update_data(localdata) | ||
| 54 | |||
| 55 | src_uri = bb.data.getVar('SRC_URI', localdata, 1) | ||
| 56 | |||
| 57 | try: | ||
| 58 | bb.fetch.init(src_uri.split(),d) | ||
| 59 | except bb.fetch.NoMethodError: | ||
| 60 | (type, value, traceback) = sys.exc_info() | ||
| 61 | raise bb.build.FuncFailed("No method: %s" % value) | ||
| 62 | |||
| 63 | try: | ||
| 64 | bb.fetch.checkstatus(localdata) | ||
| 65 | except bb.fetch.MissingParameterError: | ||
| 66 | (type, value, traceback) = sys.exc_info() | ||
| 67 | raise bb.build.FuncFailed("Missing parameters: %s" % value) | ||
| 68 | except bb.fetch.FetchError: | ||
| 69 | (type, value, traceback) = sys.exc_info() | ||
| 70 | raise bb.build.FuncFailed("Fetch failed: %s" % value) | ||
| 71 | except bb.fetch.MD5SumError: | ||
| 72 | (type, value, traceback) = sys.exc_info() | ||
| 73 | raise bb.build.FuncFailed("MD5 failed: %s" % value) | ||
| 74 | except: | ||
| 75 | (type, value, traceback) = sys.exc_info() | ||
| 76 | raise bb.build.FuncFailed("Unknown fetch Error: %s" % value) | ||
| 77 | } | ||
| 78 | |||
| 79 | addtask checkuriall after do_checkuri | ||
| 80 | do_checkuriall[recrdeptask] = "do_checkuri" | ||
| 81 | do_checkuriall[nostamp] = "1" | ||
| 82 | base_do_checkuriall() { | ||
| 83 | : | ||
| 84 | } | ||
| 85 | |||
| 86 | addtask fetchall after do_fetch | ||
| 87 | do_fetchall[recrdeptask] = "do_fetch" | ||
| 88 | base_do_fetchall() { | ||
| 89 | : | ||
| 90 | } | ||
| 91 | |||
| 92 | addtask buildall after do_build | ||
| 93 | do_buildall[recrdeptask] = "do_build" | ||
| 94 | base_do_buildall() { | ||
| 95 | : | ||
| 96 | } | ||
| 97 | |||
diff --git a/meta/classes/utils.bbclass b/meta/classes/utils.bbclass new file mode 100644 index 0000000000..c2d323235b --- /dev/null +++ b/meta/classes/utils.bbclass | |||
| @@ -0,0 +1,340 @@ | |||
| 1 | # like os.path.join but doesn't treat absolute RHS specially | ||
| 2 | def base_path_join(a, *p): | ||
| 3 | path = a | ||
| 4 | for b in p: | ||
| 5 | if path == '' or path.endswith('/'): | ||
| 6 | path += b | ||
| 7 | else: | ||
| 8 | path += '/' + b | ||
| 9 | return path | ||
| 10 | |||
| 11 | # for MD5/SHA handling | ||
| 12 | def base_chk_load_parser(config_path): | ||
| 13 | import ConfigParser | ||
| 14 | parser = ConfigParser.ConfigParser() | ||
| 15 | if not len(parser.read(config_path)) == 1: | ||
| 16 | bb.note("Can not open the '%s' ini file" % config_path) | ||
| 17 | raise Exception("Can not open the '%s'" % config_path) | ||
| 18 | |||
| 19 | return parser | ||
| 20 | |||
| 21 | def base_chk_file(parser, pn, pv, src_uri, localpath, data): | ||
| 22 | no_checksum = False | ||
| 23 | # Try PN-PV-SRC_URI first and then try PN-SRC_URI | ||
| 24 | # we rely on the get method to create errors | ||
| 25 | pn_pv_src = "%s-%s-%s" % (pn,pv,src_uri) | ||
| 26 | pn_src = "%s-%s" % (pn,src_uri) | ||
| 27 | if parser.has_section(pn_pv_src): | ||
| 28 | md5 = parser.get(pn_pv_src, "md5") | ||
| 29 | sha256 = parser.get(pn_pv_src, "sha256") | ||
| 30 | elif parser.has_section(pn_src): | ||
| 31 | md5 = parser.get(pn_src, "md5") | ||
| 32 | sha256 = parser.get(pn_src, "sha256") | ||
| 33 | elif parser.has_section(src_uri): | ||
| 34 | md5 = parser.get(src_uri, "md5") | ||
| 35 | sha256 = parser.get(src_uri, "sha256") | ||
| 36 | else: | ||
| 37 | no_checksum = True | ||
| 38 | |||
| 39 | # md5 and sha256 should be valid now | ||
| 40 | if not os.path.exists(localpath): | ||
| 41 | bb.note("The localpath does not exist '%s'" % localpath) | ||
| 42 | raise Exception("The path does not exist '%s'" % localpath) | ||
| 43 | |||
| 44 | |||
| 45 | # Calculate the MD5 and 256-bit SHA checksums | ||
| 46 | md5data = bb.utils.md5_file(localpath) | ||
| 47 | shadata = bb.utils.sha256_file(localpath) | ||
| 48 | |||
| 49 | # sha256_file() can return None if we are running on Python 2.4 (hashlib is | ||
| 50 | # 2.5 onwards, sha in 2.4 is 160-bit only), so check for this and call the | ||
| 51 | # standalone shasum binary if required. | ||
| 52 | if shadata is None: | ||
| 53 | try: | ||
| 54 | shapipe = os.popen('PATH=%s oe_sha256sum %s' % (bb.data.getVar('PATH', data, True), localpath)) | ||
| 55 | shadata = (shapipe.readline().split() or [ "" ])[0] | ||
| 56 | shapipe.close() | ||
| 57 | except OSError: | ||
| 58 | raise Exception("Executing shasum failed, please build shasum-native") | ||
| 59 | |||
| 60 | if no_checksum == True: # we do not have conf/checksums.ini entry | ||
| 61 | try: | ||
| 62 | file = open("%s/checksums.ini" % bb.data.getVar("TMPDIR", data, 1), "a") | ||
| 63 | except: | ||
| 64 | return False | ||
| 65 | |||
| 66 | if not file: | ||
| 67 | raise Exception("Creating checksums.ini failed") | ||
| 68 | |||
| 69 | file.write("[%s]\nmd5=%s\nsha256=%s\n\n" % (src_uri, md5data, shadata)) | ||
| 70 | file.close() | ||
| 71 | return False | ||
| 72 | |||
| 73 | if not md5 == md5data: | ||
| 74 | bb.note("The MD5Sums did not match. Wanted: '%s' and Got: '%s'" % (md5,md5data)) | ||
| 75 | raise Exception("MD5 Sums do not match. Wanted: '%s' Got: '%s'" % (md5, md5data)) | ||
| 76 | |||
| 77 | if not sha256 == shadata: | ||
| 78 | bb.note("The SHA256 Sums do not match. Wanted: '%s' Got: '%s'" % (sha256,shadata)) | ||
| 79 | raise Exception("SHA256 Sums do not match. Wanted: '%s' Got: '%s'" % (sha256, shadata)) | ||
| 80 | |||
| 81 | return True | ||
| 82 | |||
| 83 | def base_read_file(filename): | ||
| 84 | try: | ||
| 85 | f = file( filename, "r" ) | ||
| 86 | except IOError, reason: | ||
| 87 | return "" # WARNING: can't raise an error now because of the new RDEPENDS handling. This is a bit ugly. :M: | ||
| 88 | else: | ||
| 89 | return f.read().strip() | ||
| 90 | return None | ||
| 91 | |||
| 92 | def base_conditional(variable, checkvalue, truevalue, falsevalue, d): | ||
| 93 | if bb.data.getVar(variable,d,1) == checkvalue: | ||
| 94 | return truevalue | ||
| 95 | else: | ||
| 96 | return falsevalue | ||
| 97 | |||
| 98 | def base_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): | ||
| 99 | if float(bb.data.getVar(variable,d,1)) <= float(checkvalue): | ||
| 100 | return truevalue | ||
| 101 | else: | ||
| 102 | return falsevalue | ||
| 103 | |||
| 104 | def base_version_less_or_equal(variable, checkvalue, truevalue, falsevalue, d): | ||
| 105 | result = bb.vercmp(bb.data.getVar(variable,d,True), checkvalue) | ||
| 106 | if result <= 0: | ||
| 107 | return truevalue | ||
| 108 | else: | ||
| 109 | return falsevalue | ||
| 110 | |||
| 111 | def base_contains(variable, checkvalues, truevalue, falsevalue, d): | ||
| 112 | matches = 0 | ||
| 113 | if type(checkvalues).__name__ == "str": | ||
| 114 | checkvalues = [checkvalues] | ||
| 115 | for value in checkvalues: | ||
| 116 | if bb.data.getVar(variable,d,1).find(value) != -1: | ||
| 117 | matches = matches + 1 | ||
| 118 | if matches == len(checkvalues): | ||
| 119 | return truevalue | ||
| 120 | return falsevalue | ||
| 121 | |||
| 122 | def base_both_contain(variable1, variable2, checkvalue, d): | ||
| 123 | if bb.data.getVar(variable1,d,1).find(checkvalue) != -1 and bb.data.getVar(variable2,d,1).find(checkvalue) != -1: | ||
| 124 | return checkvalue | ||
| 125 | else: | ||
| 126 | return "" | ||
| 127 | |||
| 128 | def base_prune_suffix(var, suffixes, d): | ||
| 129 | # See if var ends with any of the suffixes listed and | ||
| 130 | # remove it if found | ||
| 131 | for suffix in suffixes: | ||
| 132 | if var.endswith(suffix): | ||
| 133 | return var.replace(suffix, "") | ||
| 134 | return var | ||
| 135 | |||
| 136 | def oe_filter(f, str, d): | ||
| 137 | from re import match | ||
| 138 | return " ".join(filter(lambda x: match(f, x, 0), str.split())) | ||
| 139 | |||
| 140 | def oe_filter_out(f, str, d): | ||
| 141 | from re import match | ||
| 142 | return " ".join(filter(lambda x: not match(f, x, 0), str.split())) | ||
| 143 | |||
| 144 | oe_soinstall() { | ||
| 145 | # Purpose: Install shared library file and | ||
| 146 | # create the necessary links | ||
| 147 | # Example: | ||
| 148 | # | ||
| 149 | # oe_ | ||
| 150 | # | ||
| 151 | #oenote installing shared library $1 to $2 | ||
| 152 | # | ||
| 153 | libname=`basename $1` | ||
| 154 | install -m 755 $1 $2/$libname | ||
| 155 | sonamelink=`${HOST_PREFIX}readelf -d $1 |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` | ||
| 156 | solink=`echo $libname | sed -e 's/\.so\..*/.so/'` | ||
| 157 | ln -sf $libname $2/$sonamelink | ||
| 158 | ln -sf $libname $2/$solink | ||
| 159 | } | ||
| 160 | |||
| 161 | oe_libinstall() { | ||
| 162 | # Purpose: Install a library, in all its forms | ||
| 163 | # Example | ||
| 164 | # | ||
| 165 | # oe_libinstall libltdl ${STAGING_LIBDIR}/ | ||
| 166 | # oe_libinstall -C src/libblah libblah ${D}/${libdir}/ | ||
| 167 | dir="" | ||
| 168 | libtool="" | ||
| 169 | silent="" | ||
| 170 | require_static="" | ||
| 171 | require_shared="" | ||
| 172 | staging_install="" | ||
| 173 | while [ "$#" -gt 0 ]; do | ||
| 174 | case "$1" in | ||
| 175 | -C) | ||
| 176 | shift | ||
| 177 | dir="$1" | ||
| 178 | ;; | ||
| 179 | -s) | ||
| 180 | silent=1 | ||
| 181 | ;; | ||
| 182 | -a) | ||
| 183 | require_static=1 | ||
| 184 | ;; | ||
| 185 | -so) | ||
| 186 | require_shared=1 | ||
| 187 | ;; | ||
| 188 | -*) | ||
| 189 | oefatal "oe_libinstall: unknown option: $1" | ||
| 190 | ;; | ||
| 191 | *) | ||
| 192 | break; | ||
| 193 | ;; | ||
| 194 | esac | ||
| 195 | shift | ||
| 196 | done | ||
| 197 | |||
| 198 | libname="$1" | ||
| 199 | shift | ||
| 200 | destpath="$1" | ||
| 201 | if [ -z "$destpath" ]; then | ||
| 202 | oefatal "oe_libinstall: no destination path specified" | ||
| 203 | fi | ||
| 204 | if echo "$destpath/" | egrep '^${STAGING_LIBDIR}/' >/dev/null | ||
| 205 | then | ||
| 206 | staging_install=1 | ||
| 207 | fi | ||
| 208 | |||
| 209 | __runcmd () { | ||
| 210 | if [ -z "$silent" ]; then | ||
| 211 | echo >&2 "oe_libinstall: $*" | ||
| 212 | fi | ||
| 213 | $* | ||
| 214 | } | ||
| 215 | |||
| 216 | if [ -z "$dir" ]; then | ||
| 217 | dir=`pwd` | ||
| 218 | fi | ||
| 219 | |||
| 220 | dotlai=$libname.lai | ||
| 221 | |||
| 222 | # Sanity check that the libname.lai is unique | ||
| 223 | number_of_files=`(cd $dir; find . -name "$dotlai") | wc -l` | ||
| 224 | if [ $number_of_files -gt 1 ]; then | ||
| 225 | oefatal "oe_libinstall: $dotlai is not unique in $dir" | ||
| 226 | fi | ||
| 227 | |||
| 228 | |||
| 229 | dir=$dir`(cd $dir;find . -name "$dotlai") | sed "s/^\.//;s/\/$dotlai\$//;q"` | ||
| 230 | olddir=`pwd` | ||
| 231 | __runcmd cd $dir | ||
| 232 | |||
| 233 | lafile=$libname.la | ||
| 234 | |||
| 235 | # If such file doesn't exist, try to cut version suffix | ||
| 236 | if [ ! -f "$lafile" ]; then | ||
| 237 | libname1=`echo "$libname" | sed 's/-[0-9.]*$//'` | ||
| 238 | lafile1=$libname.la | ||
| 239 | if [ -f "$lafile1" ]; then | ||
| 240 | libname=$libname1 | ||
| 241 | lafile=$lafile1 | ||
| 242 | fi | ||
| 243 | fi | ||
| 244 | |||
| 245 | if [ -f "$lafile" ]; then | ||
| 246 | # libtool archive | ||
| 247 | eval `cat $lafile|grep "^library_names="` | ||
| 248 | libtool=1 | ||
| 249 | else | ||
| 250 | library_names="$libname.so* $libname.dll.a" | ||
| 251 | fi | ||
| 252 | |||
| 253 | __runcmd install -d $destpath/ | ||
| 254 | dota=$libname.a | ||
| 255 | if [ -f "$dota" -o -n "$require_static" ]; then | ||
| 256 | rm -f $destpath/$dota | ||
| 257 | __runcmd install -m 0644 $dota $destpath/ | ||
| 258 | fi | ||
| 259 | if [ -f "$dotlai" -a -n "$libtool" ]; then | ||
| 260 | if test -n "$staging_install" | ||
| 261 | then | ||
| 262 | # stop libtool using the final directory name for libraries | ||
| 263 | # in staging: | ||
| 264 | __runcmd rm -f $destpath/$libname.la | ||
| 265 | __runcmd sed -e 's/^installed=yes$/installed=no/' \ | ||
| 266 | -e '/^dependency_libs=/s,${WORKDIR}[[:alnum:]/\._+-]*/\([[:alnum:]\._+-]*\),${STAGING_LIBDIR}/\1,g' \ | ||
| 267 | -e "/^dependency_libs=/s,\([[:space:]']\)${libdir},\1${STAGING_LIBDIR},g" \ | ||
| 268 | $dotlai >$destpath/$libname.la | ||
| 269 | else | ||
| 270 | rm -f $destpath/$libname.la | ||
| 271 | __runcmd install -m 0644 $dotlai $destpath/$libname.la | ||
| 272 | fi | ||
| 273 | fi | ||
| 274 | |||
| 275 | for name in $library_names; do | ||
| 276 | files=`eval echo $name` | ||
| 277 | for f in $files; do | ||
| 278 | if [ ! -e "$f" ]; then | ||
| 279 | if [ -n "$libtool" ]; then | ||
| 280 | oefatal "oe_libinstall: $dir/$f not found." | ||
| 281 | fi | ||
| 282 | elif [ -L "$f" ]; then | ||
| 283 | __runcmd cp -P "$f" $destpath/ | ||
| 284 | elif [ ! -L "$f" ]; then | ||
| 285 | libfile="$f" | ||
| 286 | rm -f $destpath/$libfile | ||
| 287 | __runcmd install -m 0755 $libfile $destpath/ | ||
| 288 | fi | ||
| 289 | done | ||
| 290 | done | ||
| 291 | |||
| 292 | if [ -z "$libfile" ]; then | ||
| 293 | if [ -n "$require_shared" ]; then | ||
| 294 | oefatal "oe_libinstall: unable to locate shared library" | ||
| 295 | fi | ||
| 296 | elif [ -z "$libtool" ]; then | ||
| 297 | # special case hack for non-libtool .so.#.#.# links | ||
| 298 | baselibfile=`basename "$libfile"` | ||
| 299 | if (echo $baselibfile | grep -qE '^lib.*\.so\.[0-9.]*$'); then | ||
| 300 | sonamelink=`${HOST_PREFIX}readelf -d $libfile |grep 'Library soname:' |sed -e 's/.*\[\(.*\)\].*/\1/'` | ||
| 301 | solink=`echo $baselibfile | sed -e 's/\.so\..*/.so/'` | ||
| 302 | if [ -n "$sonamelink" -a x"$baselibfile" != x"$sonamelink" ]; then | ||
| 303 | __runcmd ln -sf $baselibfile $destpath/$sonamelink | ||
| 304 | fi | ||
| 305 | __runcmd ln -sf $baselibfile $destpath/$solink | ||
| 306 | fi | ||
| 307 | fi | ||
| 308 | |||
| 309 | __runcmd cd "$olddir" | ||
| 310 | } | ||
| 311 | |||
| 312 | oe_machinstall() { | ||
| 313 | # Purpose: Install machine dependent files, if available | ||
| 314 | # If not available, check if there is a default | ||
| 315 | # If no default, just touch the destination | ||
| 316 | # Example: | ||
| 317 | # $1 $2 $3 $4 | ||
| 318 | # oe_machinstall -m 0644 fstab ${D}/etc/fstab | ||
| 319 | # | ||
| 320 | # TODO: Check argument number? | ||
| 321 | # | ||
| 322 | filename=`basename $3` | ||
| 323 | dirname=`dirname $3` | ||
| 324 | |||
| 325 | for o in `echo ${OVERRIDES} | tr ':' ' '`; do | ||
| 326 | if [ -e $dirname/$o/$filename ]; then | ||
| 327 | oenote $dirname/$o/$filename present, installing to $4 | ||
| 328 | install $1 $2 $dirname/$o/$filename $4 | ||
| 329 | return | ||
| 330 | fi | ||
| 331 | done | ||
| 332 | # oenote overrides specific file NOT present, trying default=$3... | ||
| 333 | if [ -e $3 ]; then | ||
| 334 | oenote $3 present, installing to $4 | ||
| 335 | install $1 $2 $3 $4 | ||
| 336 | else | ||
| 337 | oenote $3 NOT present, touching empty $4 | ||
| 338 | touch $4 | ||
| 339 | fi | ||
| 340 | } | ||
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf index 1341349c4a..1745688fa8 100644 --- a/meta/conf/bitbake.conf +++ b/meta/conf/bitbake.conf | |||
| @@ -676,3 +676,18 @@ COMBINED_FEATURES = "\ | |||
| 676 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "usbgadget", d)} \ | 676 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "usbgadget", d)} \ |
| 677 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "usbhost", d)} \ | 677 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "usbhost", d)} \ |
| 678 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "wifi", d)}" | 678 | ${@base_both_contain("DISTRO_FEATURES", "MACHINE_FEATURES", "wifi", d)}" |
| 679 | |||
| 680 | |||
| 681 | # Make sure MACHINE isn't exported | ||
| 682 | # (breaks binutils at least) | ||
| 683 | MACHINE[unexport] = "1" | ||
| 684 | |||
| 685 | # Make sure TARGET_ARCH isn't exported | ||
| 686 | # (breaks Makefiles using implicit rules, e.g. quilt, as GNU make has this | ||
| 687 | # in them, undocumented) | ||
| 688 | TARGET_ARCH[unexport] = "1" | ||
| 689 | |||
| 690 | # Make sure DISTRO isn't exported | ||
| 691 | # (breaks sysvinit at least) | ||
| 692 | DISTRO[unexport] = "1" | ||
| 693 | |||
