C++ 如何在生成前在cmake中执行命令?
我希望CMake在开始其生成过程之前运行一个命令 因此,我在*CMakeLists.txt`的开头添加了C++ 如何在生成前在cmake中执行命令?,c++,c,makefile,cmake,C++,C,Makefile,Cmake,我希望CMake在开始其生成过程之前运行一个命令 因此,我在*CMakeLists.txt`的开头添加了execute\u process,但预期的提示只是零星出现的 cmake_minimum_required(VERSION 3.5) project(amba_ctrl_datalinkmsg) execute_process(COMMAND @echo 'HUHU HUHU HUHU') execute_process(COMMAND pwd) execute_process(COMM
execute\u 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类
从上面输出到CMakeList.txt,不带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
如果makefile调用正确,cmake可以找到源.cpp
。但如果没有调用,则不存在源和头
在打电话给msgGen之前,先看一下树
.
├── 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
呼叫msgGen后的树
.
├── 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\u变量
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$ 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$
删除src和include dir
感谢@Tsyvarev和其他人。以下是我选择的方式: CMakeList.txt 它与相应的msg/Makefile一起运行
MSGDEFS=*.msg
目标=msgGen
SOURCE=msgGen.cpp
GENTARGETCPP=../src/DatalinkMsg.cpp
GENTARGETH=../include/DatalinkMsg.h
全部:$(GENTARGETCPP)$(GENTARGETH)$(MSGDEFS)$(来源)
$(GENTARGETCPP):$(MSGDEFS)$(来源)
制造发电机
$(gentarges):$(MSGDEFS)$(来源)
制造发电机
gen:$(目标)$(MSGDEFS)$(来源)
mkdir-p../src/
mkdir-p../include/
./$<
$(目标):msgGen.cpp
g++$<-o$@--std=c++11
清洁:
rm-f$(目标)$(GENTARGETCPP)$(GENTARGETH)
execute\u process()
发生在配置阶段,即生成阶段之前。您预期会发生什么,然后又发生了什么?我想运行源代码生成。这将在这个CMakelist.txt中为目标生成源,然后我运行cmake'huhu…'从未打印到终端。此外,Makefile的打印输出也不可见。如果我用上面的命令手动运行make,我可以看到输出。在检查依赖项之前,似乎没有调用“execute\u process”。
-“execute\u process”作为配置过程的一部分运行(cmake
call),在这个阶段没有依赖项检查。但是:如果您在已经配置的项目上调用make
,则只有在CMakeLists.txt
发生更改时才会重新配置。为什么不使用公共add\u custom\u target
/add\u custom\u命令
方法来生成源文件?例如,add_custom_命令(输出${CMAKE_CURRENT_SOURCE_DIR}/src/SOURCE.cpp命令make-C…
,add_custom_目标(生成依赖${CMAKE_CURRENT_SOURCE_DIR}/src/SOURCE.cpp)
,添加依赖项(${PROJECT_NAME}generate)
。
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)