/
pkg_cmake.py
144 lines (118 loc) · 5.33 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
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
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, exe=False):
refs = [ConanFileReference.loads(r) for r in requires or []]
pkg_name = name
name = name.replace(".", "_")
conanfile = textwrap.dedent("""\
import os
from conans import ConanFile
from conan.tools.cmake import CMake
from conan.tools.layout import cmake_layout
class Pkg(ConanFile):
name = "{pkg_name}"
version = "{version}"
exports_sources = "CMakeLists.txt", "src/*"
{deps}
settings = "os", "compiler", "arch", "build_type"
options = {{"shared": [True, False]}}
default_options = {{"shared": False}}
generators = "CMakeToolchain", "CMakeDeps"
def layout(self):
cmake_layout(self)
def build(self):
cmake = CMake(self)
cmake.configure()
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)
self.copy("*app.exe", dst="bin", keep_path=False)
self.copy("*app", dst="bin", 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]
files = {"src/{}.h".format(name): hdr,
"src/{}.cpp".format(name): src,
"conanfile.py": conanfile}
if exe:
src_app = gen_function_cpp(name="main", includes=[name], calls=[name])
files["src/{}_app.cpp".format(name)] = src_app
cmake = gen_cmakelists(appname="{}_app".format(name), appsources=["src/{}_app.cpp".format(name)],
libname=name, libsources=["src/{}.cpp".format(name)], find_package=deps)
else:
cmake = gen_cmakelists(libname=name, libsources=["src/{}.cpp".format(name)], find_package=deps)
files["CMakeLists.txt"] = cmake
return files
def pkg_cmake_test(require_name):
conanfile = textwrap.dedent("""\
import os
from conans import ConanFile
from conan.tools.cmake import CMake
from conan.tools.layout import cmake_layout
class Pkg(ConanFile):
settings = "os", "compiler", "arch", "build_type"
generators = "CMakeToolchain", "CMakeDeps", "VirtualRunEnv"
def layout(self):
cmake_layout(self)
def build(self):
cmake = CMake(self)
cmake.configure()
cmake.build()
def test(self):
cmd = os.path.join(self.cpp.build.bindirs[0], "test")
self.run(cmd, env=["conanrunenv"])
""")
deps = [require_name]
src = gen_function_cpp(name="main", includes=deps, calls=deps)
cmake = gen_cmakelists(appname="test", appsources=["src/test.cpp"], find_package=deps)
return {"test_package/src/test.cpp": src,
"test_package/CMakeLists.txt": cmake,
"test_package/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("""\
import os
from conans import ConanFile
from conan.tools.cmake import CMake
from conan.tools.layout import cmake_layout
class Pkg(ConanFile):
name = "{pkg_name}"
version = "{version}"
exports_sources = "CMakeLists.txt", "src/*"
{deps}
settings = "os", "compiler", "arch", "build_type"
generators = "CMakeToolchain", "CMakeDeps"
def layout(self):
cmake_layout(self)
def build(self):
cmake = CMake(self)
cmake.configure()
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=["src/{}.cpp".format(name)], find_package=deps)
return {"src/{}.cpp".format(name): src,
"CMakeLists.txt": cmake,
"conanfile.py": conanfile}