简体   繁体   English

如何在生成之前在cmake中执行命令?

[英]How to execute a command in cmake before generation?

I want that CMake runs a command before it starts its generating process. 我希望CMake在开始生成过程之前先运行命令。

Therefore I add execute_process at the very beginning of my *CMakeLists.txt` but the expected prompts are come only sporadic. 因此,我在* CMakeLists.txt的开始处添加了execute_process ,但是预期的提示只是偶尔出现的。

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. 我需要从一些简单的定义文件中生成一个Cpp类。

  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. 我已经用一个简单的Makefile解决了点1至3。 4. is done with a CMakeList.txt because this library ist a subproject in a bigger project. 4.用CMakeList.txt完成,因为该库在较大的项目中包含一个子项目。


The output to the CMakeList.txt from above without my echo : 从上面的输出到CMakeList.txt ,没有我的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 . 如果正确调用了makefile,则cmake可以找到source.cpp But without the call no source and header exist... 但是没有调用就没有源和头...

the tree before calling the msgGen 调用msgGen之前的树

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

the tree after calling the msgGen 调用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 添加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 删除src包含 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 更改为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. 感谢@Tsyvarev和其他人。 Here is the way I choose: 这是我选择的方式:

CMakeList.txt 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 这与相应的味精/ 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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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