-
Notifications
You must be signed in to change notification settings - Fork 0
/
conanfile.py
174 lines (139 loc) · 6.55 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
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
from conan import ConanFile
from conan.tools.cmake import CMakeToolchain, CMake, cmake_layout, CMakeDeps
from conan.tools.files import get, copy, rmdir
from collections import namedtuple
class libprojectmRecipe(ConanFile):
name = "libprojectm"
version = "4.1.1"
package_type = "library"
# Optional metadata
license = "LGPL 2.1"
author = "The projectM team"
url = "https://github.com/conan-io/conan-center-index/tree/master/recipes/libprojectm"
description = "The most advanced open-source music visualizer library. Project page https://github.com/projectM-visualizer/projectm"
topics = ("audio", "opengl", "visualizer", "graphics")
exports_sources = "cmake/*", "src/*", "presets/*", "tests/*", "vendor/*", "CMakeLists.txt", "config.h.cmake.in", "features.cmake"
settings = "os", "compiler", "build_type", "arch"
options = {
"shared": [True, False],
"fPIC": [True, False],
# Enable building projectM playlist library
"enable_playlist": [True, False],
# Enable using GLES instead of OpenGL Core Profile
"enable_gles": [True, False],
# Force using Boost filesystem instead of cpp 17 filesystem
"enable_boost_filesystem": [True, False],
# Enable using a Conan dependency for GLM instead of the version bundled with projectM
"enable_dep_glm": [True, False],
# Enable exporting C++ symbols for ProjectM and PCM classes, not only the C API. Warning: This is not very portable.
"enable_cxx_interface": [True, False],
# Build and execute unit tests during Conan package build
"enable_tests": [True, False],
# Enable building from a local source directory (for local projectM lib development only)
"use_local_source_dir": [True, False],
# Local source directory location
"local_source_dir": ["ANY"]
}
default_options = {
"shared": False,
"fPIC": True,
"enable_playlist": True,
"enable_gles": False,
"enable_boost_filesystem": False,
"enable_dep_glm": False,
"enable_tests": True,
"enable_cxx_interface": False,
"use_local_source_dir": False,
"local_source_dir": ''
}
# define projectM components
_ProjectMComponent = namedtuple("_ProjectMComponent", ("option", "dependencies", "external_dependencies", "exported_libs"))
_projectm_component_tree = {
# projectM playlist library
"playlist": _ProjectMComponent("enable_playlist", [], [], ["projectM-4-playlist"]),
# projectM main library
"projectm": _ProjectMComponent(None, ["playlist"], [], ["projectM-4"]),
}
def config_options(self):
if self.settings.os == "Windows":
self.options.rm_safe("fPIC")
def configure(self):
if self.options.shared:
self.options.rm_safe("fPIC")
if self.options.enable_gles:
self._projectm_component_tree["projectm"].external_dependencies.append("gles::gles")
else:
self._projectm_component_tree["projectm"].external_dependencies.append("opengl::opengl")
if self.options.enable_dep_glm:
self._projectm_component_tree["projectm"].external_dependencies.append("glm::glm")
if self.settings.os == "Windows":
self._projectm_component_tree["projectm"].external_dependencies.append("glew::glew")
if self.options.enable_tests:
self._projectm_component_tree["projectm"].external_dependencies.append("gtest::gtest")
if self.options.enable_boost_filesystem:
self._projectm_component_tree["projectm"].external_dependencies.append("boost::filesystem")
self._projectm_component_tree["projectm-test-ui"].external_dependencies.append("boost::filesystem")
def layout(self):
cmake_layout(self)
def source(self):
if self.info.options.use_local_source_dir:
copy(self,
'*',
self.info.options.local_source_dir.value,
'.'
)
else:
get(
self,
**self.conan_data["sources"][self.version],
strip_root=True
)
def requirements(self):
deps = self.conan_data["dependencies"][self.version]
if self.options.enable_gles:
self.requires(f"gles/{deps['gles']}")
else:
self.requires(f"opengl/{deps['opengl']}")
if self.options.enable_dep_glm:
self.requires(f"glm/{deps['glm']}")
if self.settings.os == "Windows":
self.requires(f"glew/{deps['glew']}")
if self.options.enable_tests:
self.requires(f"gtest/{deps['gtest']}")
if self.options.enable_boost_filesystem:
self.requires(f"boost/{deps['boost']}")
def generate(self):
deps = CMakeDeps(self)
deps.generate()
tc = CMakeToolchain(self)
tc.variables['ENABLE_EMSCRIPTEN'] = False
tc.variables['BUILD_TESTING'] = self.options.enable_tests
tc.variables['BUILD_DOCS'] = False
tc.variables['ENABLE_SDL_UI'] = False
tc.variables['ENABLE_PLAYLIST'] = self.options.enable_playlist
tc.variables['ENABLE_GLES'] = self.options.enable_gles
tc.variables['ENABLE_SYSTEM_GLM'] = False
tc.variables['ENABLE_INSTALL'] = True
tc.variables['ENABLE_CXX_INTERFACE'] = self.options.enable_cxx_interface
tc.variables['ENABLE_BOOST_FILESYSTEM'] = self.options.enable_boost_filesystem
tc.variables['ENABLE_SYSTEM_PROJECTM_EVAL'] = False
tc.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
if self.info.options.enable_tests:
cmake.test()
def package(self):
cmake = CMake(self)
cmake.install()
def package_info(self):
for compname, comp in self._projectm_component_tree.items():
if comp.option is None or self.options.get_safe(comp.option):
conan_component = f"{compname.lower()}"
requires = [f"{dependency.lower()}" for dependency in comp.dependencies] + comp.external_dependencies
self.cpp_info.components[conan_component].set_property("cmake_target_name", f"libprojectm::{compname}")
if comp.exported_libs:
self.cpp_info.components[conan_component].libs = [ l + ("d" if self.settings.build_type == "Debug" else "") for l in comp.exported_libs ]
if requires:
self.cpp_info.components[conan_component].requires = requires