cmake:尝试在cmake脚本执行期间调用msbuild

时间:2014-08-29 15:28:11

标签: c++ cmake

我正在尝试将我的Visual Studio解决方案迁移到CMake。

我有两个项目 - generator(generator.exe从文本文件生成C ++源代码)和myProj(包含一些必须由generator.exe处理的文本文件)。
我想要的是:

  1. 构建生成器项目
  2. 使用步骤1中的generator.exe从项目myProj
  3. 中的文本文件生成C ++源文件
  4. 将这些生成的源文件放入生成的myProj VS项目
  5. 我到目前为止:

    ###################################################################
    # in root/generator/CMakeLists.txt:
    set(SRC_LIST .... )
    set(HDR_LIST .... )
    add_executable(generator ${SRC_LIST} ${HDR_LIST})    
    
    ###################################################################
    # in root/my_proj/CMakeLists.txt:
    
    add_subdirectory(../generator/  ../generator/cmake_out)
    
    # TRY TO BUILD GENERATOR.EXE. DON'T WORK, BECAUSE ../generator/cmake_out/ IS EMPTY YET
    execute_process(COMMAND msbuild ../generator/cmake_out/generator.vcxproj)
    # <copy generated files to ./src>
    
    add_subdirectory(src)
    
    ###################################################################
    # in root/my_proj/src/CMakeLists.txt:    
    
    set(SRC_LIST SomeSource.cpp .... )
    set(HDR_LIST SomeSource.h .... )
    
    add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST} )
    

    那么,这里有什么问题?为什么execute_process()失败?似乎CMake的执行顺序绝对是混乱的。

2 个答案:

答案 0 :(得分:0)

使用ADD_CUSTOM_COMMAND在编译期间执行generator.exe。请务必指定生成的所有OUTPUT文件。将这些输出文件列为myProj的源。 CMake应该为您构建一个解决方案,其中包含两个将首先构建生成器的项目,执行它以生成自动myProj文件,然后构建myProj。

add_custom_command(
    OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/output1.cpp ${CMAKE_CURRENT_BINARY_DIR}/output1.h
    COMMAND generator
    DEPENDS generator
    )

add_library(myProj ${CMAKE_CURRONT_BINARY_DIR}/output.h ${CMAKE_CURRENT_BINARY_DIR}/output.cpp)

答案 1 :(得分:0)

看起来execute_process失败是您遇到的问题最少,但要回答您的问题:首先,您可以使用

查看被调用命令的结果
execute_process(COMMAND msbuild ../generator/cmake_out/generator.vcxproj
                RESULT_VARIABLE result)
message(STATUS "Result: ${result}")

您可能会看到&#34;系统无法找到指定的文件&#34;因为CMake shell不知道msbuild命令所在的目录。你可以给出msbuild的完整路径,例如在我的系统上(VS 2013),我会使用:

execute_process(COMMAND "C:\\Program Files\\MSBuild\\14.0\\Bin\\MSBuild.exe"  
                ../generator/cmake_out/generator.vcxproj)