Skip to content

Commit ec4c6d7

Browse files
committed
tooling: Migrate to Conan 2.0 compatible recipes and build files
Conan 2.0 brings important benefits that we will want to be able to take advantage of as soon as possible. To this end this commits already performs some of the most important steps by migrating the recipes and build tooling. This already brings some gains: - CMake `find_package` can be used instead of using non-portable CONAN_PKG. - We can package external tools with Conan without needing to patch the CMake files. - It should be easier to integrate Conan workspaces going forward. Other changes: - Conan minimum version set to 1.52 - Conan recipes use the APIs from the `conan` instead of the `conans` Python library. These are better structured and are 2.0 compatible.
1 parent 2702067 commit ec4c6d7

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

45 files changed

+811
-592
lines changed

Makefile.package

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ LOCKFILE_OPTION :=
5252
CLEAN_SOURCE_DIR := false
5353
BUILD_IN_SOURCE := true
5454
BUILD_DIR := build
55-
BUILD_CONANINFO := ${BUILD_DIR}/conanbuildinfo.cmake
55+
BUILD_CONANINFO := ${BUILD_DIR}/conanbuildinfo.txt
5656
BUILD_CMAKECACHE := ${BUILD_DIR}/CMakeCache.txt
5757
BUILD_LOCKFILE := ${BUILD_DIR}/conan.lock
5858
BUILD_LAYOUT := ${PROJECT_ROOT}/.conan-layout.ini
@@ -395,7 +395,7 @@ else
395395
all: ${BUILD_CONANINFO} | ${SOURCE_DIR}
396396
# Build the package in-source.
397397
#
398-
conan build . --source-folder="${SOURCE_DIR}" --build-folder="${BUILD_DIR}"
398+
conan build . --source-folder="${SOURCE_DIR}" --install-folder="${BUILD_DIR}"
399399

400400
.PHONY: conan
401401
conan: ${BUILD_CONANINFO}
@@ -448,5 +448,5 @@ ${BUILD_CONANINFO}: ${SOURCE_CONANFILE} ${BUILD_LOCKFILE}
448448
${BUILD_CMAKECACHE}: ${SOURCE_CMAKELISTS} ${BUILD_CONANINFO}
449449
# Configure in-source build with CMake.
450450
#
451-
conan build --configure . --source-folder="${SOURCE_DIR}" --build-folder="${BUILD_DIR}"
451+
conan build --configure . --source-folder="${SOURCE_DIR}" --install-folder="${BUILD_DIR}"
452452
endif

cli/conanfile.py

+10-8
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33

44
from pathlib import Path
55

6-
from conans import ConanFile, tools
7-
from conan.tools.env import Environment
6+
from conan import ConanFile
7+
from conan.tools import files, scm, env
8+
9+
required_conan_version = ">=1.52.0"
810

911
class Base(object):
1012
settings = "os", "compiler", "build_type", "arch"
@@ -14,10 +16,10 @@ def generate(self):
1416
if "cloe_launch_env" not in dir(self):
1517
return
1618

17-
env = Environment()
19+
export = env.Environment()
1820
for k, v in self.cloe_launch_env.items():
19-
env.define(k, str(v))
20-
env_vars = env.vars(self)
21+
export.define(k, str(v))
22+
env_vars = export.vars(self)
2123

2224
# Raw environment variables
2325
env_file = Path(self.generators_folder) / "environment_cloe_launch.sh.env"
@@ -33,8 +35,8 @@ def project_version(self, version_path):
3335
if version_path:
3436
version_file = Path(self.recipe_folder) / version_path
3537
if version_file.exists():
36-
return tools.load(version_file).strip()
37-
git = tools.Git(folder=self.recipe_folder)
38+
return files.load(self, version_file).strip()
39+
git = scm.Git(self, self.recipe_folder)
3840
return git.run("describe --dirty=-dirty")[1:]
3941

4042

