3 # Copyright (c) 2012 Martin Decky
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions
10 # - Redistributions of source code must retain the above copyright
11 # notice, this list of conditions and the following disclaimer.
12 # - Redistributions in binary form must reproduce the above copyright
13 # notice, this list of conditions and the following disclaimer in the
14 # documentation and/or other materials provided with the distribution.
15 # - The name of the author may not be used to endorse or promote products
16 # derived from this software without specific prior written permission.
18 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 HelenOS out-of-source-tree build utility
40 exclude_names
= set(['.svn', '.bzr'])
42 def duplicate_tree(src_path
, dest_path
, current
):
43 "Duplicate source directory tree in the destination path"
45 for name
in os
.listdir(os
.path
.join(src_path
, current
)):
46 if name
in exclude_names
:
49 following
= os
.path
.join(current
, name
)
50 src
= os
.path
.join(src_path
, following
)
51 dest
= os
.path
.join(dest_path
, following
)
52 dest_parent
= os
.path
.join(dest_path
, current
)
53 dest_stat
= os
.stat(src
)
55 # Create shadow directories
56 if stat
.S_ISDIR(dest_stat
.st_mode
):
57 if not os
.path
.exists(dest
):
60 if not os
.path
.isdir(dest
):
61 raise IOError(errno
.ENOTDIR
, "Destination path exists, but is not a directory", dest
)
63 duplicate_tree(src_path
, dest_path
, following
)
65 # Compute the relative path from destination to source
66 relative
= os
.path
.relpath(src
, dest_parent
)
69 if not os
.path
.exists(dest
):
70 os
.symlink(relative
, dest
)
74 print(prname
+ " <SRC_PATH> <DEST_PATH> [MAKE ARGS...]")
82 src_path
= os
.path
.abspath(sys
.argv
[1])
83 if not os
.path
.isdir(src_path
):
84 print("<SRC_PATH> must be a directory")
87 # Destination tree path
88 dest_path
= os
.path
.abspath(sys
.argv
[2])
89 if not os
.path
.exists(dest_path
):
92 if not os
.path
.isdir(dest_path
):
93 print("<DEST_PATH> must be a directory")
96 # Duplicate source directory tree
97 duplicate_tree(src_path
, dest_path
, "")
99 # Run the build from the destination tree
102 args
.extend(sys
.argv
[3:])
104 return subprocess
.Popen(args
).wait()
106 if __name__
== '__main__':