在Cmake中运行自定义命令

Abd*_*lah 5 makefile cmake

我是Cmake的新手,需要在编译时生成一些文件.一旦生成我需要编译和链接文件.我创建了cmake makefile来编译已生成的文件,如

cmake_minimum_required(VERSION 2.6)
project(demo)
set(CMAKE_CXX_FLAGS "-DWITH_COOKIES")
add_library(soapC soapC.cpp soapVimBindingProxy.cpp)
add_library(stdsoap2  /home/abdullah/installs/gsoap-shah_edits/gsoap/stdsoap2.cpp)
add_executable(demo test_file.cc test_app.cc)
target_link_libraries(demo soapC stdsoap2 gsoap++)
Run Code Online (Sandbox Code Playgroud)

这成功编译了该项目.但是,soapC.cpp soapVimBindingProxy.cpp需要首先生成文件.我想在运行时使用gsoap工具生成这些文件.

以下是需要运行以生成头文件的命令

wsdl2h -o outfile.h infile.wsdl
Run Code Online (Sandbox Code Playgroud)

这将获取输入wsdl文件并创建相应的outfile.h.现在我尝试在这样的cmake中这样做

cmake_minimum_required(VERSION 2.6)
add_custom_command(
OUTPUT vsphere.h
COMMAND wsdl2h -o vsphere.h vim25/vim.wsdl
) 
Run Code Online (Sandbox Code Playgroud)

但这里出了点问题.弹出没有错误,但也没有创建文件.我错过了什么吗?所有人都非常感谢.谢谢.

arr*_*owd 8

您刚刚创建了一个用于生成头文件的命令,因此CMake知道vsphere.h从哪里获取.我建议OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vsphere.hadd_custom_command()通话中使用.

现在您需要创建一个目标:

add_custom_target(vsphere_header ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/vsphere.h)
Run Code Online (Sandbox Code Playgroud)

最后,让你的soapC目标依赖它:

add_dependencies(soapC vsphere_header)
Run Code Online (Sandbox Code Playgroud)

务必add_dependencies()soapC目标定义后发出呼叫.