如何在生成之前在 cmake 中执行命令?
How to execute a command in cmake before generation?
我希望 CMake 在开始生成过程之前运行命令。
因此,我在 *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"
)
有什么想法吗?
我为什么要这样做:
我需要从一些简单的定义文件生成一个 Cpp 类。
- 检查生成器或定义文件的源是否比生成的类文件新
- 如果需要,构建生成器
- 生成源文件
- 构建静态库
第 1 点到 3 点我已经用一个简单的 Makefile 解决了。4. 使用 CMakeList 完成.txt因为这个库是一个更大项目中的子项目。
输出到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
如果正确调用了make文件,cmake可以找到source.cpp
。但是没有调用就不存在源和标头...
调用味精之前的树
.
├── CMakeLists.txt
├── msg
│ ├── def1.msg
│ ├── def2.msg
│ ├── def3.msg
│ ├── Makefile
│ └── msgGen.cpp
├── package.xml
└── README.md
调用味精后的树
.
├── CMakeLists.txt
├── include
│ └── source.h
├── msg
│ ├── def1.msg
│ ├── def2.msg
│ ├── def3.msg
│ ├── Makefile
│ ├── msgGen
│ └── msgGen.cpp
├── package.xml
├── README.md
└── src
└── source.cpp
添加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
删除SRC并包含目录
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'
更改为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$
感谢@Tsyvarev和其他人。这是我选择的方式:
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 )
...
这与相应的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)
相关文章:
- 使用QProcess执行命令,并将结果存储在QStringList中
- 如何在 Minecraft 服务器上执行命令
- 如何在C++中执行命令并获取命令的返回代码标准输出和标准
- 如何查看完整的CMD执行命令,包括参数和标志?
- CPP 中 z3 的编译和执行命令?
- 线程保持运行并执行命令
- 在 MinGW 和 MinGW-64 上执行命令后变量为空?
- popen() 将执行命令的输出写入 cout
- 如何在 Heroku 中的 Python 服务器上执行 "g++" 命令?
- 以普通用户身份执行命令
- 如何在生成之前在 cmake 中执行命令?
- 如何使用 c++ 在 cmd 中使用管理员权限执行命令
- 如何在Unix Shell中的后台执行命令
- 如何从连接的控制台执行命令
- 尝试在路由器上执行命令。C++ & libssh
- 在服务器上执行命令,然后将结果发送到Windows中的客户端
- 通过C编程打开终端并执行命令
- 在远程服务器上执行命令行命令
- 在Linux上使用c++执行命令时被阻止
- 使用popen执行命令