blob: 1e0b7e71b584b56ec522b5ea786ae3d384dc10ce [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.
7# More info at http://code.google.com/p/skia/wiki/DocRoot
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
23TARGET_ALL = 'all'
epoger@google.com877cfe32011-07-11 19:52:00 +000024TARGET_CLEAN = 'clean'
epoger@google.com52c5cbf2012-03-23 18:14:25 +000025TARGET_GYP = 'gyp'
epoger@google.com7815e732011-07-15 13:23:22 +000026LIST_OF_ALL_TARGETS = ['SampleApp', 'bench', 'gm', 'tests', 'tools']
epoger@google.com877cfe32011-07-11 19:52:00 +000027
28SCRIPT_DIR = os.path.abspath(os.path.dirname(__file__))
29OUT_SUBDIR = 'out'
30GYP_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
136 targets = []
137 for arg in args:
138 if arg == TARGET_ALL:
139 targets.extend(LIST_OF_ALL_TARGETS)
140 elif arg == TARGET_CLEAN:
141 MakeClean()
142 elif arg.startswith('BUILDTYPE='):
143 BUILDTYPE = arg[10:]
144 elif arg.startswith('GYP_DEFINES='):
145 os.environ['GYP_DEFINES'] = arg[12:]
146 else:
147 targets.append(arg)
148
149 # if there are no remaining targets, we're done
150 if not targets:
151 sys.exit(0)
152
153 # dispatch to appropriate Make<Platform>() variant.
154 if os.name == 'nt':
155 MakeWindows(targets)
156 sys.exit(0)
157 elif os.name == 'posix':
158 if sys.platform == 'darwin':
159 print 'Mac developers should not run this script; see ' \
160 'http://code.google.com/p/skia/wiki/GettingStartedOnMac'
161 sys.exit(1)
162 elif sys.platform == 'cygwin':
163 print 'Windows development on Cygwin is not currently supported; ' \
164 'see http://code.google.com/p/skia/wiki/GettingStartedOnWindows'
165 sys.exit(1)
166 else:
167 print 'Unix developers should not run this script; see ' \
168 'http://code.google.com/p/skia/wiki/GettingStartedOnLinux'
169 sys.exit(1)
epoger@google.com877cfe32011-07-11 19:52:00 +0000170 else:
epoger@google.com7815e732011-07-15 13:23:22 +0000171 print 'unknown platform (os.name=%s, sys.platform=%s); see %s' % (
172 os.name, sys.platform, 'http://code.google.com/p/skia/wiki/DocRoot')
epoger@google.com877cfe32011-07-11 19:52:00 +0000173 sys.exit(1)
epoger@google.com7815e732011-07-15 13:23:22 +0000174 sys.exit(0)
175
176
177# main()
178Make(sys.argv[1:])
179
epoger@google.com877cfe32011-07-11 19:52:00 +0000180