add bootstrap option to force 64-bit
[platform/upstream/ninja.git] / bootstrap.py
1 #!/usr/bin/env python
2 # Copyright 2011 Google Inc. All Rights Reserved.
3 #
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
7 #
8 #     http://www.apache.org/licenses/LICENSE-2.0
9 #
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
15
16 from optparse import OptionParser
17 import sys
18 import os
19 import glob
20 import errno
21 import shlex
22 import subprocess
23
24 os.chdir(os.path.dirname(os.path.abspath(__file__)))
25
26 parser = OptionParser()
27 parser.add_option('--verbose', action='store_true',
28                   help='enable verbose build',)
29 parser.add_option('--x64', action='store_true',
30                   help='force 64-bit build (Windows)',)
31 (options, conf_args) = parser.parse_args()
32
33 def run(*args, **kwargs):
34     returncode = subprocess.call(*args, **kwargs)
35     if returncode != 0:
36         sys.exit(returncode)
37
38 # Compute system-specific CFLAGS/LDFLAGS as used in both in the below
39 # g++ call as well as in the later configure.py.
40 cflags = os.environ.get('CFLAGS', '').split()
41 ldflags = os.environ.get('LDFLAGS', '').split()
42 if sys.platform.startswith('freebsd'):
43     cflags.append('-I/usr/local/include')
44     ldflags.append('-L/usr/local/lib')
45
46 print 'Building ninja manually...'
47
48 try:
49     os.mkdir('build')
50 except OSError, e:
51     if e.errno != errno.EEXIST:
52         raise
53
54 sources = []
55 for src in glob.glob('src/*.cc'):
56     if src.endswith('test.cc') or src.endswith('.in.cc'):
57         continue
58     if src.endswith('bench.cc'):
59         continue
60
61     filename = os.path.basename(src)
62     if filename == 'browse.cc':  # Depends on generated header.
63         continue
64
65     if sys.platform.startswith('win32'):
66         if src.endswith('-posix.cc'):
67             continue
68     else:
69         if src.endswith('-win32.cc'):
70             continue
71
72     sources.append(src)
73
74 if sys.platform.startswith('win32'):
75     sources.append('src/getopt.c')
76
77 vcdir = os.environ.get('VCINSTALLDIR')
78 if vcdir:
79     if options.x64:
80         args = [os.path.join(vcdir, 'bin', 'amd64', 'cl.exe'),
81                 '/nologo', '/EHsc', '/DNOMINMAX']
82     else:
83         args = [os.path.join(vcdir, 'bin', 'cl.exe'),
84                 '/nologo', '/EHsc', '/DNOMINMAX']
85 else:
86     args = shlex.split(os.environ.get('CXX', 'g++'))
87     cflags.extend(['-Wno-deprecated',
88                    '-DNINJA_PYTHON="' + sys.executable + '"',
89                    '-DNINJA_BOOTSTRAP'])
90     if sys.platform.startswith('win32'):
91         cflags.append('-D_WIN32_WINNT=0x0501')
92     if options.x64:
93         cflags.append('-m64')
94 args.extend(cflags)
95 args.extend(ldflags)
96 binary = 'ninja.bootstrap'
97 if sys.platform.startswith('win32'):
98     binary = 'ninja.bootstrap.exe'
99 args.extend(sources)
100 if vcdir:
101     args.extend(['/link', '/out:' + binary])
102 else:
103     args.extend(['-o', binary])
104
105 if options.verbose:
106     print ' '.join(args)
107
108 run(args)
109
110 verbose = []
111 if options.verbose:
112     verbose = ['-v']
113
114 print 'Building ninja using itself...'
115 run([sys.executable, 'configure.py'] + conf_args)
116 run(['./' + binary] + verbose)
117 os.unlink(binary)
118
119 if sys.platform.startswith('win32'):
120     for obj in glob.glob('*.obj'):
121         os.unlink(obj)
122
123 print 'Done!'