blob: 28f3554a492076fbeeb3a532dccca54fcf9061a4 [file] [log] [blame]
epoger@google.comfd03db02011-07-28 14:24:55 +00001# Copyright 2011 Google Inc.
epoger@google.com877cfe32011-07-11 19:52:00 +00002#
epoger@google.comfd03db02011-07-28 14:24:55 +00003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
epoger@google.com877cfe32011-07-11 19:52:00 +00005
6# "Makefile" replacement to build skia for Windows.
epoger@google.com9c875d32012-10-18 16:10:56 +00007# More info at https://sites.google.com/site/skiadocs/
epoger@google.com7815e732011-07-15 13:23:22 +00008#
9# Some usage examples:
10# make clean
11# make tests
12# make bench BUILDTYPE=Release
13# make gm GYP_DEFINES=skia_scalar=fixed BUILDTYPE=Release
14# make all
epoger@google.com877cfe32011-07-11 19:52:00 +000015
16import os
17import shutil
18import sys
19
epoger@google.com0fb21252011-07-13 21:30:14 +000020BUILDTYPE = 'Debug'
21
epoger@google.com7815e732011-07-15 13:23:22 +000022# special targets
epoger@google.com9c875d32012-10-18 16:10:56 +000023TARGET_ALL = 'all'
24TARGET_CLEAN = 'clean'
25TARGET_DEFAULT = 'most'
26TARGET_GYP = 'gyp'
epoger@google.com877cfe32011-07-11 19:52:00 +000027
28SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
borenet@google.coma82c9eb2013-07-23 15:45:50 +000029OUT_SUBDIR = os.environ.get('SKIA_OUT', 'out')
epoger@google.com877cfe32011-07-11 19:52:00 +000030GYP_SUBDIR = 'gyp'
31
32
33# Simple functions that report what they are doing, and exit(1) on failure.
34def cd(path):
35 print '> cd %s' % path
epoger@google.com0fb21252011-07-13 21:30:14 +000036 if not os.path.isdir(path):
37 print 'directory %s does not exist' % path
epoger@google.com877cfe32011-07-11 19:52:00 +000038 sys.exit(1)
39 os.chdir(path)
40
41def rmtree(path):
42 print '> rmtree %s' % path
43 shutil.rmtree(path, ignore_errors=True)
44
epoger@google.com0fb21252011-07-13 21:30:14 +000045def mkdirs(path):
46 print '> mkdirs %s' % path
47 if not os.path.isdir(path):
48 os.makedirs(path)
49
epoger@google.com877cfe32011-07-11 19:52:00 +000050def runcommand(command):
51 print '> %s' % command
52 if os.system(command):
53 sys.exit(1)
54
55def MakeClean():
56 """Cross-platform "make clean" operation."""
57 cd(SCRIPT_DIR)
58 rmtree(OUT_SUBDIR)
59 # clean up the directory that XCode (on Mac) creates
60 rmtree('xcodebuild')
61
62
63def CheckWindowsEnvironment():
64 """For Windows: check environment variables needed for command-line build.
65
66 If those environment variables are missing, try to set them.
67 If environment variables can be set up, this function returns; otherwise,
68 it displays an error message and exits.
69 """
70 # If we already have the proper environment variables, nothing to do here.
71 try:
72 env_DevEnvDir = os.environ['DevEnvDir']
73 return # found it, so we are done
74 except KeyError:
75 pass # go on and run the rest of this function
76
77 print ('\nCould not find Visual Studio environment variables.'
78 '\nPerhaps you have not yet run vcvars32.bat as described at'
79 '\nhttp://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx ?')
80 found_path = None
81 try:
82 possible_path = os.path.abspath(os.path.join(
83 os.environ['VS100COMNTOOLS'], os.path.pardir, os.path.pardir,
84 'VC', 'bin', 'vcvars32.bat'))
85 if os.path.exists(possible_path):
86 found_path = possible_path
87 except KeyError:
88 pass
89 if found_path:
90 print '\nIt looks like you can run that script at:\n%s' % found_path
91 else:
92 print '\nUnable to find vcvars32.bat on your system.'
93 sys.exit(1)
94
95
epoger@google.com7815e732011-07-15 13:23:22 +000096def MakeWindows(targets):
epoger@google.com877cfe32011-07-11 19:52:00 +000097 """For Windows: build as appropriate for the command line arguments.
98
99 parameters:
epoger@google.com7815e732011-07-15 13:23:22 +0000100 targets: build targets as a list of strings
epoger@google.com877cfe32011-07-11 19:52:00 +0000101 """
102 CheckWindowsEnvironment()
epoger@google.com0fb21252011-07-13 21:30:14 +0000103
epoger@google.com877cfe32011-07-11 19:52:00 +0000104 # Run gyp_skia to prepare Visual Studio projects.
105 cd(SCRIPT_DIR)
106 runcommand('python gyp_skia')
epoger@google.com0fb21252011-07-13 21:30:14 +0000107
108 # Prepare final output dir into which we will copy all binaries.
109 msbuild_working_dir = os.path.join(SCRIPT_DIR, OUT_SUBDIR, GYP_SUBDIR)
110 msbuild_output_dir = os.path.join(msbuild_working_dir, BUILDTYPE)
111 final_output_dir = os.path.join(SCRIPT_DIR, OUT_SUBDIR, BUILDTYPE)
112 mkdirs(final_output_dir)
113
epoger@google.com7815e732011-07-15 13:23:22 +0000114 for target in targets:
epoger@google.com52c5cbf2012-03-23 18:14:25 +0000115 # We already built the gypfiles...
116 if target == TARGET_GYP:
117 continue
118
epoger@google.com7815e732011-07-15 13:23:22 +0000119 cd(msbuild_working_dir)
120 runcommand(
121 ('msbuild /nologo /property:Configuration=%s'
122 ' /target:%s /verbosity:minimal %s.sln') % (
123 BUILDTYPE, target, target))
124 runcommand('xcopy /y %s\* %s' % (
125 msbuild_output_dir, final_output_dir))
epoger@google.com877cfe32011-07-11 19:52:00 +0000126
epoger@google.com7815e732011-07-15 13:23:22 +0000127
128def Make(args):
129 """Main function.
130
131 parameters:
132 args: command line arguments as a list of strings
133 """
134 # handle any variable-setting parameters or special targets
135 global BUILDTYPE
epoger@google.com9c875d32012-10-18 16:10:56 +0000136
137 # if no targets were specified at all, make default target
138 if not args:
139 args = [TARGET_DEFAULT]
140
epoger@google.com7815e732011-07-15 13:23:22 +0000141 targets = []
142 for arg in args:
epoger@google.com6714ea42012-10-25 16:32:07 +0000143 # If user requests "make all", chain to our explicitly-declared "everything"
144 # target. See https://code.google.com/p/skia/issues/detail?id=932 ("gyp
145 # automatically creates "all" target on some build flavors but not others")
epoger@google.com7815e732011-07-15 13:23:22 +0000146 if arg == TARGET_ALL:
epoger@google.com6714ea42012-10-25 16:32:07 +0000147 targets.append('everything')
epoger@google.com7815e732011-07-15 13:23:22 +0000148 elif arg == TARGET_CLEAN:
149 MakeClean()
150 elif arg.startswith('BUILDTYPE='):
151 BUILDTYPE = arg[10:]
152 elif arg.startswith('GYP_DEFINES='):
153 os.environ['GYP_DEFINES'] = arg[12:]
154 else:
155 targets.append(arg)
156
157 # if there are no remaining targets, we're done
158 if not targets:
159 sys.exit(0)
160
161 # dispatch to appropriate Make<Platform>() variant.
162 if os.name == 'nt':
163 MakeWindows(targets)
164 sys.exit(0)
165 elif os.name == 'posix':
166 if sys.platform == 'darwin':
167 print 'Mac developers should not run this script; see ' \
epoger@google.com9c875d32012-10-18 16:10:56 +0000168 'https://sites.google.com/site/skiadocs/user-documentation/quick-start-guides/mac'
epoger@google.com7815e732011-07-15 13:23:22 +0000169 sys.exit(1)
170 elif sys.platform == 'cygwin':
epoger@google.com9c875d32012-10-18 16:10:56 +0000171 print 'Windows development on Cygwin is not currently supported; see ' \
172 'https://sites.google.com/site/skiadocs/user-documentation/quick-start-guides/windows'
epoger@google.com7815e732011-07-15 13:23:22 +0000173 sys.exit(1)
174 else:
175 print 'Unix developers should not run this script; see ' \
epoger@google.com9c875d32012-10-18 16:10:56 +0000176 'https://sites.google.com/site/skiadocs/user-documentation/quick-start-guides/linux'
epoger@google.com7815e732011-07-15 13:23:22 +0000177 sys.exit(1)
epoger@google.com877cfe32011-07-11 19:52:00 +0000178 else:
epoger@google.com7815e732011-07-15 13:23:22 +0000179 print 'unknown platform (os.name=%s, sys.platform=%s); see %s' % (
epoger@google.com9c875d32012-10-18 16:10:56 +0000180 os.name, sys.platform, 'https://sites.google.com/site/skiadocs/')
epoger@google.com877cfe32011-07-11 19:52:00 +0000181 sys.exit(1)
epoger@google.com7815e732011-07-15 13:23:22 +0000182 sys.exit(0)
183
184
185# main()
186Make(sys.argv[1:])
187
epoger@google.com877cfe32011-07-11 19:52:00 +0000188