简体   繁体   中英

How to execute a command in cmake before generation?

I want that CMake runs a command before it starts its generating process.

Therefore I add execute_process at the very beginning of my *CMakeLists.txt` but the expected prompts are come only sporadic.

cmake_minimum_required(VERSION 3.5)

project(amba_ctrl_datalinkmsg)

execute_process(COMMAND @echo 'HUHU HUHU HUHU')
execute_process(COMMAND pwd)
execute_process(COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/msg -f Makefile)

include_directories(include)
add_library(
    ${PROJECT_NAME} STATIC
    "src/source.cpp"
)

Any Ideas?


Why I want to do so:

I need to generate a Cpp class from some simple definition files.

  1. check if the source of the generator or the definition files newer than the generated class file
  2. build generator if needed
  3. generate source files
  4. build a static library

The points 1 to 3 I have solved with a simple Makefile. 4. is done with a CMakeList.txt because this library ist a subproject in a bigger project.


The output to the CMakeList.txt from above without my echo :

Process package 'amba_ctrl_datalinkmsg' with context:
--------------------------------------------------------------------------------
 source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
  build_space => /home/.../build/amba_ctrl_datalinkmsg
install_space => /home/.../install
   make_flags => -j8, -l8
  build_tests => False
--------------------------------------------------------------------------------
+++ Building 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
make[2]: *** No rule to make target '/home/.../src/source.cpp', needed by 'CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o'. Stop.
CMakeFiles/Makefile2:99: recipe for target 'CMakeFiles/amba_ctrl_datalinkmsg.dir/all' failed
make[1]: *** [CMakeFiles/amba_ctrl_datalinkmsg.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

If the makefile were called correctly cmake can find the source.cpp . But without the call no source and header exist...

the tree before calling the msgGen

.
├── CMakeLists.txt
├── msg
│   ├── def1.msg
│   ├── def2.msg
│   ├── def3.msg
│   ├── Makefile
│   └── msgGen.cpp
├── package.xml
└── README.md

the tree after calling the msgGen

.
├── CMakeLists.txt
├── include
│   └── source.h
├── msg
│   ├── def1.msg
│   ├── def2.msg
│   ├── def3.msg
│   ├── Makefile
│   ├── msgGen
│   └── msgGen.cpp
├── package.xml
├── README.md
└── src
    └── source.cpp

adding RESULT_VARIABLE

alex:overlay_ws$ ament build --only-packages amba_ctrl_datalinkmsg
# Topological order
 - amba_ctrl_datalinkmsg

Process package 'amba_ctrl_datalinkmsg' with context:
--------------------------------------------------------------------------------
 source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
  build_space => /home/.../build/amba_ctrl_datalinkmsg
install_space => /home/.../install
   make_flags => -j8, -l8
  build_tests => False
--------------------------------------------------------------------------------
+++ Building 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
make[1]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
make gen
make[2]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
msgGen: build msgGen
g++ msgGen.cpp -o msgGen --std=c++11 -D'GENTARGETCPP="../src/source.cpp"' -D'GENTARGETH="../include/source.h"'
msgGen: run msgGen
dlCpm.msg dlIomReceiver.msg dlIomSender.msg
mkdir -p ../src/
mkdir -p ../include/
./msgGen
make[2]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
msgGen: ready
make[1]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
-- Found ament_cmake: 0.0.0 (/home/alex/git/AMBA/Software/ros2_ws/install/share/ament_cmake/cmake)
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Configuring done
-- Generating done
-- Build files have been written to: /home/.../build/amba_ctrl_datalinkmsg
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
[ 50%] Building CXX object CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o
[100%] Linking CXX static library libamba_ctrl_datalinkmsg.a
[100%] Built target amba_ctrl_datalinkmsg
+++ Installing 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__install.sh && /usr/bin/make install' in '/home/.../build/amba_ctrl_datalinkmsg'
[100%] Built target amba_ctrl_datalinkmsg
Install the project...
-- Install configuration: ""
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/environment/library_path.sh
-- Up-to-date: /home/.../install/share/ament_index/resource_index/package_run_dependencies/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/ament_index/resource_index/parent_prefix_path/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.bash
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.sh
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.zsh
-- Up-to-date: /home/.../install/share/ament_index/resource_index/packages/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsg.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_dependencies-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_include_directories-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_libraries-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig-version.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/package.xml
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/register_amba_ctrl_datalinkmsg_implementation.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/get_amba_ctrl_datalinkmsg_typesupport.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/configure_amba_ctrl_datalinkmsg_library.cmake
-- Up-to-date: /home/.../install/include/amba_ctrl_datalinkmsg
-- Installing: /home/.../install/include/amba_ctrl_datalinkmsg/source.h
-- Installing: /home/.../install/lib/libamba_ctrl_datalinkmsg.a
-- [ament] Deploying: /home/.../install/local_setup.bash
-- [ament] Deploying: /home/.../install/local_setup.sh
-- [ament] Deploying: /home/.../install/local_setup.zsh
-- [ament] Deploying: /home/.../install/setup.bash
-- [ament] Deploying: /home/.../install/setup.sh
-- [ament] Deploying: /home/.../install/setup.zsh
-- [ament] Deploying: /home/.../install/_order_packages.py

removing src and include dir

alex:overlay_ws$ ament build --only-packages amba_ctrl_datalinkmsg
# Topological order
 - amba_ctrl_datalinkmsg

Process package 'amba_ctrl_datalinkmsg' with context:
--------------------------------------------------------------------------------
 source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
  build_space => /home/.../build/amba_ctrl_datalinkmsg
install_space => /home/.../install
   make_flags => -j8, -l8
  build_tests => False
--------------------------------------------------------------------------------
+++ Building 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
make[2]: *** No rule to make target '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/src/source.cpp', needed by 'CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o'. Stop.
CMakeFiles/Makefile2:99: recipe for target 'CMakeFiles/amba_ctrl_datalinkmsg.dir/all' failed
make[1]: *** [CMakeFiles/amba_ctrl_datalinkmsg.dir/all] Error 2
Makefile:127: recipe for target 'all' failed
make: *** [all] Error 2

<== Command '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' failed in '/home/.../build/amba_ctrl_datalinkmsg' with exit code '2'
<== Command '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' failed in '/home/.../build/amba_ctrl_datalinkmsg' with exit code '2'

changing to ERROR_VARIABLE

alex:overlay_ws$ ament build --only-packages amba_ctrl_datalinkmsg
# Topological order
 - amba_ctrl_datalinkmsg

Process package 'amba_ctrl_datalinkmsg' with context:
--------------------------------------------------------------------------------
 source_space => /home/.../src/amba_ctrl/amba_ctrl_datalinkmsg
  build_space => /home/.../build/amba_ctrl_datalinkmsg
install_space => /home/.../install
   make_flags => -j8, -l8
  build_tests => False
--------------------------------------------------------------------------------
+++ Building 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make cmake_check_build_system' in '/home/.../build/amba_ctrl_datalinkmsg'
make[1]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
make gen
make[2]: Entering directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
msgGen: build msgGen
g++ msgGen.cpp -o msgGen --std=c++11 -D'GENTARGETCPP="../src/source.cpp"' -D'GENTARGETH="../include/source.h"'
msgGen: run msgGen
dlCpm.msg dlIomReceiver.msg dlIomSender.msg
mkdir -p ../src/
mkdir -p ../include/
./msgGen
make[2]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
msgGen: ready
make[1]: Leaving directory '/home/.../src/amba_ctrl/amba_ctrl_datalinkmsg/msg'
-- Found ament_cmake: 0.0.0 (/home/alex/git/AMBA/Software/ros2_ws/install/share/ament_cmake/cmake)
-- Using PYTHON_EXECUTABLE: /usr/bin/python3
-- Configuring done
-- Generating done
-- Build files have been written to: /home/.../build/amba_ctrl_datalinkmsg
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__build.sh && /usr/bin/make -j8 -l8' in '/home/.../build/amba_ctrl_datalinkmsg'
[ 50%] Building CXX object CMakeFiles/amba_ctrl_datalinkmsg.dir/src/source.cpp.o
[100%] Linking CXX static library libamba_ctrl_datalinkmsg.a
[100%] Built target amba_ctrl_datalinkmsg
+++ Installing 'amba_ctrl_datalinkmsg'
==> '. /home/.../build/amba_ctrl_datalinkmsg/cmake__install.sh && /usr/bin/make install' in '/home/.../build/amba_ctrl_datalinkmsg'
[100%] Built target amba_ctrl_datalinkmsg
Install the project...
-- Install configuration: ""
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/environment/library_path.sh
-- Up-to-date: /home/.../install/share/ament_index/resource_index/package_run_dependencies/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/ament_index/resource_index/parent_prefix_path/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.bash
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.sh
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/local_setup.zsh
-- Up-to-date: /home/.../install/share/ament_index/resource_index/packages/amba_ctrl_datalinkmsg
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsg.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_dependencies-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_include_directories-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/ament_cmake_export_libraries-extras.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/amba_ctrl_datalinkmsgConfig-version.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/package.xml
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/register_amba_ctrl_datalinkmsg_implementation.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/get_amba_ctrl_datalinkmsg_typesupport.cmake
-- Up-to-date: /home/.../install/share/amba_ctrl_datalinkmsg/cmake/configure_amba_ctrl_datalinkmsg_library.cmake
-- Up-to-date: /home/.../install/include/amba_ctrl_datalinkmsg
-- Installing: /home/.../install/include/amba_ctrl_datalinkmsg/source.h
-- Installing: /home/.../install/lib/libamba_ctrl_datalinkmsg.a
-- [ament] Deploying: /home/.../install/local_setup.bash
-- [ament] Deploying: /home/.../install/local_setup.sh
-- [ament] Deploying: /home/.../install/local_setup.zsh
-- [ament] Deploying: /home/.../install/setup.bash
-- [ament] Deploying: /home/.../install/setup.sh
-- [ament] Deploying: /home/.../install/setup.zsh
-- [ament] Deploying: /home/.../install/_order_packages.py
alex:overlay_ws$ 

Thanks to @Tsyvarev and the others. Here is the way I choose:

CMakeList.txt

cmake_minimum_required(VERSION 3.5)

project(datalinkmsg)

add_custom_command(OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/src/DatalinkMsg.cpp
                   COMMAND make -C ${CMAKE_CURRENT_SOURCE_DIR}/msg -f Makefile)

add_custom_target( generate
                   ALL make -C ${CMAKE_CURRENT_SOURCE_DIR}/msg -f Makefile
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/src/DatalinkMsg.cpp
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/msg/msgGen.cpp
                   DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/msg/*.msg )
...

this runs with the corresponding msg/Makefile

MSGDEFS = *.msg

TARGET = msgGen
SOURCE = msgGen.cpp

GENTARGETCPP = ../src/DatalinkMsg.cpp
GENTARGETH   = ../include/DatalinkMsg.h

all: $(GENTARGETCPP) $(GENTARGETH) $(MSGDEFS) $(SOURCE)

$(GENTARGETCPP): $(MSGDEFS) $(SOURCE)
    make gen

$(GENTARGETH): $(MSGDEFS) $(SOURCE)
    make gen

gen: $(TARGET) $(MSGDEFS) $(SOURCE)
    mkdir -p ../src/
    mkdir -p ../include/
    ./$<

$(TARGET): msgGen.cpp
    g++ $< -o $@ --std=c++11

clean:
    rm -f $(TARGET) $(GENTARGETCPP) $(GENTARGETH)

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