blob: 78c12642df6c6ae29ae21b7c9df31a7c92c56e63 [file] [log] [blame]
Mark Youngc65d3252016-01-06 15:58:55 -07001#!/usr/bin/env python3
2#
Karl Schultz8e42f402016-02-02 19:32:33 -07003# Copyright (c) 2016 The Khronos Group Inc.
4# Copyright (c) 2016 Valve Corporation
5# Copyright (c) 2016 LunarG, Inc.
6# Copyright (c) 2016 Google Inc.
Mark Youngc65d3252016-01-06 15:58:55 -07007#
Karl Schultz8e42f402016-02-02 19:32:33 -07008# Permission is hereby granted, free of charge, to any person obtaining a copy
9# of this software and/or associated documentation files (the "Materials"), to
10# deal in the Materials without restriction, including without limitation the
11# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
12# sell copies of the Materials, and to permit persons to whom the Materials
13# are furnished to do so, subject to the following conditions:
Mark Youngc65d3252016-01-06 15:58:55 -070014#
Karl Schultz8e42f402016-02-02 19:32:33 -070015# The above copyright notice(s) and this permission notice shall be included
16# in all copies or substantial portions of the Materials.
Mark Youngc65d3252016-01-06 15:58:55 -070017#
Karl Schultz8e42f402016-02-02 19:32:33 -070018# THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Mark Youngc65d3252016-01-06 15:58:55 -070019# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Karl Schultz8e42f402016-02-02 19:32:33 -070020# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21#
22# IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
23# DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24# OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE MATERIALS OR THE
25# USE OR OTHER DEALINGS IN THE MATERIALS
Mark Youngc65d3252016-01-06 15:58:55 -070026#
27# Author: Mark Young <marky@lunarg.com>
28
29import sys
30import os
31
32# Following function code snippet was found on StackOverflow (with a change to lower
33# camel-case on the variable names):
34# http://stackoverflow.com/questions/377017/test-if-executable-exists-in-python
35def find_executable(program):
36 def is_exe(fPath):
37 return os.path.isfile(fPath) and os.access(fPath, os.X_OK)
38
39 fPath, fName = os.path.split(program)
40 if fPath:
41 if is_exe(program):
42 return program
43 else:
44 for path in os.environ["PATH"].split(os.pathsep):
45 path = path.strip('"')
46 exe_file = os.path.join(path, program)
47 if is_exe(exe_file):
48 return exe_file
49
50 return None
51
52def determine_year(version):
53 if version == 8:
54 return 2005
55 elif version == 9:
56 return 2008
57 elif version == 10:
58 return 2010
59 elif version == 11:
60 return 2012
61 elif version == 12:
62 return 2013
63 elif version == 14:
64 return 2015
65 else:
66 return 0000
67
68# Determine if msbuild is in the path, then call it to determine the version and parse
69# it into a format we can use, which is "<version_num> <version_year>".
70if __name__ == '__main__':
71 exeName = 'msbuild.exe'
72 versionCall = exeName + ' /ver'
73
74 # Determine if the executable exists in the path, this is critical.
75 #
76 foundExeName = find_executable(exeName)
77
78 # If not found, return an invalid number but in the appropriate format so it will
79 # fail if the program above tries to use it.
80 if foundExeName == None:
Mark Young93ecb1d2016-01-13 13:47:16 -070081 print('00 0000')
Mark Youngc65d3252016-01-06 15:58:55 -070082 print('Executable ' + exeName + ' not found in PATH!')
83 else:
84 sysCallOut = os.popen(versionCall).read()
85
86 version = None
87
88 # Split around any spaces first
89 spaceList = sysCallOut.split(' ')
90 for spaceString in spaceList:
91
92 # If we've already found it, bail.
93 if version != None:
94 break
95
96 # Now split around line feeds
97 lineList = spaceString.split('\n')
98 for curLine in lineList:
99
100 # If we've already found it, bail.
101 if version != None:
102 break
103
104 # We only want to continue if there's a period in the list
105 if '.' not in curLine:
106 continue
107
108 # Get the first element and determine if it is a number, if so, we've
109 # got our number.
110 splitAroundPeriod = curLine.split('.')
111 if splitAroundPeriod[0].isdigit():
112 version = int (splitAroundPeriod[0])
113 break
114
115 # Failsafe to return a number in the proper format, but one that will fail.
116 if version == None:
117 version = 00
118
119 # Determine the year associated with that version
120 year = determine_year(version)
Mark Younge7da8372016-01-07 12:43:07 -0700121
Mark Youngc65d3252016-01-06 15:58:55 -0700122 # Output the string we need for Cmake to properly build for this version
Mark Young93ecb1d2016-01-13 13:47:16 -0700123 print(str(version) + ' ' + str(year))