@@ -47,7 +49,7 @@ class CloeLaunchProfile(ConanFile):
4749
channel = "develop"
4850

4951
def set_version(self):
50-
for line in tools.load("setup.py").split("\n"):
52+
for line in files.load(self, "setup.py").split("\n"):
5153
if not line.strip().startswith("version="):
5254
continue
5355
self.version = line.strip().split("=")[1].strip('",')

conanfile.py

+7-29
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22
# pylint: skip-file
33

44
from pathlib import Path
5-
from conans import CMake, ConanFile, RunEnvironment, tools
5+
6+
from conan import ConanFile
7+
from conan.tools import cmake, files, scm
8+
9+
required_conan_version = ">=1.52.0"
610

711

812
class Cloe(ConanFile):
@@ -27,17 +31,14 @@ class Cloe(ConanFile):
2731

2832
"cloe-engine:server": True,
2933
}
30-
generators = "cmake"
3134
no_copy_source = True
3235

33-
_cmake = None
34-
3536
def set_version(self):
3637
version_file = Path(self.recipe_folder) / "VERSION"
3738
if version_file.exists():
38-
self.version = tools.load(version_file).strip()
39+
self.version = files.load(self, version_file).strip()
3940
else:
40-
git = tools.Git(folder=self.recipe_folder)
41+
git = scm.Git(self, self.recipe_folder)
4142
self.version = git.run("describe --dirty=-dirty")[1:]
4243

4344
def requirements(self):
@@ -69,28 +70,5 @@ def cloe_requires(dep):
6970
self.requires("incbin/cci.20211107", override=True),
7071
self.requires(f"boost/{boost_version}", override=True)
7172

72-
def _configure_cmake(self):
73-
if self._cmake:
74-
return self._cmake
75-
self._cmake = CMake(self)
76-
self._cmake.definitions["CMAKE_EXPORT_COMPILE_COMMANDS"] = True
77-
self._cmake.definitions["TargetLintingExtended"] = self.options.pedantic
78-
self._cmake.configure()
79-
return self._cmake
80-
81-
def build(self):
82-
# This build is for a workspace build. See: conanws.yml
83-
if not self.in_local_cache:
84-
cmake = self._configure_cmake()
85-
cmake.build()
86-
with tools.environment_append(RunEnvironment(self).vars):
87-
cmake.test()
88-
89-
def package(self):
90-
# This build is for a workspace build. See: conanws.yml
91-
if not self.in_local_cache:
92-
cmake = self._configure_cmake()
93-
cmake.install()
94-
9573
def package_id(self):
9674
del self.info.options.pedantic

docs/develop/integrating-a-controller.rst

+21-9
Original file line numberDiff line numberDiff line change
@@ -11,25 +11,37 @@ in your plugin's root directory containing the following:
1111
.. code-block:: txt
1212
1313
[requires]
14-
cloe/0.17.0
14+
cloe/0.20.0@cloe/develop
15+
16+
[generators]
17+
CMakeDeps
18+
CMakeToolchain
19+
20+
[layout]
21+
cmake_layout
1522
1623
It states the version of the Cloe package to use. All dependencies of Cloe will
1724
be inherited and should not be re-stated unless you explicitly want to use a
1825
particular version of a dependency here.
1926

20-
Now run ``conan install . --install-folder build``. This ensures that Cloe and
21-
its dependencies are cached and will create a file called
22-
``conanbuildinfo.cmake`` in the ``build`` folder. Include this file in your
23-
CMakeLists.txt (we assume you use CMake for your plugin project) like:
27+
Now run ``conan install . --build=missing --install-folder=build``.
28+
This ensures that Cloe and its dependencies are cached and will create a
29+
toolchain file called ``conan_toolchain.cmake`` in the ``build/generators``
30+
folder. Include this file from the command line when calling CMake
31+
and then ``find_package`` your requirements like:
2432

2533
.. code-block::
2634
27-
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
28-
conan_basic_setup(TARGETS NO_OUTPUT_DIRS)
35+
find_package(cloe-runtime REQUIRED)
36+
find_package(cloe-models REQUIRED)
2937
30-
Now you can refer to cloe as a dependency library in your
31-
``target_link_libararies`` statement like ``CONAN_PKG::cloe``.
38+
See the example projects in ``fable/examples`` for some examples of how Conan
39+
is used. If any of this is new to you and you find yourself working with Conan,
40+
then it is also highly recommended to take a Conan course from JFrog (free
41+
of charge) to get familiar with Conan.
3242

43+
Now you can refer to cloe as a dependency library in your
44+
``target_link_libararies`` statement like ``cloe::runtime``.
3345

3446
.. todo:: Write a section on how to specify a specific version of Cloe.
3547
There are multiple use-cases here:

engine/CMakeLists.txt

+20-16
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ set(target cloe-engine)
66
set(output cloe-engine)
77
set(libstack cloe-stack)
88

9-
option(WithServer "Enable integrated server component?" ON)
10-
11-
# Conan / Editor -----------------------------------------------------
12-
include(${CMAKE_CURRENT_BINARY_DIR}/conanbuildinfo.cmake)
13-
conan_basic_setup(TARGETS)
9+
find_package(cloe-runtime REQUIRED)
10+
find_package(cloe-models REQUIRED)
11+
find_package(fable REQUIRED)
12+
find_package(Boost REQUIRED)
13+
find_package(CLI11 REQUIRED)
1414

1515
include(TargetLinting)
16-
include(CTest)
16+
include(GNUInstallDirs)
1717

1818
# Compiler definitions
1919
string(TIMESTAMP CLOE_ENGINE_TIMESTAMP "%Y-%m-%d")
@@ -35,13 +35,15 @@ target_include_directories(${libstack}
3535
)
3636
target_link_libraries(${libstack}
3737
PUBLIC
38-
CONAN_PKG::cloe-runtime
39-
CONAN_PKG::fable
38+
cloe::runtime
39+
fable::fable
4040
pthread
4141
dl
4242
)
4343

44+
include(CTest)
4445
if(BUILD_TESTING)
46+
find_package(GTest REQUIRED)
4547
include(GoogleTest)
4648

4749
set(test-libstack test-${libstack})
@@ -53,9 +55,10 @@ if(BUILD_TESTING)
5355
CXX_STANDARD_REQUIRED ON
5456
)
5557
target_link_libraries(${test-libstack}
56-
CONAN_PKG::gtest
57-
CONAN_PKG::boost
58-
CONAN_PKG::cloe-models
58+
GTest::gtest
59+
GTest::gtest_main
60+
Boost::boost
61+
cloe::models
5962
${libstack}
6063
)
6164
gtest_add_tests(TARGET ${test-libstack})
@@ -90,20 +93,22 @@ target_include_directories(${target}
9093
)
9194
target_link_libraries(${target}
9295
PRIVATE
93-
CONAN_PKG::cli11
94-
CONAN_PKG::cloe-models
96+
CLI11::CLI11
97+
cloe::models
9598
${libstack}
9699
)
97100

98-
if(${WithServer})
101+
option(CLOE_ENGINE_WITH_SERVER "Enable integrated server component?" ON)
102+
if(CLOE_ENGINE_WITH_SERVER)
99103
message(STATUS "-> Enable server component")
104+
find_package(cloe-oak REQUIRED)
100105
target_sources(${target}
101106
PRIVATE
102107
src/server.cpp
103108
)
104109
target_link_libraries(${target}
105110
PRIVATE
106-
CONAN_PKG::cloe-oak
111+
cloe::oak
107112
)
108113
target_compile_definitions(${target}
109114
PRIVATE
@@ -122,7 +127,6 @@ else()
122127
endif()
123128

124129
# Installation -------------------------------------------------------
125-
include(GNUInstallDirs)
126130
install(TARGETS ${target}
127131
RUNTIME
128132
DESTINATION ${CMAKE_INSTALL_BINDIR}

engine/conanfile.py

+27-22
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33

44
import os
55
from pathlib import Path
6-
from conans import CMake, ConanFile, RunEnvironment, tools
76

7+
from conan import ConanFile
8+
from conan.tools import cmake, env, files, scm
9+
10+
required_conan_version = ">=1.52.0"
811

912
class CloeEngine(ConanFile):
1013
name = "cloe-engine"
@@ -29,22 +32,20 @@ class CloeEngine(ConanFile):
2932

3033
"fable:allow_comments": True,
3134
}
32-
generators = "cmake"
35+
generators = "CMakeDeps", "VirtualRunEnv"
3336
no_copy_source = True
3437
exports_sources = [
3538
"src/*",
3639
"webui/*",
3740
"CMakeLists.txt",
3841
]
3942

40-
_cmake = None
41-
4243
def set_version(self):
4344
version_file = Path(self.recipe_folder) / "../VERSION"
4445
if version_file.exists():
45-
self.version = tools.load(version_file).strip()
46+
self.version = files.load(self, version_file).strip()
4647
else:
47-
git = tools.Git(folder=self.recipe_folder)
48+
git = scm.Git(self, self.recipe_folder)
4849
self.version = git.run("describe --dirty=-dirty")[1:]
4950

5051
def requirements(self):
@@ -62,32 +63,36 @@ def requirements(self):
6263
def build_requirements(self):
6364
self.test_requires("gtest/[~1.10]")
6465

65-
def _configure_cmake(self):
66-
if self._cmake:
67-
return self._cmake
68-
self._cmake = CMake(self)
69-
self._cmake.definitions["CMAKE_EXPORT_COMPILE_COMMANDS"] = True
70-
self._cmake.definitions["WithServer"] = self.options.server
71-
self._cmake.definitions["TargetLintingExtended"] = self.options.pedantic
72-
self._cmake.definitions["CLOE_PROJECT_VERSION"] = self.version
73-
self._cmake.configure()
74-
return self._cmake
66+
def layout(self):
67+
cmake.cmake_layout(self)
68+
69+
def generate(self):
70+
tc = cmake.CMakeToolchain(self)
71+
tc.cache_variables["CMAKE_EXPORT_COMPILE_COMMANDS"] = True
72+
tc.cache_variables["CLOE_PROJECT_VERSION"] = self.version
73+
tc.cache_variables["CLOE_ENGINE_WITH_SERVER"] = self.options.server
74+
tc.cache_variables["TargetLintingExtended"] = self.options.pedantic
75+
tc.generate()
7576

7677
def build(self):
77-
cmake = self._configure_cmake()
78-
cmake.build()
79-
with tools.environment_append(RunEnvironment(self).vars):
80-
cmake.test()
78+
cm = cmake.CMake(self)
79+
cm.configure()
80+
cm.build()
81+
cm.test()
8182

8283
def package(self):
83-
cmake = self._configure_cmake()
84-
cmake.install()
84+
cm = cmake.CMake(self)
85+
cm.install()
8586

8687
def package_id(self):
8788
self.info.requires["boost"].full_package_mode()
8889
del self.info.options.pedantic
8990

9091
def package_info(self):
92+
self.cpp_info.set_property("cmake_find_mode", "both")
93+
self.cpp_info.set_property("cmake_file_name", "cloe-engine")
94+
self.cpp_info.set_property("cmake_target_name", "cloe::engine")
95+
self.cpp_info.set_property("pkg_config_name", "cloe-engine")
9196
if self.settings.os == "Linux":
9297
self.cpp_info.system_libs.append("pthread")
9398
self.cpp_info.system_libs.append("dl")

0 commit comments

Comments
 (0)