-
Notifications
You must be signed in to change notification settings - Fork 13
/
custom_compiler_yaml_tasking.py
90 lines (84 loc) · 4.32 KB
/
custom_compiler_yaml_tasking.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
##
# This script runs one or more TASKING compilers and gathers information
# for CLion's Custom Compiler definitions file, see
# https://blog.jetbrains.com/clion/2021/10/clion-2021-3-eap-custom-compiler/
# https://www.jetbrains.com/help/clion/custom-compilers.html
#
# The script is tested against TASKING VX-toolset v6.3r1 for Infineon TriCore
# `output_filename`, `tasking_install_folder`, `tasking_platform_suffix`, `c_additional_compile_switches`, and
# `cpp_additional_compile_switches` variables can be adjusted to fit another toolset variant
#
# # License
#
# Apache 2.0, https://github.com/JetBrains/clion-custom-defined-compiler-examples/blob/master/LICENSE
#
# # Disclaimer
#
# All the repository content is provided on an "AS IS" basis, without warranties or conditions of any kind.
#
# Please note that JetBrains does not provide the described compilers or required licenses. The use of third-party
# compilers in CLion is subject to the licensing policies of their vendors, while config files are open source.
# All trademarks, logos and brand names are the property of their respective owners. All company, product and service
# names used in this repository are for identification purposes only. Use of these names,trademarks and brands does not
# imply endorsement.
#
##
import os, subprocess, tempfile, re
output_filename = "custom-compiler-tasking-generated.yaml"
tasking_install_folder = "C:\\Program Files\\TASKING\\TriCore v6.3r1"
tasking_platform_suffix = ["51", "arm", "mcs", "tc"] # 8051, ARM, MCS, TriCore
c_additional_compile_switches = "--iso=99" # example, may be empty
cpp_additional_compile_switches = "--c++=11" # example, may be empty
def extract_defines(compiler_bin, src_name):
result = subprocess.run([compiler_bin, "-El", src_name], stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
if result.returncode != 0:
return None
all_defines = result.stdout.decode("ascii").splitlines()
filtered_defines = filter(lambda s: s.split()[1] not in ['__FILE__', '__LINE__', '__DATE__', '__TIME__' ],
all_defines)
str_defines = '\n'.join(filtered_defines).replace("\"","\\\"")
return str_defines
with open(output_filename, "wt") as yaml_file:
open("__empty.c", "wt")
open("__empty.cpp", "wt")
try:
print("compilers:", file=yaml_file)
for suffix in tasking_platform_suffix:
compiler_bin = tasking_install_folder + os.path.sep + "c" + suffix + os.path.sep + "bin" + os.path.sep + "cc" + suffix
version = \
subprocess.run([compiler_bin, "-V"], stderr=subprocess.STDOUT,
stdout=subprocess.PIPE).stdout.splitlines()[0].decode("ascii")
print(f"Compiler: {version}")
c_definitions = extract_defines(compiler_bin, "__empty.c")
if c_definitions is None:
print("Skipping yaml for C")
else:
print("Writing yaml for C")
print(f' - description: "C, {version}"',
f' match-compiler-exe: "(.*/)?cc{suffix}(\\\\.exe)?"',
f' match-sources: ".*\\\\.c"',
f' match-language: C',
f' code-insight-target-name: arm',
f' include-dirs: ["${{compiler-exe-dir}}/../include"]',
f' defines-text: "',
c_definitions,
'"',
file=yaml_file, sep="\n")
cpp_definitions = extract_defines(compiler_bin, "__empty.cpp")
if cpp_definitions is None:
print("Skipping yaml for C++")
else:
print("Writing yaml for C++")
print(f' - description: "C++, {version}"',
f' match-compiler-exe: "(.*/)?cc{suffix}(\\\\.exe)?"',
f' match-sources: ".*\\\\.cpp"',
f' match-language: CPP',
f' code-insight-target-name: arm',
f' include-dirs: ["${{compiler-exe-dir}}/../include", "${{compiler-exe-dir}}/../include.cxx"]',
f' defines-text: "',
cpp_definitions,
'"',
file=yaml_file, sep="\n")
finally:
os.unlink("__empty.c")
os.unlink("__empty.cpp")