Repository navigation
Expand file tree
/
Copy pathclasses.py
More file actions
176 lines (137 loc) · 6.15 KB
/
Copy pathclasses.py
File metadata and controls
176 lines (137 loc) · 6.15 KB
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
import variables
import sys
from enum import Enum
from typing import List, Optional
class CMakeFile:
"""Represents a CMake file that will be generated at a later stage."""
def __init__(self, directory):
self.directory = directory # The directory where this can be found
self.contained_libraries_content = [] # All the content of the libraries that are created in here
self.libraries = [] # All the libraries that are created by this file
self.extra_content = "" # Extra stuff such as add_subdriectory
class CMakeVersion:
"""Represents a CMake version object that will be utilized prior to, and during the generation stages."""
def __init__(self, version_string: str):
self.full_version: str = version_string
self.major: Optional[int] = None
self.minor: Optional[int] = None
# Since the build version is not always specified, defaulting it to 0 will avoid AttributeError(s)
self.build: int = 0
# Initializing the major, minor, and build versions
self.__parse__(version_string)
def __parse__(self, version_string: Optional[str]):
if version_string is None:
print("No CMake version string provided. Expected format: 'X.X' or 'X.X.X'")
sys.exit(1)
version_parts: List[int] = [int(part) for part in version_string.split('.') if part.isdigit()]
number_of_parts: int = len(version_parts)
if number_of_parts in [0, 1] or number_of_parts > 3:
print("Unable to parse the provided CMake version string. Expected format: 'X.X' or 'X.X.X'")
sys.exit(1)
# Covering the major and minor version numbers
if number_of_parts >= 2:
self.major = version_parts[0]
self.minor = version_parts[1]
# Since this class will not be called more than a handful of times, this additional check:
# - Covers the build version number
# - Uses a neglible amount of memory
# - Improves readability for future maintainers
if number_of_parts == 3:
self.build = version_parts[2]
def __str__(self):
return self.full_version
class TargetType(Enum):
"""Whether a target is a Library (noinst_LIBRARIES) or an Application (bin_PROGRAMS)"""
LIBRARY = 1
PROGRAM = 2
class Library:
"""Represents a library that will be built by a specific make command."""
def __init__(self, name, directory):
self.name = name
self.dependant = False
self.filelist = [] # the list of files of this library
self.condition = [] # the list of conditions on which this library is built if any
self.link_with_libs = [] # the list of libraries that were built by the script. target_link_libraries
self.compiler_flags = [] # the compiler options
self.linker_flags = [] # the linker flags. the -l flags will be parsed out into link_with_libs
self.conditional_appends = {}
self.just_variables = {}
self.added_subdirectories = []
self.target_type = TargetType.LIBRARY
self.ttype = ""
self.referred_name = name
if '$' in self.name:
self.name = self.name.replace('$', '')
self.name = self.name.replace('(', '')
self.name = self.name.replace(')', '')
self.dependant = True
from utils import canonicalize
self.canonic_name = canonicalize(self.name)
self.directory = directory
if not self.dependant:
if self.name.endswith(".a"):
self.type = "STATIC"
self.referred_name = self.name[3:]
self.referred_name = self.referred_name[:-2]
else:
self.type = "DYNAMIC"
self.referred_name = self.name[3:]
self.referred_name = self.referred_name[:-3]
else:
self.type = "STATIC"
self.referred_name = self.name
class Option:
"""Represents an option that will go in the CMakeLists.txt and also in the generated header if a define is present."""
def __init__(self, name, description, status, define, define_value, define_description):
name = name.replace("-", "_")
if variables.upcase_identifiers:
self.name = name.upper()
else:
self.name = name
self.description = description
self.status = status
self.define = define
define_value = define_value.replace(']', '')
define_value = define_value.replace(',', '')
define_value = define_value.replace('[', '')
self.define_value = define_value
self.define_description = define_description
self.extra_defines = []
def set_name(self, name):
self.name = name
def get_name(self):
return self.name
def set_description(self, description):
self.description = description
def get_description(self):
return self.description
def set_status(self, status):
self.status = status
def get_status(self):
return self.status
def set_define(self, define):
self.define = define
def get_define(self):
return self.define
def set_define_value(self, define_value):
if '[' in define_value:
define_value = define_value.replace(']', '')
define_value = define_value.replace('[', '')
self.define_value = define_value
def get_define_value(self):
return self.define_value
def set_define_description(self, define_description):
self.define_description = define_description
def get_define_description(self):
return self.define_description
def finalize(self):
if len(self.description) <= 1:
self.description = "Enable " + self.name
if len(self.status) <= 1:
self.status = "OFF"
if len(self.define_description) <= 1:
self.define_description = self.description
def add_extra_define(self, extra_define):
self.extra_defines.append(extra_define)
def get_extra_defines(self):
return self.extra_defines