blob: 7808329fb632754f80d033f8225a477213842948 [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.
Thiago Farina4c93a122015-02-03 13:12:54 -02007# More info at https://skia.org.
epoger@google.com7815e732011-07-15 13:23:22 +00008#
9# Some usage examples:
10# make clean
Thiago Farinae6402ca2014-10-13 17:51:57 -030011# make dm
epoger@google.com7815e732011-07-15 13:23:22 +000012# make bench BUILDTYPE=Release
Hal Canary824f46c2015-11-10 13:25:12 -050013# make gm GYP_DEFINES='skia_gpu=0' BUILDTYPE=Release
epoger@google.com7815e732011-07-15 13:23:22 +000014# make all
epoger@google.com877cfe32011-07-11 19:52:00 +000015
16import os
17import shutil
18import sys
19
Eric Borenfa1c0732015-08-05 11:30:28 -040020BUILDTYPE = os.environ.get('BUILDTYPE', 'Debug')
epoger@google.com0fb21252011-07-13 21:30:14 +000021
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
45def runcommand(command):
46 print '> %s' % command
47 if os.system(command):
48 sys.exit(1)
49
50def MakeClean():
51 """Cross-platform "make clean" operation."""
52 cd(SCRIPT_DIR)
53 rmtree(OUT_SUBDIR)
epoger@google.com877cfe32011-07-11 19:52:00 +000054
55
56def CheckWindowsEnvironment():
57 """For Windows: check environment variables needed for command-line build.
58
59 If those environment variables are missing, try to set them.
60 If environment variables can be set up, this function returns; otherwise,
61 it displays an error message and exits.
62 """
63 # If we already have the proper environment variables, nothing to do here.
Eric Boren030854e2015-03-03 13:15:38 -050064 if os.environ.get('DevEnvDir'):
65 return
epoger@google.com877cfe32011-07-11 19:52:00 +000066
67 print ('\nCould not find Visual Studio environment variables.'
68 '\nPerhaps you have not yet run vcvars32.bat as described at'
69 '\nhttp://msdn.microsoft.com/en-us/library/f2ccy3wt.aspx ?')
70 found_path = None
71 try:
72 possible_path = os.path.abspath(os.path.join(
73 os.environ['VS100COMNTOOLS'], os.path.pardir, os.path.pardir,
74 'VC', 'bin', 'vcvars32.bat'))
75 if os.path.exists(possible_path):
76 found_path = possible_path
77 except KeyError:
78 pass
79 if found_path:
80 print '\nIt looks like you can run that script at:\n%s' % found_path
81 else:
82 print '\nUnable to find vcvars32.bat on your system.'
83 sys.exit(1)
84
85
epoger@google.com7815e732011-07-15 13:23:22 +000086def MakeWindows(targets):
epoger@google.com877cfe32011-07-11 19:52:00 +000087 """For Windows: build as appropriate for the command line arguments.
88
89 parameters:
epoger@google.com7815e732011-07-15 13:23:22 +000090 targets: build targets as a list of strings
epoger@google.com877cfe32011-07-11 19:52:00 +000091 """
Eric Boren91184132014-06-16 10:02:42 -040092 if os.environ.get('CHROME_HEADLESS', '0') != '1':
93 # TODO(epoger): I'm not sure if this is needed for ninja builds.
94 CheckWindowsEnvironment()
epoger@google.com0fb21252011-07-13 21:30:14 +000095
epoger@google.com877cfe32011-07-11 19:52:00 +000096 # Run gyp_skia to prepare Visual Studio projects.
97 cd(SCRIPT_DIR)
Eric Boren030854e2015-03-03 13:15:38 -050098 runcommand('python gyp_skia --no-parallel -G config=%s' % BUILDTYPE)
epoger@google.com0fb21252011-07-13 21:30:14 +000099
epoger@google.com58d69d82014-04-01 07:02:41 +0000100 # We already built the gypfiles...
101 while TARGET_GYP in targets:
102 targets.remove(TARGET_GYP)
epoger@google.com0fb21252011-07-13 21:30:14 +0000103
epoger@google.com58d69d82014-04-01 07:02:41 +0000104 # And call ninja to do the work!
105 if targets:
106 runcommand('ninja -C %s %s' % (
107 os.path.join(OUT_SUBDIR, BUILDTYPE), ' '.join(targets)))
epoger@google.com877cfe32011-07-11 19:52:00 +0000108
epoger@google.com7815e732011-07-15 13:23:22 +0000109
110def Make(args):
111 """Main function.
112
113 parameters:
114 args: command line arguments as a list of strings
115 """
116 # handle any variable-setting parameters or special targets
117 global BUILDTYPE
epoger@google.com9c875d32012-10-18 16:10:56 +0000118
119 # if no targets were specified at all, make default target
120 if not args:
121 args = [TARGET_DEFAULT]
122
epoger@google.com7815e732011-07-15 13:23:22 +0000123 targets = []
124 for arg in args:
Eric Boren030854e2015-03-03 13:15:38 -0500125 # If user requests "make all", chain to our explicitly-declared
126 # "everything" target. See
127 # https://code.google.com/p/skia/issues/detail?id=932 ("gyp
128 # automatically creates "all" target on some build flavors but not
129 # others")
epoger@google.com7815e732011-07-15 13:23:22 +0000130 if arg == TARGET_ALL:
epoger@google.com6714ea42012-10-25 16:32:07 +0000131 targets.append('everything')
epoger@google.com7815e732011-07-15 13:23:22 +0000132 elif arg == TARGET_CLEAN:
133 MakeClean()
134 elif arg.startswith('BUILDTYPE='):
135 BUILDTYPE = arg[10:]
136 elif arg.startswith('GYP_DEFINES='):
137 os.environ['GYP_DEFINES'] = arg[12:]
138 else:
139 targets.append(arg)
140
141 # if there are no remaining targets, we're done
142 if not targets:
143 sys.exit(0)
144
145 # dispatch to appropriate Make<Platform>() variant.
146 if os.name == 'nt':
147 MakeWindows(targets)
148 sys.exit(0)
149 elif os.name == 'posix':
150 if sys.platform == 'darwin':
Eric Boren030854e2015-03-03 13:15:38 -0500151 print ('Mac developers should not run this script; see '
152 'https://skia.org/user/quick/macos')
epoger@google.com7815e732011-07-15 13:23:22 +0000153 sys.exit(1)
154 elif sys.platform == 'cygwin':
Eric Boren030854e2015-03-03 13:15:38 -0500155 print ('Windows development on Cygwin is not currently supported; '
156 'see https://skia.org/user/quick/windows')
epoger@google.com7815e732011-07-15 13:23:22 +0000157 sys.exit(1)
158 else:
Eric Boren030854e2015-03-03 13:15:38 -0500159 print ('Unix developers should not run this script; see '
160 'https://skia.org/user/quick/linux')
epoger@google.com7815e732011-07-15 13:23:22 +0000161 sys.exit(1)
epoger@google.com877cfe32011-07-11 19:52:00 +0000162 else:
epoger@google.com7815e732011-07-15 13:23:22 +0000163 print 'unknown platform (os.name=%s, sys.platform=%s); see %s' % (
Thiago Farina4c93a122015-02-03 13:12:54 -0200164 os.name, sys.platform, 'https://skia.org/user/quick')
epoger@google.com877cfe32011-07-11 19:52:00 +0000165 sys.exit(1)
epoger@google.com7815e732011-07-15 13:23:22 +0000166 sys.exit(0)
167
168
169# main()
170Make(sys.argv[1:])
171
epoger@google.com877cfe32011-07-11 19:52:00 +0000172