-
Notifications
You must be signed in to change notification settings - Fork 4
/
conanfile.py
150 lines (131 loc) · 6.05 KB
/
conanfile.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
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
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
from typing import Any
from conans import ConanFile, CMake
import os
import posixpath
import shutil
import version_gen
VALID_MAX_CONFIGS: dict[tuple[str, str], set[str]] = {
('Visual Studio', '15'): { '2022' },
('Visual Studio', '16'): { '2023' },
}
SETTINGS: dict[str, Any] = {
'os': ['Windows'],
'compiler': {
'Visual Studio': {'version': ['15', '16']},
},
'build_type': None,
'arch': 'x86_64'
}
TOOL_REQUIRES: list [str] = [
'cmake/3.24.1',
'thinkboxcmlibrary/1.0.0'
]
REQUIRES: list[str] = [
'thinkboxlibrary/1.0.1',
'maxsdk/1.0.0',
'thinkboxmxlibrary/1.0.0',
'frost/1.0.0'
]
NO_LICENSE_ALLOWLIST: set[str] = {
# ThinkboxCMLibrary is not distributed with this package
'thinkboxcmlibrary',
# The 3ds Max SDK is not open source and we do not distribute it
'maxsdk',
# We do not distribute OpenGL
'opengl',
# We do not distribute CMake
'cmake'
}
UNUSED_LICENSE_DENYLIST: set[str] = {
# Parts of Eigen are licensed under GPL or LGPL
# Eigen provides an option to disable these parts such
# that a compiler error will be generated if they are used.
# We do not use these parts, and enable this option.
'licenses/eigen/licenses/COPYING.GPL',
'licenses/eigen/licenses/COPYING.LGPL',
# Freetype is dual licensed under it's own BSD style license, FTL
# as well as GPLv2. We are licensing it under FTL so we will not
# include GPLv2 in our attributions document.
'licenses/freetype/licenses/GPLv2.txt'
}
class FrostMXConan(ConanFile):
name: str = 'frostmx'
version: str = '2.5.2'
license: str = 'Apache-2.0'
description: str = 'The Frost Plugin for 3ds Max'
settings: dict[str, Any] = SETTINGS
requires: list[str] = REQUIRES
tool_requires: list[str] = TOOL_REQUIRES
generators: str | list[str] = 'cmake_find_package'
options: dict[str, Any] = {
'max_version': ['2022', '2023']
}
def configure(self) -> None:
if self.options.max_version == None:
self.options.max_version = '2023'
self.options['maxsdk'].max_version = self.options.max_version
self.options['thinkboxmxlibrary'].max_version = self.options.max_version
def validate(self) -> None:
if self.options.max_version != self.options['maxsdk'].max_version:
raise Exception('Option \'max_version\' must be the same as maxsdk')
if self.options.max_version != self.options['thinkboxmxlibrary'].max_version:
raise Exception('Option \'max_version\' must be the same as thinkboxmxlibrary')
compiler = str(self.settings.compiler)
compiler_version = str(self.settings.compiler.version)
compiler_tuple = (compiler, compiler_version)
max_version = str(self.options.max_version)
if max_version not in VALID_MAX_CONFIGS[compiler_tuple]:
raise Exception(f'{str(compiler_tuple)} is not a valid configuration for 3ds Max {max_version}')
def imports(self) -> None:
self.copy("license*", dst="licenses", folder=True, ignore_case=True)
self.generate_attributions_doc()
def build(self) -> None:
version_gen.write_version_resource(self.version, os.path.join(self.source_folder, 'FrostMXVersion.rc'))
version_gen.write_version_header(self.version, os.path.join(self.source_folder, 'FrostMXVersion.h'))
version_gen.write_version_hash(self.version, self.source_folder, os.path.join(self.source_folder, 'FrostVersionHash.hpp'))
shutil.copyfile('attributions.txt', os.path.join(self.source_folder, 'third_party_licenses.txt'))
cmake = CMake(self)
cmake.configure(defs={
'MAX_VERSION': self.options.max_version
})
cmake.build()
def export_sources(self) -> None:
self.copy('**.h', src='', dst='')
self.copy('**.hpp', src='', dst='')
self.copy('**.cpp', src='', dst='')
self.copy('**.rc', src='', dst='')
self.copy('**.def', src='', dst='')
self.copy('CMakeLists.txt', src='', dst='')
self.copy('version_gen.py', src='', dst='')
self.copy('*', dst='Icons', src='Icons')
self.copy('*', dst='Scripts', src='Scripts')
def package(self) -> None:
cmake = CMake(self)
cmake.install()
self.copy('*', dst='Icons', src='Icons')
self.copy('*', dst='Scripts', src='Scripts')
self.copy('third_party_licenses.txt', dst='Legal', src='')
def deploy(self) -> None:
self.copy('*', dst='bin', src='bin')
self.copy('*', dst='lib', src='lib')
self.copy('*', dst='include', src='include')
self.copy('*', dst='Icons', src='Icons')
self.copy('*', dst='Scripts', src='Scripts')
self.copy('*', dst='Legal', src='Legal')
def generate_attributions_doc(self) -> None:
dependencies = [str(dependency[0].ref).split('/') for dependency in self.dependencies.items()]
with open('attributions.txt', 'w', encoding='utf8') as attributions_doc:
for name, version in dependencies:
if name not in NO_LICENSE_ALLOWLIST:
attributions_doc.write(f'######## {name} {version} ########\n\n')
licensedir = posixpath.join('licenses', name, 'licenses')
if not os.path.exists(licensedir):
raise Exception(f'Could not find license files for package {name} {version}.')
for licensefile in os.listdir(licensedir):
licensefilepath = posixpath.join(licensedir, licensefile)
if licensefilepath not in UNUSED_LICENSE_DENYLIST:
with open(licensefilepath, 'r', encoding='utf8') as lic:
attributions_doc.writelines(lic.readlines())
attributions_doc.write('\n')