/
pkg_cmake.py
91 lines (76 loc) · 3.46 KB
/
pkg_cmake.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
import textwrap
from conans.model.ref import ConanFileReference
from conans.test.assets.cmake import gen_cmakelists
from conans.test.assets.sources import gen_function_h, gen_function_cpp
def pkg_cmake(name, version, requires=None):
refs = [ConanFileReference.loads(r) for r in requires or []]
pkg_name = name
name = name.replace(".", "_")
conanfile = textwrap.dedent("""\
from conans import ConanFile
from conan.tools.cmake import CMake
class Pkg(ConanFile):
name = "{pkg_name}"
version = "{version}"
exports = "*"
{deps}
settings = "os", "compiler", "arch", "build_type"
options = {{"shared": [True, False]}}
default_options = {{"shared": False}}
generators = "CMakeToolchain", "CMakeDeps"
def build(self):
cmake = CMake(self)
cmake.configure(source_folder="src")
cmake.build()
def package(self):
self.copy("*.h", dst="include", src="src")
self.copy("*.lib", dst="lib", keep_path=False)
self.copy("*.dll", dst="bin", keep_path=False)
self.copy("*.dylib*", dst="lib", keep_path=False)
self.copy("*.so", dst="lib", keep_path=False)
self.copy("*.a", dst="lib", keep_path=False)
def package_info(self):
self.cpp_info.libs = ["{name}"]
""")
deps = "requires = " + ", ".join('"{}"'.format(r) for r in requires) if requires else ""
conanfile = conanfile.format(pkg_name=pkg_name, name=name, version=version, deps=deps)
hdr = gen_function_h(name=name)
deps = [r.name.replace(".", "_") for r in refs]
src = gen_function_cpp(name=name, includes=deps, calls=deps)
deps = [r.name for r in refs]
cmake = gen_cmakelists(libname=name, libsources=["{}.cpp".format(name)], find_package=deps)
return {"src/{}.h".format(name): hdr,
"src/{}.cpp".format(name): src,
"src/CMakeLists.txt": cmake,
"conanfile.py": conanfile}
def pkg_cmake_app(name, version, requires=None):
refs = [ConanFileReference.loads(r) for r in requires or []]
pkg_name = name
name = name.replace(".", "_")
conanfile = textwrap.dedent("""\
from conans import ConanFile
from conan.tools.cmake import CMake
class Pkg(ConanFile):
name = "{pkg_name}"
version = "{version}"
exports = "*"
{deps}
settings = "os", "compiler", "arch", "build_type"
generators = "CMakeToolchain", "CMakeDeps"
def build(self):
cmake = CMake(self)
cmake.configure(source_folder="src")
cmake.build()
def package(self):
self.copy("*/app.exe", dst="bin", keep_path=False)
self.copy("*app", dst="bin", keep_path=False)
""")
deps = "requires = " + ", ".join('"{}"'.format(r) for r in requires) if requires else ""
conanfile = conanfile.format(pkg_name=pkg_name, name=name, version=version, deps=deps)
deps = [r.name.replace(".", "_") for r in refs]
src = gen_function_cpp(name="main", includes=deps, calls=deps)
deps = [r.name for r in refs]
cmake = gen_cmakelists(appname=name, appsources=["{}.cpp".format(name)], find_package=deps)
return {"src/{}.cpp".format(name): src,
"src/CMakeLists.txt": cmake,
"conanfile.py": conanfile}