I have a cmake project that depends on several other cmake projects.
The cmake project that I am writing depends on 2 cmake projects that both create uninstall targets.
These duplicate targets cause errors:
add_custom_target cannot create target "uninstall" because another target
with the same name already exists. The existing target is a custom target
created in source directory
I do not need the uninstall target from either sub-cmake project. How do I exclude all targets with the name uninstall so that I don't get these errors? What other options are there available to solve this error? I am looking for a solution that is OS agnostic.
I sugguest you read the following documentation for Kitware : https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#can-i-do-make-uninstall-with-cmake .
The process is quite well explained.
Related
I am using Eigen3 with spectra (https://spectralib.org/), a library built on top of Eigen. Spectra uses find_package to find Eigen, and comes up with the error:
Could not find a package configuration file provided by "Eigen3" with any
of the following names:
Eigen3Config.cmake
eigen3-config.cmake
Looking through the directory of Eigen, I found that there were no files by those names, but rather one called Eigen3Config.cmake.in. I tried copying the file and renaming it Eigen3Config.cmake, but that gave me a different error of
find_package Error reading CMake code from "C:/Program Files
(x86)/Eigen3/cmake/Eigen3Config.cmake".
which was somewhat expected, but it does tell me that it can at least find the directory where Eigen3Config.cmake.in is. I'm assuming that either find_package is supposed to use Eigen3Config.cmake.in, or Eigen3Config.cmake.in is supposed to generate Eigen3Config.cmake, but i'm very new to cmake, so i'm not sure. How do I fix this?
There is no need to build/install Eigen to use it if you include it manually, as done in the getting started example (https://eigen.tuxfamily.org/dox/GettingStarted.html#title0)
But in order to be found by CMake, you will need to build / install it, as explained in the INSTALL file. https://gitlab.com/libeigen/eigen/-/blob/master/INSTALL
Usually, your error is followed by an hint asking you to set the variable Eigen3_DIR (or something similar) to point the build/install dir of the target project (Eigen3 here). It appears typically when you have built but not installed the project.
So:
Build Eigen
Install it (optional)
For spectra set the cmake var Eigen3_DIR to /path/to/Eigen/build . (if eigen not install or still not found)
These steps worked for me:
Install Eigen
Create a build directory for Eigen
cd into the build directory created
run "cmake ../"Your Eigen Source Directory""
After this is done, in your CMakeLists.txt of your project, you'll want to add "find_package( Eigen3 REQUIRED)" and "include_directories( ${EIGEN3_INCLUDE_DIR})".
There are two libs libA and libB depending on libBase and including it into build process with
add_subdirectory(../libBase build/libBase)
Everything works when they are build separately. But when project prj wants to include everything into its build process:
add_subdirectory(../libA build/libA)
add_subdirectory(../libB build/libB)
Then cmake complaints about target redefinition:
add_library cannot create target "libBase" because another target with the same name already exists.
How to make such project (building all dependences in one step) correct? Is it achievable with add_subdirectory or sth else should be used to add dependencies?
Found it: include_guard() since cmake 3.10
I used cmake 3.12.0. There are exists one cmake project that creates one console application. I add the ability of package generation to that cmake project:
# ... above cmake code for one console application creation
# below code that I add:
# pack
set (A_PACK_DESCRIPTION_SUMMARY "${PROJECT_NAME} - CMake Assistant Solution")
set (A_INSTALL_PREFIX Consolas)
set(CPACK_WIX_PRODUCT_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC8")
set(CPACK_WIX_UPGRADE_GUID "F9AAAAE2-D6AF-4EA4-BF46-B3E265400CC7")
set(CPACK_GENERATOR "WIX")
include(CPack)
With other generators (NSIS, 7Z, ZIP, DEB) all works fine but with WIX appears followed error:
...path\files.wxs(11) : error LGHT0091 : Duplicate symbol 'Component:CM_C_EMPTY_INSTALL_ROOT' found. This typically means that an Id is duplicated. Check to make sure all your identifiers of a given type (File, Component, Feature) are unique.
Why it happens and how to fix it?
This appears to be caused by this bug
Basically you use add_subdirectory(xxx EXCLUDE_FROM_ALL) where the subdirectory has a install(... COMPONENT ...) call. The installed files are excluded from the subdirectory, but still creates COMPONENTs, which are now empty and break wix.
As a workaround, you can add:
set(CPACK_COMPONENTS_ALL Unspecified)
in CMakeLists.txt to exclude all the empty components.
If it helps any, I had this problem and found that I had INSTALL commands that specified only Release Configurations but then tried to build the package using the Debug build configuration. By just switching to building the package specifying the Release configuration all went as expected (Wasted most of an afternoon before I figured this out!)
I downloaded the latest release of OpenSceneGraph (3.4.0) (zipped file and latest github repository).
I am trying to generate at least the osgviewerQT and osgViewerWX examples. They are contained in the examples folder, but after using CMake to generate everything, the only osgviewer-Example is osgviewerGLUT. Also osgqt.lib and osgwx.lib are missing in the lib-folder after building the generated projects via ALL_BUILD and INSTALL.
In CMake I made sure that all wx and Qt5 (using Qt5.6) folders are found. But still no examples after generating. Any ideas?
The CMake rules for OpenSceneGraph include a BUILD_OSG_EXAMPLES toggle. Did you select that option in CMake?
You need to select the BUILD_OSG_APPLICATIONS toggle and you will see the applications (osgarchive, osgconv, osgfilecache, osgversion, osgviewer, present3D) in the bin directory.
In order to compile osgViewerQt you need to set QT_QMAKE_EXECUTABLE to the location where you have qmake (typically in the directory bin of Qt). This varialbe, when not just found, is available under "Ungrouped Entries".
After setting such url, CMake will be able to find Qt; then, enabling BUILD_OSG_APPLICATIONS and BUILD_OSG_EXAMPLES, it will also build other applications related to Qt.
I have a project that uses cmake to be configured and compiled, but this project depends on an external source tree that uses the traditional configure / make / make install procedure. Is it possible to tell cmake that, before compiling the main project, configure (with some specific parameters), make and make install on the external source tree should be called first?
Thanks
I had the exact same question when coming across this one.
(In my case, wanting to properly add libncurses and libcaca, which are both Autoconf based, as dependecies (and git submodules), to my CMake based project.)
So just to have an answer set to the question, based off of mike.did's comment ;
CMake's ExternalProject module definitely seems to be the proper solution.
(also see:)
Compile other external libraries (without CMakeLists.txt) with CMake
Cleanest way to depend on a make-based C library in my CMake C++ project