Added support for Conan as a dependency manager#36
Closed
jellespijker wants to merge 10 commits intomasterfrom
Closed
Added support for Conan as a dependency manager#36jellespijker wants to merge 10 commits intomasterfrom
jellespijker wants to merge 10 commits intomasterfrom
Conversation
- Added a conanfile.py for Conan dependency managing
- Use StandardProjectSettings (also used in libArcus)
- Set all compiler warnings known to mankind.
- Prefer BUILD_SHARED_LIBS over BUILD_STATIC but
no change in interface so no change needed on
the build servers.
- Set build_type to Release if not specified
- export compile commands to a json for easier debugging
- Use position independent code if applicable (-fPIC)
- Switch between MT/MTd of MD/MDd for Visual Studio using
text generators
- Set C++17 standard
- Set stdlib=libc++ for clang-apple
- Add option ENABLE_BUILD_WITH_TIME_TRACE for generating
time tracing json on Clang compilers
- Created an uniform method of Using Python. Setting an
exact Python version (standard 3.8). By providing
Python_VERSION you can find user specified python version
- Created an uniform method of using threading which prefer
pthread if the platform supports it and has multiple
threading libraries installed.
- Updated FindSIP with target alias SIP::SIP
- Define USE_SHIPPED_PUGIXML option. Allowing the user to
choose between the shipped pugixml library or provide
his/her own external library.
- Changed pugixml includes and removed it from the public
Savitar header.
- Removed target libraries from the SIPMacros, this is now
a responsibility of the main script.
- updated .gitignore with cmake-build-* and tmp
You can now set the following extra options (default is OFF) - ENABLE_CPPCHECK "Enable static analysis with cppcheck" - ENABLE_CLANG_TIDY "Enable static analysis with clang-tidy" - ENABLE_INCLUDE_WHAT_YOU_USE "Enable static analysis with include-what-you-use" - ENABLE_COVERAGE "Enable coverage reporting for gcc/clang" - ENABLE_SANITIZER_ADDRESS "Enable address sanitizer" - ENABLE_SANITIZER_LEAK "Enable leak sanitizer" - ENABLE_SANITIZER_UNDEFINED_BEHAVIOR "Enable undefined behavior sanitizer" - ENABLE_SANITIZER_THREAD "Enable thread sanitizer" - ENABLE_SANITIZER_MEMORY "Enable memory sanitizer" Disallow in-souce builds and added messages
Strongly discouraged but some automated systems use this method. This can be enabled by setting ALLOW_IN_SOURCE_BUILD ON
When building libSavitar as a shared DLL library on Windows it throws a lot of: unresolved external symbol __declspec(dllimport) as a workaround I now build it statically on that platform.
Otherwise the conan_toolchain.cmake has 2 entries.
I really dislike including out-of-source stuff
This was referenced Aug 8, 2021
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR is part of the following PRs:
The purpose of these changes is to set up a dependency manager for Cura and here repositories. Cura uses both third-party and Ultimaker maintained dependencies, written in both Python and C++ (or mixtures of both). Not all of these dependencies can be downloaded with the help of a dependency manager such as pip. This makes setting up Cura from source, a pain in the$%^#$ $%^. See the graph below for the current dependencies. Adding to the complexity is the way how we're currently consuming third-party dependencies; Some have to be present on the system/provided by the user, some are shipped within the repo, while others are downloaded by CMake.
All of the above-mentioned PRs and this one, add a
conanfile.pyto the root of this project. This is a recipe written in Python which instructs Conan (https://docs.conan.io/en/latest/) how to build and package the repository in such a way that it can be reused by other dependencies. If a required dependency has no binary for your OS and compiler it will build that dependency from scratch and store it in the cache. Making installing Cura from source as simple as:For a more detailed description see the README.md in this repository https://github.com/jellespijker/conan-um
For testing purposes, I have set up a small home server that can be used by Ultimaker employees. Other developers can test this by cloning the above-mentioned repositories and performing a
conan export . ultimaker/testingin each root. That only leaves the SIP package, if you execute aconan export . riverbankingcomputing/testingin this folder https://github.com/jellespijker/conan-um/tree/main/recipes/sip it creates a Conan package for SIP 4.19.25You can use your own profiles for this, but I have personally tested and developed them with my own
jinjatemplate profiles on Linux Manjaro with a GCC compiler, Mac OS Big Sur with a Clang compiler and Windows 11 with a Visual Studio 2019 compiler.These profiles can be installed with the
conan config install https://github.com/jellespijker/conan-config. Make sure you add-pr:b cura_release.jinja -pr:h cura_release.jinjato your install instructionsConan allows for multiple ways of working. Either the exiting package can be used from the cache, or if you want to work on multiple repositories you can put that repo in editable mode such that the xxx-config.cmake in the project that is depending on the other, will point to the paths of your repo, see https://docs.conan.io/en/latest/developing_packages/editable_packages.html
Because the best practice method to use Conan, which is also the preferred way in Conan 2.0, is to use ( https://docs.conan.io/en/latest/reference/conanfile/tools/cmake.html ) With the tools
CMakeDeps,CMakeToolchain, andCMake. TheCMakeDepsclass will generate xxx-config.cmake files per dependency, while theCMakeToolchainwill generate a toolchain to be passed to CMake-DCMAKE_TOOLCHAIN_FILE=conan_toolchain.cmakeThese two prepare the way forCMaketo actually build the project such that it won't need to change the CMakeLists.txt. Allowing Conan to be optional and not mandatory. Unfortunately, our repositories have organically grown CMakeLists.txt mixing old and modern syntax and a build system that uses CMake 3.13.This PR should also (partial) fix issue #7 allowing to pass
-DUSE_SHIPPED_PUGIXML=OFFthe user then needs to make sure the pugixml-config.cmake or Findpugximl.cmake are added to CMAKE_MODULE_PATH or use Conan ;-)https://conan.io/center/pugixml .
I had the same troubles as #25 and I decided to remove the linking out of the
SIPMacros.cmakeallowing for a more fine-grained linking as shown below. The newly created CMake functionuse_pythonshould handle the Python library. I only took Phyton 3.8 and higher into account.I currently fail to create DLL libraries on windows, although the export-header is generated correctly and included. It still throws a lot of:
unresolved external symbol __declspec(dllimport)as a workaround I now build it statically on that platform. Maybe @konskarm or @rburema can take a closer look. To be honest I don't think we actually need to export the DLL on Windows but I'm far from a Windows exp(o/e)rt ;-)I decided to harmonize our CMakeLists.txt because often they were inconsistent, for instance how we set the
fPICorMD/MDdandMT/MTdflags. Often I had to changes these methods in one repo, while it already worked in another repo. Getting stuff to work on three different OSs in three different languages is a bit time-consuming, to say the least. These uniform methods of preparing CMake instructions can be found incmake/StandardProjectSettings.cmake. These are tried and tested methods that we already use in our Spatial plugin and are used by Json Turner in this https://github.com/lefticus/cpp_starter_project and are based on the best practices described here: https://github.com/lefticus/cppbestpracticesThe changes in CMake basically boil down to:
the build servers.
threading libraries installed.
Conan copies the source and builds from there.
-DPython_version=3.9now it will link to 3.8by default.
the system.
_CuraEngineand the relevant tests.SpatialBackend these are probably still a bit incomplete at the moment. But if we update them after each comment
during a review, it will get more and more helpful.
The above-mentioned CMake changes should keep the build interface the same for existing environments (only add extra options) Now you guys might get a bit discouraged when you see all of those warnings scroll up when building CuraEngine. We can opt to disable it. But I personally am strongly in favor of keeping these visible as a motivation to clean up our codebase each time we're working in a certain section.
Still, WIP at the moment, since I'm finalizing some last changes across all repos.