#!/usr/bin/python # # Prepare a boost checkout for release # 1) Copy all the files at the root level to the dest folder ($DEST) # 2) Copy all the "special" folders to the dest folder ($DEST) # 3) copy all the files from $SOURCE/libs to $DEST/libs # 4a) For each subproject, copy everything except "include" into $DEST/libs # 4b) For each subproject, copy the contents of the "includes" folder into $DEST/boost # # Usage: %0 source dest import os, sys import shutil import stat IgnoreFiles = shutil.ignore_patterns( '[.]*', '[.]gitattributes', '[.]gitignore', '[.]gitmodules', '[.]travis[.]yml', 'appveyor[.]yml', 'circle[.]yml') def IgnoreFile(src, name): return len(IgnoreFiles(src, [name])) > 0 ## from def MergeTree(src, dst, symlinks = False): if not os.path.exists(dst): os.makedirs(dst) shutil.copystat(src, dst) lst = os.listdir(src) excl = IgnoreFiles(src, lst) lst = [x for x in lst if x not in excl] for item in lst: s = os.path.join(src, item) d = os.path.join(dst, item) if symlinks and os.path.islink(s): if os.path.lexists(d): os.remove(d) os.symlink(os.readlink(s), d) try: st = os.lstat(s) mode = stat.S_IMODE(st.st_mode) os.lchmod(d, mode) except: pass # lchmod not available elif os.path.isdir(s): MergeTree(s, d, symlinks) else: if os.path.exists(d): print "## Overwriting file %s with %s" % (d, s) shutil.copy2(s, d) def CopyFile (s, d, f): if os.path.isfile(os.path.join(s,f)) and not IgnoreFile(s, f): shutil.copy2(os.path.join(s,f), os.path.join(d,f)) def CopyDir (s, d, dd): if os.path.isdir(os.path.join(s,dd)) and not IgnoreFile(s, dd): shutil.copytree(os.path.join(s,dd), os.path.join(d,dd), symlinks=False, ignore=IgnoreFiles) def MergeIf(s, d, dd): # if dd == 'detail': # print "MergeIf %s -> %s" % (os.path.join(s, dd), os.path.join(d, dd)) if os.path.exists(os.path.join(s, dd)): MergeTree(os.path.join(s, dd), os.path.join(d, dd), symlinks=False) def CopyInclude(src, dst): for item in os.listdir(src): if IgnoreFile(src, item): continue if item == 'pending': continue if item == 'detail': continue s = os.path.join(src, item) d = os.path.join(dst, item) if os.path.isdir(s): MergeTree(s, d, symlinks=False) else: if os.path.exists(d): print "## Overwriting file %s with %s" % (d, s) CopyFile(src, dst, item) def CopySubProject(src, dst, headers, p): # First, everything except the "include" directory Source = os.path.join(src,p) Dest = os.path.join(dst,p) # print "CopySubProject %p" % p os.makedirs(Dest) for item in os.listdir(Source): if os.path.isfile(os.path.join(Source, item)): CopyFile(Source, Dest, item) elif item != "include": CopyDir(Source, Dest, item) #shutil.copytree(Source, Dest, symlinks=False, ignore=shutil.ignore_patterns('\.*', "include")) # Now the includes Source = os.path.join(src, "%s/include/boost" % p) if os.path.exists(Source): CopyInclude(Source, headers) # MergeTree(Source, Dest, symlinks=False, ignore=shutil.ignore_patterns('\.*', 'detail', 'pending')) MergeIf(Source, headers, 'detail') MergeIf(Source, headers, 'pending') def CopyNestedProject(src, dst, headers, p): # First, everything except the "include" directory Source = os.path.join(src,p[1]) Dest = os.path.join(dst,p[1]) os.makedirs(Dest) for item in os.listdir(Source): if os.path.isfile(os.path.join(Source, item)): CopyFile(Source, Dest, item) elif item != "include": CopyDir(Source, Dest, item) # shutil.copytree(Source, Dest, symlinks=False, ignore=shutil.ignore_patterns('\.*', "include")) Source = os.path.join(src, "%s/include/boost" % (p[1])) # Dest = os.path.join(headers, p) # print "Installing headers from %s to %s" % (Source, headers) CopyInclude(Source, headers) # # MergeTree(Source, Dest, symlinks=False, ignore=shutil.ignore_patterns('\.*', 'detail', 'pending')) # MergeIf(Source, headers, 'detail') # MergeIf(Source, headers, 'pending') BoostHeaders = "boost" BoostLibs = "libs" BoostSpecialFolders = [ "doc", "more", "status", "tools" ] SourceRoot = sys.argv[1] DestRoot = sys.argv[2] print "Source = %s" % SourceRoot print "Dest = %s" % DestRoot if not os.path.exists(SourceRoot): print "## Error: %s does not exist" % SourceRoot exit(1) if not os.path.exists(DestRoot): print "Creating destination directory %s" % DestRoot os.makedirs(DestRoot) DestHeaders = os.path.join(DestRoot, BoostHeaders) DestLibs = os.path.join(DestRoot, BoostLibs) os.makedirs(DestHeaders) os.makedirs(DestLibs) ## Step 1 for f in os.listdir(SourceRoot): if f != 'CMakeLists.txt': CopyFile(SourceRoot, DestRoot, f) ## Step 2 for d in BoostSpecialFolders: CopyDir(SourceRoot, DestRoot, d) ## Step 3 SourceLibs = os.path.join(SourceRoot, BoostLibs) for f in os.listdir(SourceLibs): CopyFile(SourceLibs, DestLibs, f) ## Step 4 BoostSubProjects = set() for f in os.listdir(SourceLibs): if os.path.isdir(os.path.join(SourceLibs,f)): if os.path.isfile(os.path.join(SourceLibs,f,"meta","libraries.json")): BoostSubProjects.add(f) elif os.path.isdir(os.path.join(SourceLibs,f,"include")): BoostSubProjects.add(f) elif f == 'headers': BoostSubProjects.add(f) elif os.path.isfile(os.path.join(SourceLibs,f,"sublibs")): for s in os.listdir(os.path.join(SourceLibs,f)): if os.path.isdir(os.path.join(SourceLibs,f,s)): if os.path.isfile(os.path.join(SourceLibs,f,s,"meta","libraries.json")): BoostSubProjects.add((f,s)) elif os.path.isdir(os.path.join(SourceLibs,f,s,"include")): BoostSubProjects.add((f,s)) for p in BoostSubProjects: if isinstance(p, basestring): CopySubProject(SourceLibs, DestLibs, DestHeaders, p) else: NestedSource = os.path.join(SourceRoot,"libs",p[0]) NestedDest = os.path.join(DestRoot,"libs",p[0]) NestedHeaders = os.path.join(DestRoot,"boost") if not os.path.exists(NestedDest): os.makedirs(NestedDest) if not os.path.exists(NestedHeaders): os.makedirs(NestedHeaders) for f in os.listdir(NestedSource): CopyFile(NestedSource, NestedDest, f) CopyNestedProject(NestedSource, NestedDest, NestedHeaders, p)