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

CMake: generate sources during CMake script execution

本文关键字:CMake 脚本 执行      更新时间:2023-10-16

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

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

  1. 生成生成器项目
  2. 使用步骤1中的generator.exe从项目myProj中的文本文件生成C++源文件
  3. 将生成的源文件放入myProj的VS项目中

那么,如何做到这一点呢?

编辑到目前为止我尝试过的:

###################################################################
# 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

从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代码不是您正在执行的代码。您的add_library()列出了SomeSource.h,但CMake抱怨../include/SomeSource.h。目录名也不起作用。这使得很难说到底出了什么问题。

当你熟悉一个新工具时,我的一般建议是:不要立即尝试让它在你最终希望它在中工作的环境中跳舞(在这种情况下是myProj)。相反,设置一个简单的测试环境(使用目录X和Y,源文件foo.cpp和bar.cpp,你就知道了),并测试概念(比如,让echo创建一个文件而不是generator,这样你就不需要先构建generator——这是下一步)。

这样,如果出现任何问题,您可以在摘要中请求的帮助,并且您可以提供完整的示例代码供其他人解决,而无需在项目设置中摇摆不定。

此外,你要避免由于错误的先入为主观念而产生的问题。很多时候,你的第一次尝试会导致一个尴尬的设置,而真正的优雅只是从经验教训中产生的。投入时间正确学习该工具。


如果你还不知道,source_group()允许CMake创建一个MSVC项目文件,将给定的源文件分组在一起,这样你就可以在CMake的控制下控制你的项目,但仍然可以在MSVC中轻松工作。


我已经建立了一个";框架";我在各种项目中使用的CMake设置,也许你对它感兴趣(为了获得灵感或实际使用):JAWS。