CMake:在CMake脚本执行期间生成源

时间:2014-08-29 13:17:09

标签: 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)
    add_subdirectory(src)
    
    ###################################################################
    # in root/my_proj/src/CMakeLists.txt:    
    
    ADD_CUSTOM_COMMAND(
       OUTPUT ../include/SomeSource.h SomeSource.cpp
       COMMAND generator ../definitions/SomeDefs1.txt
       DEPENDS generator ../definitions/SomeDefs1.txt
       )
    
    set(SRC_LIST SomeSource.cpp .... )
    set(HDR_LIST SomeSource.h .... )
    
    add_library(myProj STATIC ${SRC_LIST} ${HDR_LIST} )
    
    ###################################################################
    ###################################################################
    

    CMake的输出:

    .....
    -- Detecting C compiler ABI info - done
    -- Check for working CXX compiler using: Visual Studio 12 2013
    -- Check for working CXX compiler using: Visual Studio 12 2013 -- works
    -- Detecting CXX compiler ABI info
    -- Detecting CXX compiler ABI info - done
    -- Configuring done
    CMake Error at src/CMakeLists.txt:145 (add_library):
      Cannot find source file:
    
        ../include/SomeSource.h
    
      Tried extensions .c .C .c++ .cc .cpp .cxx .m .M .mm .h .hh .h++ .hm .hpp
      .hxx .in .txx
    

1 个答案:

答案 0 :(得分:1)

从CMake add_custom_command()开始,然后从那里拿走:

add_executable( generator ${generator_SOURCES} )
add_custom_command( OUTPUT source1.cpp source2.cpp
    COMMAND generator args1 args2
    COMMENT "Generating sources..." )

是否将myProj集成到您的其他项目中,或将其保持在外部取决于您的个人需求,并影响最终设置的外观。


回复您的修改:

首先,在源列表中包含标题文件是一个非常错误的主意。 CMake与编译器合作,应该弄清楚源文件对它们包含的头文件的依赖性,并且它们比大多数人做得好得多。 C ++' s #include 已经告诉编译器处理标题!

其次,您显示的CMake代码不是您正在执行的代码。您的add_library()列表SomeSource.h,但CMake抱怨../include/SomeSource.h。目录名称也无法解决。这使得很难说出究竟是什么问题。

在熟悉新工具时我的一般建议:立即尝试让它在最终希望它在中工作的上下文中跳舞(myProj,in这个案例)。相反,设置一个简单的测试环境(目录X和Y,源文件foo.cpp和bar.cpp,你明白了),并测试概念(比如,{{1}创建一个文件而不是echo,因此您不需要先构建generator - next 步骤。)

这样,如果弹出任何问题,您可以在摘要中寻求帮助,并且您可以提供完整的示例代码供其他人查明,而不必摆弄你的项目设置。

此外,您还可以避免错误的先入为主所带来的问题。很多时候,你的第一次尝试会导致尴尬的设置,真正的优雅只会来自所吸取的教训。花时间正确学习该工具。


如果您还没有了解它,source_group()允许CMake创建一个MSVC项目文件,并将给定的源文件组合在一起,这样您就可以让您的项目处于CMake控制之下,但仍可在内部轻松工作MSVC。


我已经建立了一个"框架" CMake设置我在各种项目中工作,也许您对它感兴趣(灵感或实际使用):JAWS