diff options
| -rw-r--r-- | meta/classes/package.bbclass | 72 | ||||
| -rw-r--r-- | meta/classes/package_deb.bbclass | 20 | ||||
| -rw-r--r-- | meta/classes/package_ipk.bbclass | 22 |
3 files changed, 18 insertions, 96 deletions
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass index e17627eaac..c2741d0222 100644 --- a/meta/classes/package.bbclass +++ b/meta/classes/package.bbclass | |||
| @@ -318,76 +318,6 @@ python package_do_split_locales() { | |||
| 318 | #bb.data.setVar('RDEPENDS_%s' % mainpkg, ' '.join(rdep), d) | 318 | #bb.data.setVar('RDEPENDS_%s' % mainpkg, ' '.join(rdep), d) |
| 319 | } | 319 | } |
| 320 | 320 | ||
| 321 | def copyfile(src,dest,newmtime=None,sstat=None): | ||
| 322 | """ | ||
| 323 | Copies a file from src to dest, preserving all permissions and | ||
| 324 | attributes; mtime will be preserved even when moving across | ||
| 325 | filesystems. Returns true on success and false on failure. | ||
| 326 | """ | ||
| 327 | import os, stat, shutil, commands | ||
| 328 | |||
| 329 | #print "copyfile("+src+","+dest+","+str(newmtime)+","+str(sstat)+")" | ||
| 330 | try: | ||
| 331 | if not sstat: | ||
| 332 | sstat=os.lstat(src) | ||
| 333 | except Exception, e: | ||
| 334 | print "copyfile: Stating source file failed...", e | ||
| 335 | return False | ||
| 336 | |||
| 337 | destexists=1 | ||
| 338 | try: | ||
| 339 | dstat=os.lstat(dest) | ||
| 340 | except: | ||
| 341 | dstat=os.lstat(os.path.dirname(dest)) | ||
| 342 | destexists=0 | ||
| 343 | |||
| 344 | if destexists: | ||
| 345 | if stat.S_ISLNK(dstat[stat.ST_MODE]): | ||
| 346 | try: | ||
| 347 | os.unlink(dest) | ||
| 348 | destexists=0 | ||
| 349 | except Exception, e: | ||
| 350 | pass | ||
| 351 | |||
| 352 | if stat.S_ISLNK(sstat[stat.ST_MODE]): | ||
| 353 | try: | ||
| 354 | target=os.readlink(src) | ||
| 355 | if destexists and not stat.S_ISDIR(dstat[stat.ST_MODE]): | ||
| 356 | os.unlink(dest) | ||
| 357 | os.symlink(target,dest) | ||
| 358 | #os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
| 359 | return os.lstat(dest) | ||
| 360 | except Exception, e: | ||
| 361 | print "copyfile: failed to properly create symlink:", dest, "->", target, e | ||
| 362 | return False | ||
| 363 | |||
| 364 | if stat.S_ISREG(sstat[stat.ST_MODE]): | ||
| 365 | try: # For safety copy then move it over. | ||
| 366 | shutil.copyfile(src,dest+"#new") | ||
| 367 | os.rename(dest+"#new",dest) | ||
| 368 | except Exception, e: | ||
| 369 | print 'copyfile: copy', src, '->', dest, 'failed.', e | ||
| 370 | return False | ||
| 371 | else: | ||
| 372 | #we don't yet handle special, so we need to fall back to /bin/mv | ||
| 373 | a=commands.getstatusoutput("/bin/cp -f "+"'"+src+"' '"+dest+"'") | ||
| 374 | if a[0]!=0: | ||
| 375 | print "copyfile: Failed to copy special file:" + src + "' to '" + dest + "'", a | ||
| 376 | return False # failure | ||
| 377 | try: | ||
| 378 | os.lchown(dest,sstat[stat.ST_UID],sstat[stat.ST_GID]) | ||
| 379 | os.chmod(dest, stat.S_IMODE(sstat[stat.ST_MODE])) # Sticky is reset on chown | ||
| 380 | except Exception, e: | ||
| 381 | print "copyfile: Failed to chown/chmod/unlink", dest, e | ||
| 382 | return False | ||
| 383 | |||
| 384 | if newmtime: | ||
| 385 | os.utime(dest,(newmtime,newmtime)) | ||
| 386 | else: | ||
| 387 | os.utime(dest, (sstat[stat.ST_ATIME], sstat[stat.ST_MTIME])) | ||
| 388 | newmtime=sstat[stat.ST_MTIME] | ||
| 389 | return newmtime | ||
| 390 | |||
| 391 | python populate_packages () { | 321 | python populate_packages () { |
| 392 | import glob, stat, errno, re | 322 | import glob, stat, errno, re |
| 393 | 323 | ||
| @@ -491,7 +421,7 @@ python populate_packages () { | |||
| 491 | fpath = os.path.join(root,file) | 421 | fpath = os.path.join(root,file) |
| 492 | dpath = os.path.dirname(fpath) | 422 | dpath = os.path.dirname(fpath) |
| 493 | bb.mkdirhier(dpath) | 423 | bb.mkdirhier(dpath) |
| 494 | ret = copyfile(file, fpath) | 424 | ret = bb.copyfile(file, fpath) |
| 495 | if ret is False or ret == 0: | 425 | if ret is False or ret == 0: |
| 496 | raise bb.build.FuncFailed("File population failed") | 426 | raise bb.build.FuncFailed("File population failed") |
| 497 | del localdata | 427 | del localdata |
diff --git a/meta/classes/package_deb.bbclass b/meta/classes/package_deb.bbclass index ce4d5c914c..a5b850d8ad 100644 --- a/meta/classes/package_deb.bbclass +++ b/meta/classes/package_deb.bbclass | |||
| @@ -102,20 +102,11 @@ python do_package_deb () { | |||
| 102 | bb.debug(1, "No packages; nothing to do") | 102 | bb.debug(1, "No packages; nothing to do") |
| 103 | return | 103 | return |
| 104 | 104 | ||
| 105 | def lockfile(name): | ||
| 106 | lf = open(name, "a+") | ||
| 107 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX) | ||
| 108 | return lf | ||
| 109 | |||
| 110 | def unlockfile(lf): | ||
| 111 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) | ||
| 112 | lf.close | ||
| 113 | |||
| 114 | for pkg in packages.split(): | 105 | for pkg in packages.split(): |
| 115 | localdata = bb.data.createCopy(d) | 106 | localdata = bb.data.createCopy(d) |
| 116 | root = "%s/install/%s" % (workdir, pkg) | 107 | root = "%s/install/%s" % (workdir, pkg) |
| 117 | 108 | ||
| 118 | lf = lockfile(root + ".lock") | 109 | lf = bb.utils.lockfile(root + ".lock") |
| 119 | 110 | ||
| 120 | bb.data.setVar('ROOT', '', localdata) | 111 | bb.data.setVar('ROOT', '', localdata) |
| 121 | bb.data.setVar('ROOT_%s' % pkg, root, localdata) | 112 | bb.data.setVar('ROOT_%s' % pkg, root, localdata) |
| @@ -147,7 +138,7 @@ python do_package_deb () { | |||
| 147 | if not g and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": | 138 | if not g and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": |
| 148 | from bb import note | 139 | from bb import note |
| 149 | note("Not creating empty archive for %s-%s-%s" % (pkg, bb.data.getVar('PV', localdata, 1), bb.data.getVar('PR', localdata, 1))) | 140 | note("Not creating empty archive for %s-%s-%s" % (pkg, bb.data.getVar('PV', localdata, 1), bb.data.getVar('PR', localdata, 1))) |
| 150 | unlockfile(lf) | 141 | bb.utils.unlockfile(lf) |
| 151 | continue | 142 | continue |
| 152 | 143 | ||
| 153 | controldir = os.path.join(root, 'DEBIAN') | 144 | controldir = os.path.join(root, 'DEBIAN') |
| @@ -158,6 +149,7 @@ python do_package_deb () { | |||
| 158 | # import codecs | 149 | # import codecs |
| 159 | # ctrlfile = codecs.open("someFile", "w", "utf-8") | 150 | # ctrlfile = codecs.open("someFile", "w", "utf-8") |
| 160 | except OSError: | 151 | except OSError: |
| 152 | bb.utils.unlockfile(lf) | ||
| 161 | raise bb.build.FuncFailed("unable to open control file for writing.") | 153 | raise bb.build.FuncFailed("unable to open control file for writing.") |
| 162 | 154 | ||
| 163 | fields = [] | 155 | fields = [] |
| @@ -196,6 +188,7 @@ python do_package_deb () { | |||
| 196 | ctrlfile.write(unicode(c % tuple(pullData(fs, localdata)))) | 188 | ctrlfile.write(unicode(c % tuple(pullData(fs, localdata)))) |
| 197 | except KeyError: | 189 | except KeyError: |
| 198 | (type, value, traceback) = sys.exc_info() | 190 | (type, value, traceback) = sys.exc_info() |
| 191 | bb.utils.unlockfile(lf) | ||
| 199 | ctrlfile.close() | 192 | ctrlfile.close() |
| 200 | raise bb.build.FuncFailed("Missing field for deb generation: %s" % value) | 193 | raise bb.build.FuncFailed("Missing field for deb generation: %s" % value) |
| 201 | # more fields | 194 | # more fields |
| @@ -231,6 +224,7 @@ python do_package_deb () { | |||
| 231 | try: | 224 | try: |
| 232 | scriptfile = file(os.path.join(controldir, script), 'w') | 225 | scriptfile = file(os.path.join(controldir, script), 'w') |
| 233 | except OSError: | 226 | except OSError: |
| 227 | bb.utils.unlockfile(lf) | ||
| 234 | raise bb.build.FuncFailed("unable to open %s script file for writing." % script) | 228 | raise bb.build.FuncFailed("unable to open %s script file for writing." % script) |
| 235 | scriptfile.write("#!/bin/sh\n") | 229 | scriptfile.write("#!/bin/sh\n") |
| 236 | scriptfile.write(scriptvar) | 230 | scriptfile.write(scriptvar) |
| @@ -242,6 +236,7 @@ python do_package_deb () { | |||
| 242 | try: | 236 | try: |
| 243 | conffiles = file(os.path.join(controldir, 'conffiles'), 'w') | 237 | conffiles = file(os.path.join(controldir, 'conffiles'), 'w') |
| 244 | except OSError: | 238 | except OSError: |
| 239 | bb.utils.unlockfile(lf) | ||
| 245 | raise bb.build.FuncFailed("unable to open conffiles for writing.") | 240 | raise bb.build.FuncFailed("unable to open conffiles for writing.") |
| 246 | for f in conffiles_str.split(): | 241 | for f in conffiles_str.split(): |
| 247 | conffiles.write('%s\n' % f) | 242 | conffiles.write('%s\n' % f) |
| @@ -250,6 +245,7 @@ python do_package_deb () { | |||
| 250 | os.chdir(basedir) | 245 | os.chdir(basedir) |
| 251 | ret = os.system("PATH=\"%s\" fakeroot dpkg-deb -b %s %s" % (bb.data.getVar("PATH", localdata, 1), root, pkgoutdir)) | 246 | ret = os.system("PATH=\"%s\" fakeroot dpkg-deb -b %s %s" % (bb.data.getVar("PATH", localdata, 1), root, pkgoutdir)) |
| 252 | if ret != 0: | 247 | if ret != 0: |
| 248 | bb.utils.unlockfile(lf) | ||
| 253 | raise bb.build.FuncFailed("dpkg-deb execution failed") | 249 | raise bb.build.FuncFailed("dpkg-deb execution failed") |
| 254 | 250 | ||
| 255 | for script in ["preinst", "postinst", "prerm", "postrm", "control" ]: | 251 | for script in ["preinst", "postinst", "prerm", "postrm", "control" ]: |
| @@ -263,7 +259,7 @@ python do_package_deb () { | |||
| 263 | except OSError: | 259 | except OSError: |
| 264 | pass | 260 | pass |
| 265 | 261 | ||
| 266 | unlockfile(lf) | 262 | bb.utils.unlockfile(lf) |
| 267 | } | 263 | } |
| 268 | 264 | ||
| 269 | python () { | 265 | python () { |
diff --git a/meta/classes/package_ipk.bbclass b/meta/classes/package_ipk.bbclass index be300e04b1..e69745665f 100644 --- a/meta/classes/package_ipk.bbclass +++ b/meta/classes/package_ipk.bbclass | |||
| @@ -33,7 +33,7 @@ python package_ipk_install () { | |||
| 33 | 33 | ||
| 34 | # Generate ipk.conf if it or the stamp doesnt exist | 34 | # Generate ipk.conf if it or the stamp doesnt exist |
| 35 | conffile = os.path.join(stagingdir,"ipkg.conf") | 35 | conffile = os.path.join(stagingdir,"ipkg.conf") |
| 36 | if not os.access(conffile, os.R_OK): | 36 | if not os.access(conffile, os.R_OK): |
| 37 | ipkg_archs = bb.data.getVar('PACKAGE_ARCHS',d) | 37 | ipkg_archs = bb.data.getVar('PACKAGE_ARCHS',d) |
| 38 | if ipkg_archs is None: | 38 | if ipkg_archs is None: |
| 39 | bb.error("PACKAGE_ARCHS missing") | 39 | bb.error("PACKAGE_ARCHS missing") |
| @@ -152,20 +152,11 @@ python do_package_ipk () { | |||
| 152 | bb.debug(1, "No packages; nothing to do") | 152 | bb.debug(1, "No packages; nothing to do") |
| 153 | return | 153 | return |
| 154 | 154 | ||
| 155 | def lockfile(name): | ||
| 156 | lf = open(name, "a+") | ||
| 157 | fcntl.flock(lf.fileno(), fcntl.LOCK_EX) | ||
| 158 | return lf | ||
| 159 | |||
| 160 | def unlockfile(lf): | ||
| 161 | fcntl.flock(lf.fileno(), fcntl.LOCK_UN) | ||
| 162 | lf.close | ||
| 163 | |||
| 164 | for pkg in packages.split(): | 155 | for pkg in packages.split(): |
| 165 | localdata = bb.data.createCopy(d) | 156 | localdata = bb.data.createCopy(d) |
| 166 | root = "%s/install/%s" % (workdir, pkg) | 157 | root = "%s/install/%s" % (workdir, pkg) |
| 167 | 158 | ||
| 168 | lf = lockfile(root + ".lock") | 159 | lf = bb.utils.lockfile(root + ".lock") |
| 169 | 160 | ||
| 170 | bb.data.setVar('ROOT', '', localdata) | 161 | bb.data.setVar('ROOT', '', localdata) |
| 171 | bb.data.setVar('ROOT_%s' % pkg, root, localdata) | 162 | bb.data.setVar('ROOT_%s' % pkg, root, localdata) |
| @@ -195,7 +186,7 @@ python do_package_ipk () { | |||
| 195 | if not g and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": | 186 | if not g and bb.data.getVar('ALLOW_EMPTY', localdata) != "1": |
| 196 | from bb import note | 187 | from bb import note |
| 197 | note("Not creating empty archive for %s-%s-%s" % (pkg, bb.data.getVar('PV', localdata, 1), bb.data.getVar('PR', localdata, 1))) | 188 | note("Not creating empty archive for %s-%s-%s" % (pkg, bb.data.getVar('PV', localdata, 1), bb.data.getVar('PR', localdata, 1))) |
| 198 | unlockfile(lf) | 189 | bb.utils.unlockfile(lf) |
| 199 | continue | 190 | continue |
| 200 | 191 | ||
| 201 | controldir = os.path.join(root, 'CONTROL') | 192 | controldir = os.path.join(root, 'CONTROL') |
| @@ -203,6 +194,7 @@ python do_package_ipk () { | |||
| 203 | try: | 194 | try: |
| 204 | ctrlfile = file(os.path.join(controldir, 'control'), 'w') | 195 | ctrlfile = file(os.path.join(controldir, 'control'), 'w') |
| 205 | except OSError: | 196 | except OSError: |
| 197 | bb.utils.unlockfile(lf) | ||
| 206 | raise bb.build.FuncFailed("unable to open control file for writing.") | 198 | raise bb.build.FuncFailed("unable to open control file for writing.") |
| 207 | 199 | ||
| 208 | fields = [] | 200 | fields = [] |
| @@ -236,6 +228,7 @@ python do_package_ipk () { | |||
| 236 | except KeyError: | 228 | except KeyError: |
| 237 | (type, value, traceback) = sys.exc_info() | 229 | (type, value, traceback) = sys.exc_info() |
| 238 | ctrlfile.close() | 230 | ctrlfile.close() |
| 231 | bb.utils.unlockfile(lf) | ||
| 239 | raise bb.build.FuncFailed("Missing field for ipk generation: %s" % value) | 232 | raise bb.build.FuncFailed("Missing field for ipk generation: %s" % value) |
| 240 | # more fields | 233 | # more fields |
| 241 | 234 | ||
| @@ -272,6 +265,7 @@ python do_package_ipk () { | |||
| 272 | try: | 265 | try: |
| 273 | scriptfile = file(os.path.join(controldir, script), 'w') | 266 | scriptfile = file(os.path.join(controldir, script), 'w') |
| 274 | except OSError: | 267 | except OSError: |
| 268 | bb.utils.unlockfile(lf) | ||
| 275 | raise bb.build.FuncFailed("unable to open %s script file for writing." % script) | 269 | raise bb.build.FuncFailed("unable to open %s script file for writing." % script) |
| 276 | scriptfile.write(scriptvar) | 270 | scriptfile.write(scriptvar) |
| 277 | scriptfile.close() | 271 | scriptfile.close() |
| @@ -282,6 +276,7 @@ python do_package_ipk () { | |||
| 282 | try: | 276 | try: |
| 283 | conffiles = file(os.path.join(controldir, 'conffiles'), 'w') | 277 | conffiles = file(os.path.join(controldir, 'conffiles'), 'w') |
| 284 | except OSError: | 278 | except OSError: |
| 279 | bb.utils.unlockfile(lf) | ||
| 285 | raise bb.build.FuncFailed("unable to open conffiles for writing.") | 280 | raise bb.build.FuncFailed("unable to open conffiles for writing.") |
| 286 | for f in conffiles_str.split(): | 281 | for f in conffiles_str.split(): |
| 287 | conffiles.write('%s\n' % f) | 282 | conffiles.write('%s\n' % f) |
| @@ -291,6 +286,7 @@ python do_package_ipk () { | |||
| 291 | ret = os.system("PATH=\"%s\" %s %s %s" % (bb.data.getVar("PATH", localdata, 1), | 286 | ret = os.system("PATH=\"%s\" %s %s %s" % (bb.data.getVar("PATH", localdata, 1), |
| 292 | bb.data.getVar("IPKGBUILDCMD",d,1), pkg, pkgoutdir)) | 287 | bb.data.getVar("IPKGBUILDCMD",d,1), pkg, pkgoutdir)) |
| 293 | if ret != 0: | 288 | if ret != 0: |
| 289 | bb.utils.unlockfile(lf) | ||
| 294 | raise bb.build.FuncFailed("ipkg-build execution failed") | 290 | raise bb.build.FuncFailed("ipkg-build execution failed") |
| 295 | 291 | ||
| 296 | for script in ["preinst", "postinst", "prerm", "postrm", "control" ]: | 292 | for script in ["preinst", "postinst", "prerm", "postrm", "control" ]: |
| @@ -303,7 +299,7 @@ python do_package_ipk () { | |||
| 303 | os.rmdir(controldir) | 299 | os.rmdir(controldir) |
| 304 | except OSError: | 300 | except OSError: |
| 305 | pass | 301 | pass |
| 306 | unlockfile(lf) | 302 | bb.utils.unlockfile(lf) |
| 307 | } | 303 | } |
| 308 | 304 | ||
| 309 | python () { | 305 | python () { |
