make quicky wrapper for cmake.
[blender-staging.git] / build_files / cmake / example_scripts / make_quicky.py
1 #! /usr/bin/env python
2
3 # ##### BEGIN GPL LICENSE BLOCK #####
4 #
5 #  This program is free software; you can redistribute it and/or
6 #  modify it under the terms of the GNU General Public License
7 #  as published by the Free Software Foundation; either version 2
8 #  of the License, or (at your option) any later version.
9 #
10 #  This program is distributed in the hope that it will be useful,
11 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #  GNU General Public License for more details.
14 #
15 #  You should have received a copy of the GNU General Public License
16 #  along with this program; if not, write to the Free Software Foundation,
17 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 #
19 # ##### END GPL LICENSE BLOCK #####
20
21 # <pep8 compliant>
22
23 def print_help(targets):
24     print("CMake quicky wrapper, no valid targets given.")
25     print(" * targets can contain a subset of the full target name.")
26     print(" * arguments with a '-' prefix are passed onto make.")
27     print(" * this must run from the cmake build dir")
28     print(" * alias this with a short command for speedy access, in bash:")
29     print("   alias mk='../blender/build_files/cmake/example_scripts/make_quicky.py'")
30     print("")
31     print(" eg: make_quicky.py -j3 extern python")
32     print(" ...will execute")
33     print(" make -j3 extern_binreloc extern_glew bf_python bf_python_ext blender/fast")
34     print("")
35     print("Target List:")
36     for t in targets:
37         print("    %s" % t)
38     print("...exiting")
39     
40
41 def main():
42     targets = set()
43     
44     # collect targets
45     file = open("Makefile", "r")
46     for line in file:
47         line = line.rstrip()
48         if not line or line[0] in ". \t@$#":
49             continue
50
51         line = line.split("#", 1)[0]
52         if ":" not in line:
53             continue
54
55         line = line.split(":", 1)[0]
56
57         if "/" in line: # cmake terget options, dont need these
58             continue
59
60         targets.add(line)
61     file.close()
62
63
64     # remove cmake targets
65     bad = set([
66         "help",
67         "clean",
68         "all",
69         "preinstall",
70         "install",
71         "default_target",
72         "edit_cache",
73         "cmake_force",
74         "rebuild_cache",
75         "depend",
76         "cmake_check_build_system",
77         ])
78         
79     targets -= set(bad)
80
81
82     # parse args
83     targets = list(targets)
84     targets.sort()
85
86     import sys
87     if len(sys.argv) == 1:
88         print_help(targets)
89         return
90
91     targets_new = []
92     args = []
93     for arg in sys.argv[1:]:
94         if arg[0] in "/-":
95             args.append(arg)
96         else:
97             found = False
98             for t in targets:
99                 if arg in t and t not in targets_new:
100                     targets_new.append(t)
101                     found = True
102
103             if not found:
104                 print("Error '%s' not found in...")
105                 for t in targets:
106                     print("    %s" % t)
107                 print("...aborting.")
108                 return
109     
110     # execute
111     cmd = "make %s %s blender/fast" % (" ".join(args), " ".join(targets_new))
112     print("cmake building with targets: %s" % " ".join(targets_new))
113     print("executing: %s" % cmd)
114
115     import os
116     os.system(cmd)
117
118 if __name__ == "__main__":
119     main()