• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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