2012-07-09 203 views
3

我對Cmake非常陌生,需要在編譯時生成一些文件。一旦生成,我需要編譯和鏈接文件。我創建了cmake makefile來編譯已生成的文件,如在Cmake中運行自定義命令

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++) 

這成功編譯了項目。但是需要首先生成文件soapC.cpp soapVimBindingProxy.cpp。我想在運行時使用gsoap工具生成這些文件。

以下是需要運行以產生標頭文件

wsdl2h -o outfile.h infile.wsdl 

這需要一個輸入WSDL文件,創建相應的outfile.h該命令。 現在我試圖在cmake這樣做

cmake_minimum_required(VERSION 2.6) 
add_custom_command(
OUTPUT vsphere.h 
COMMAND wsdl2h -o vsphere.h vim25/vim.wsdl 
) 

但是這裏出了點問題。沒有錯誤彈出,但也沒有創建文件。我錯過了什麼嗎?所有幫助非常感謝。 謝謝。

回答

5

您剛剛創建了一個用於生成頭文件的命令,因此CMake知道從哪裏得到vsphere.h。我建議在add_custom_command()調用中使用OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/vsphere.h

現在,你需要創建一個目標:

add_custom_target(vsphere_header ALL DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/vsphere.h) 

最後,讓你的soapC目標依賴於它:

add_dependencies(soapC vsphere_header) 

一定要將add_dependencies()通話後soapC目標定義。

+0

arrowdodger嗨,但我沒有看到一個應該由該命令創建的vsphere.h:由'add_custom_command創建/ – Abdullah 2012-07-09 07:12:06

+1

司令部()'沒有運行,當你鍵入'make'。你需要用'ALL'關鍵字來'add_custom_target()',並使其依賴於由命令產生的文件。 – arrowd 2012-07-09 07:50:04

+0

非常感謝!它的工作:) – Abdullah 2012-07-09 08:13:51

1

感謝arrododger和TobyHijzen在這個問題上的照明。

我使用add_custom_command和main_dependency特性來解決這個問題。以下是我的CMakeLists.txt for gsoap教程的着名計算示例。

cmake_minimum_required(VERSION 2.8) 

# Proejct name 
PROJECT(Calculator) 

# Make verbose level on/off 
SET(CMAKE_VERBOSE_MAKEFILE ON) 

# Varialbes used in cmake 
SET(TARGET calc_client) 
SET(GSOAP_STATIC_LIB gsoap) 

SET(CLIENT_SRC calc_client.c) 

SET(WSDL2H_EXEC wsdl2h) 
SET(WSDL2H_IN http://www.genivia.com/calc.wsdl) 
#SET(WSDL2H_IN calc.wsdl) 
SET(WSDL2H_OUT calc.h) 
SET(WSDL2H_OPT -c -o) 

# command for generating stub and xml serializer code 
ADD_CUSTOM_COMMAND(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${WSDL2H_OUT} 
    COMMAND ${WSDL2H_EXEC} -c -ttypemap.dat -o ${WSDL2H_OUT} ${WSDL2H_IN} 
    COMMENT "=================== Generating ${WSDL2H_OUT} gSOAP Header file ..." 
) 

SET(SOAPCPP2_EXEC soapcpp2) 
SET(STUB soapClient.c soapC.c) 

SET(SOAPCPP2_OUT 
    ${STUB} 
    calc.add.req.xml 
    calc.add.res.xml 
    calc.sub.req.xml 
    calc.sub.res.xml 
    calc.mul.req.xml 
    calc.mul.res.xml 
    calc.div.res.xml 
    calc.div.req.xml 
    calc.pow.res.xml 
    calc.pow.req.xml 
    calc.nsmap 
    soapH.c 
    soapH.h 
    soapStub.h 
    soapClientLib.c 
) 
# command for generating stub and xml serializer code 
ADD_CUSTOM_COMMAND(
    OUTPUT ${STUB} 
    COMMAND ${SOAPCPP2_EXEC} -c -C ${WSDL2H_OUT} 
    MAIN_DEPENDENCY ${WSDL2H_OUT} 
    COMMENT "=================== Generating ${STUB} outputs ..." 
) 


# Exutable files and dependents 
ADD_EXECUTABLE(${TARGET} ${CLIENT_SRC} ${STUB}) 

# libraries for taget : for gcc -l option 
TARGET_LINK_LIBRARIES(${TARGET} ${GSOAP_STATIC_LIB}) 

# Compiler options 
ADD_DEFINITIONS(-Wall -O2 -s) 
相關問題