How to call a CMake function from add_custom_target/command?
Asked Answered
W

1

28

Is it possible to call a CMake function out of an add_custom_target or add_custom_command?

I know I could move the CMake function to a Python (or whatever) script and call it from add_custom_target/command but I would like to avoid having tons of script next to the existing CMake infra.

What I want to achieve is to use CPack for generating a zip package of binary artifacts and publish them in an artifact repository. For the publishing part I have already the CMake function created but now I need to combine the packaging and publishing together.

Thanks for any help/hints in advance.

Woollyheaded answered 24/9, 2014 at 18:47 Comment(1)
I looked for the same and after a few minutes i realized that this is impossible because cmake is a build-generator generator. This command will just be run at a different time, for example from within your IDE, when the cmake is just not existing.Heliogabalus
D
42

I encountered this issue while writing a CMake build system for BVLC/Caffe. What I finally did is I put the function content into a separate CMake script and called it from within add_custom_target by invoking:

add_custom_target(target_name
    COMMAND ${CMAKE_COMMAND} -P path_to_script
)

Invoking CMake with -P flag makes it act as a scripting language. You can put any CMake functions inside the script.

Director answered 24/9, 2014 at 19:22 Comment(7)
It boggles my mind that you cannot call cmake commands like FILE directly from within add_custom_commandKalmuck
Looks interesting, are parent CMake file definitions retained?Torpor
Actually, I found out that it doesn't BUT you can add a bunch of -D switched to 'forward' existing definitions to the child CMake script: add_custom_command( OUTPUT Dockerfile.base COMMAND ${CMAKE_COMMAND} -D DISTRO_NAME=${DISTRO_NAME} -D DISTRO_VERSION=${DISTRO_VERSION} -D PROJECT_TEMPLATE_DIR=${PROJECT_TEMPLATE_DIR} -P ${CMAKE_MODULE_PATH}/ConfigureDockerfileBase.cmake COMMENT "Configure the Dockerfile.base file." )Torpor
What if I want to implement such logic: execute that script only when a variable is defined ? How should I write this in add_custom_target ? @AdamGwendolyngweneth
Works great when the function is in a .cmake file, is there an option to call a function defined on the same CMakeLists.txt file ? @Adam KosiorekMarinelli
How to return values from that script ?Gadfly
@Gadfly How to set the global variable in a function for cmake?Insatiable

© 2022 - 2024 — McMap. All rights reserved.