简体   繁体   中英

Is there any way to link add_custom_command to a target defined in another directory with add_custom_target?

Because this is the standard structure of a ROS workspace (robotics framework) I have the following two directories:

ros/
|── DIR_A
│   ├── CMakeLists.txt
│   ├── package.xml
│   ├── README.md
│   ├── setup.py
│   └── src
│       ├── some_code.cpp
|── DIR_B
│   ├── CMakeLists.txt
│   ├── package.xml
│   ├── README.md
│   ├── setup.py
│   └── src
│       ├── some_other_code.cpp

I am trying to add a custom target called clean_compiled that will run the make clean target of a specific external project (already works). But I also need to add a custom command to this clean target in the CMakeLists of another directory. This is what I have:

First CMakeLists.txt:

# We add the custom target
add_custom_target(clean_compiled
    COMMENT "Cleaning compilation files in ${SOME_DESTDIR}"
    COMMAND $(MAKE) clean PATH=${SOME_DESTDIR}
    WORKING_DIRECTORY ${SOME_WORKING_DIRECTORY}
)

Second CMakeLists.txt:

# We try to add a custom command to this custom target
add_custom_command(TARGET clean_compiled
  COMMENT "Cleaning compilation files in ${ANOTHER_DESTDIR}"
  WORKING_DIRECTORY ${ANOTHER_WORKING_DIRECTORY}
  COMMAND $(MAKE) clean PATH=${ANOTHER_DESTDIR}
)

When I run make clean_compiled for the whole repository, I get this warning:

TARGET 'clean_compiled' was not created in this directory.
This warning is for project developers.  Use -Wno-dev to suppress it.

And the custom_command is never called.

Is there any way to link the custom command to the target in the other directory without causing circular dependencies?

add_custom_command is pretty clear that it only works with targets in the same directory. There is no way around this. So the second rule cannot be a custom command and needs to be a custom target, for example called clean_another_dest_dir.

https://discourse.cmake.org/t/create-target-that-only-runs-other-target/885/6

You can use add_dependency to make custom targets depend on other custom targets and make them run, add_dependencies(clean_another_dest_dir clean_compiled) , but that isn't always what you want.

Another option is a custom target that runs all the other custom targets.

add_custom_target(clean_all_dir 
  COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR } --target clean_compiled
  COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR } --target clean_another_dest_dir
  )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM