-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
conanfile.py
134 lines (115 loc) · 6.46 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
from conan import ConanFile
from conan.errors import ConanInvalidConfiguration
from conan.tools.build import check_min_cppstd
from conan.tools.cmake import CMake, CMakeDeps, CMakeToolchain, cmake_layout
from conan.tools.files import apply_conandata_patches, copy, export_conandata_patches, get, rm, rmdir
from conan.tools.microsoft import is_msvc, is_msvc_static_runtime
import os
required_conan_version = ">=2.0.9"
#
# INFO: Please, remove all comments before pushing your PR!
#
class PackageConan(ConanFile):
name = "package"
description = "short description"
# Use short name only, conform to SPDX License List: https://spdx.org/licenses/
# In case not listed there, use "DocumentRef-<license-file-name>:LicenseRef-<package-name>"
license = ""
url = "https://github.com/conan-io/conan-center-index"
homepage = "https://github.com/project/package"
# no "conan" and project name in topics. Use topics from the upstream listed on GH
topics = ("topic1", "topic2", "topic3")
# package_type should usually be "library", "shared-library" or "static-library"
package_type = "library"
settings = "os", "arch", "compiler", "build_type"
options = {
"shared": [True, False],
"fPIC": [True, False],
}
default_options = {
"shared": False,
"fPIC": True,
}
# In case having config_options() or configure() method, the logic should be moved to the specific methods.
implements = ["auto_shared_fpic"]
# no exports_sources attribute, but export_sources(self) method instead
def export_sources(self):
export_conandata_patches(self)
def configure(self):
# Keep this logic only in case configure() is needed e.g pure-c project.
# Otherwise remove configure() and auto_shared_fpic will manage it.
if self.options.shared:
self.options.rm_safe("fPIC")
# for plain C projects only
self.settings.rm_safe("compiler.cppstd")
self.settings.rm_safe("compiler.libcxx")
def layout(self):
cmake_layout(self, src_folder="src")
def requirements(self):
# Always prefer self.requirements() method instead of self.requires attribute.
self.requires("dependency/0.8.1")
if self.options.with_foobar:
# INFO: used in foo/baz.hpp:34
self.requires("foobar/0.1.0", transitive_headers=True, transitive_libs=True)
# Some dependencies on CCI are allowed to use version ranges.
# See https://github.com/conan-io/conan-center-index/blob/master/docs/adding_packages/dependencies.md#version-ranges
self.requires("openssl/[>=1.1 <4]")
def validate(self):
# validate the minimum cpp standard supported. For C++ projects only.
check_min_cppstd(self, 14)
# in case it does not work in another configuration, it should be validated here. Always comment the reason including the upstream issue.
# INFO: Upstream does not support DLL: See <URL>
if is_msvc(self) and self.options.shared:
raise ConanInvalidConfiguration(f"{self.ref} can not be built as shared on Visual Studio and msvc.")
# if a tool other than the compiler or CMake newer than 3.15 is required to build the project (pkgconf, bison, flex etc)
def build_requirements(self):
self.tool_requires("cmake/[>=3.16 <4]")
def source(self):
get(self, **self.conan_data["sources"][self.version], strip_root=True)
# Using patches is always the last resort to fix issues. If possible, try to fix the issue in the upstream project.
apply_conandata_patches(self)
def generate(self):
# BUILD_SHARED_LIBS and POSITION_INDEPENDENT_CODE are set automatically as tc.variables when self.options.shared or self.options.fPIC exist
tc = CMakeToolchain(self)
# Boolean values are preferred instead of "ON"/"OFF"
tc.cache_variables["PACKAGE_BUILD_TESTS"] = False
if is_msvc(self):
tc.cache_variables["USE_MSVC_RUNTIME_LIBRARY_DLL"] = not is_msvc_static_runtime(self)
tc.generate()
# In case there are dependencies listed under requirements, CMakeDeps should be used
deps = CMakeDeps(self)
# You can override the CMake package and target names if they don't match the names used in the project
deps.set_property("fontconfig", "cmake_file_name", "Fontconfig")
deps.set_property("fontconfig", "cmake_target_name", "Fontconfig::Fontconfig")
deps.generate()
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def package(self):
copy(self, "LICENSE", self.source_folder, os.path.join(self.package_folder, "licenses"))
cmake = CMake(self)
cmake.install()
# Some files extensions and folders are not allowed. Please, read the FAQs to get informed.
# Consider disabling these at first to verify that the package_info() output matches the info exported by the project.
rmdir(self, os.path.join(self.package_folder, "lib", "pkgconfig"))
rmdir(self, os.path.join(self.package_folder, "lib", "cmake"))
rmdir(self, os.path.join(self.package_folder, "share"))
rm(self, "*.pdb", self.package_folder, recursive=True)
def package_info(self):
# library name to be packaged
self.cpp_info.libs = ["package_lib"]
# if package has an official FindPACKAGE.cmake listed in https://cmake.org/cmake/help/latest/manual/cmake-modules.7.html#find-modules
# examples: bzip2, freetype, gdal, icu, libcurl, libjpeg, libpng, libtiff, openssl, sqlite3, zlib...
self.cpp_info.set_property("cmake_module_file_name", "PACKAGE")
self.cpp_info.set_property("cmake_module_target_name", "PACKAGE::PACKAGE")
# if package provides a CMake config file (package-config.cmake or packageConfig.cmake, with package::package target, usually installed in <prefix>/lib/cmake/<package>/)
self.cpp_info.set_property("cmake_file_name", "package")
self.cpp_info.set_property("cmake_target_name", "package::package")
# if package provides a pkgconfig file (package.pc, usually installed in <prefix>/lib/pkgconfig/)
self.cpp_info.set_property("pkg_config_name", "package")
# If they are needed on Linux, m, pthread and dl are usually needed on FreeBSD too
if self.settings.os in ["Linux", "FreeBSD"]:
self.cpp_info.system_libs.append("m")
self.cpp_info.system_libs.append("pthread")
self.cpp_info.system_libs.append("dl")