1#!/usr/bin/env python 2# 3# Copyright (C) 2005-2019 Intel Corporation 4# 5# SPDX-License-Identifier: GPL-2.0-only OR BSD-3-Clause 6# 7 8from __future__ import print_function 9import os 10import sys 11import shutil 12import fnmatch 13import subprocess 14 15 16def run_shell(cmd): 17 print("\n>>", cmd) 18 os.system(cmd) 19 20 21if sys.platform == 'win32': 22 def read_registry(path, depth=0xFFFFFFFF, statics={}): 23 try: 24 import _winreg 25 except ImportError: 26 import winreg as _winreg 27 parts = path.split('\\') 28 hub = parts[0] 29 path = '\\'.join(parts[1:]) 30 if not statics: 31 statics['hubs'] = {'HKLM': _winreg.HKEY_LOCAL_MACHINE, 'HKCL': _winreg.HKEY_CLASSES_ROOT} 32 33 def enum_nodes(curpath, level): 34 if level < 1: 35 return {} 36 res = {} 37 try: 38 aKey = _winreg.OpenKey(statics['hubs'][hub], curpath, 0, _winreg.KEY_READ | _winreg.KEY_WOW64_64KEY) 39 except WindowsError: 40 return res 41 42 try: 43 i = 0 44 while True: 45 name, value, _ = _winreg.EnumValue(aKey, i) 46 i += 1 47 res[name] = value 48 except WindowsError: 49 pass 50 51 keys = [] 52 try: 53 i = 0 54 while True: 55 key = _winreg.EnumKey(aKey, i) 56 i += 1 57 keys.append(key) 58 except WindowsError: 59 pass 60 61 _winreg.CloseKey(aKey) 62 63 for key in keys: 64 res[key] = enum_nodes(curpath + '\\' + key, level - 1) 65 66 return res 67 68 return enum_nodes(path, depth) 69 70 71def get_vs_versions(): # https://www.mztools.com/articles/2008/MZ2008003.aspx 72 if sys.platform != 'win32': 73 return [] 74 versions = [] 75 76 hkcl = read_registry(r'HKCL', 1) 77 for key in hkcl: 78 if 'VisualStudio.DTE.' in key: 79 version = key.split('.')[2] 80 if int(version) >= 12: 81 versions.append(version) 82 83 if not versions: 84 print("No Visual Studio version found") 85 return sorted(versions) 86 87 88def detect_cmake(): 89 if sys.platform == 'darwin': 90 path, err = subprocess.Popen("which cmake", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 91 if not path.strip(): 92 path, err = subprocess.Popen("which xcrun", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 93 if not path.strip(): 94 print("No cmake and no XCode found...") 95 return None 96 return 'xcrun cmake' 97 return 'cmake' 98 99 100def main(): 101 import argparse 102 parser = argparse.ArgumentParser() 103 vs_versions = get_vs_versions() 104 parser.add_argument("-d", "--debug", help="specify debug build configuration (release by default)", action="store_true") 105 parser.add_argument("-c", "--clean", help="delete any intermediate and output files", action="store_true") 106 parser.add_argument("-v", "--verbose", help="enable verbose output from build process", action="store_true") 107 parser.add_argument("-pt", "--ptmark", help="enable anomaly detection support", action="store_true") 108 parser.add_argument("--force_bits", choices=["32", "64"], help="specify bit version for the target") 109 if sys.platform == 'win32' and vs_versions: 110 parser.add_argument("--vs", help="specify visual studio version {default}", choices=vs_versions, default=vs_versions[0]) 111 args = parser.parse_args() 112 113 if args.force_bits: 114 target_bits = [args.force_bits] 115 else: 116 target_bits = ['64'] 117 if (sys.platform != 'darwin'): # on MAC OSX we produce FAT library including both 32 and 64 bits 118 target_bits.append('32') 119 120 print("target_bits", target_bits) 121 work_dir = os.getcwd() 122 if args.clean: 123 bin_dir = os.path.join(work_dir, 'bin') 124 if os.path.exists(bin_dir): 125 shutil.rmtree(bin_dir) 126 for bits in target_bits: 127 work_folder = os.path.join(work_dir, "build_" + (sys.platform.replace('32', "")), bits) 128 already_there = os.path.exists(work_folder) 129 if already_there and args.clean: 130 shutil.rmtree(work_folder) 131 already_there = False 132 if not already_there: 133 os.makedirs(work_folder) 134 print("work_folder: ", work_folder) 135 os.chdir(work_folder) 136 if args.clean: 137 continue 138 139 cmake = detect_cmake() 140 if not cmake: 141 print("Error: cmake is not found") 142 return 143 144 if sys.platform == 'win32': 145 if vs_versions: 146 generator = ('Visual Studio %s' % args.vs) + (' Win64' if bits == '64' else '') 147 else: 148 generator = 'Ninja' 149 else: 150 generator = 'Unix Makefiles' 151 run_shell('%s "%s" -G"%s" %s' % (cmake, work_dir, generator, " ".join([ 152 ("-DFORCE_32=ON" if bits == '32' else ""), 153 ("-DCMAKE_BUILD_TYPE=Debug" if args.debug else ""), 154 ('-DCMAKE_VERBOSE_MAKEFILE:BOOL=ON' if args.verbose else ''), 155 ("-DITT_API_IPT_SUPPORT=1" if args.ptmark else "") 156 ]))) 157 if sys.platform == 'win32': 158 target_project = 'ALL_BUILD' 159 run_shell('%s --build . --config %s --target %s' % (cmake, ('Debug' if args.debug else 'Release'), target_project)) 160 else: 161 import glob 162 run_shell('%s --build . --config %s' % (cmake, ('Debug' if args.debug else 'Release'))) 163 if ('linux' in sys.platform and bits == '64'): 164 continue 165 run_shell('%s --build . --config %s --target' % (cmake, ('Debug' if args.debug else 'Release'))) 166 167if __name__== "__main__": 168 main() 169 170