Search code examples
cmakeconan

How to restrict cmake commands based on which target is built


I have a cmake project which produces several executables. I want to package each executable in seperate Docker containers, so inside the Dockefile, I only built the target that I need:

RUN mkdir build \
    && cd build \
    && cmake /app/project -DCMAKE_BUILD_TYPE=Release
    && make -j 2 myExecutable \
    && make install/fast

This works as expected, but I run into an issue with the conan cmake integration. The installation is done when cmake is called, not during the actual build - this means that no matter which target I want to actually build, all the conan installation calls present in my cmake files are called - so way more packages are installed than necessary.

# for every target
# include conan dependencies (each target has its own conanfile.txt)
conan_cmake_run(CONANFILE conanfile.txt
        BASIC_SETUP CMAKE_TARGETS
        BUILD_TYPE "${CMAKE_BUILD_TYPE}"
        BUILD outdated
        ${update_conan}
        )
conan_target_link_libraries(${PROJECT_NAME})

Is there a way to make the cmake calls dependend on which target I actually want to build?


Solution

  • Unfortunately not, the macro conan_cmake_run has no distinction about which target is involved or even it was executed before. You could use CMake options to run or not conan_cmake_run.

    Also, you could comment/vote your request thorough the issue https://github.com/conan-io/cmake-conan/issues/105

    Regards!