2012-05-14 84 views
0

我们使用CMake为Visual Studio 2008生成解决方案文件。除了构建库和可执行文件的常规源项目之外,我还希望有一个仅包含配置文件的项目。这些文件用于在运行时配置项目的行为。他们不需要构建项目,但将它们包含在解决方案中可以方便地编辑这些文件。我能做到这add_custom_target使用像这样:如何让CMake创建一个仅包含配置文件的Visual Studio项目?

file(GLOB ini_files ${PROJECT_SOURCE_DIR}/../config/ini/*) 
source_group(ini FILES ${ini_files}) 
file(GLOB xml_files ${PROJECT_SOURCE_DIR}/../config/xml/*) 
source_group(xml FILES ${xml_files}) 
add_custom_target(config SOURCES ${ini_files} ${xml_files}) 

这给了我一个包含配置文件的子文件夹的“配置”项目。但是,还有一个名为“config”的链接指向一些不存在的文件。我认为这应该是这个规则创建的目标的链接。由于没有什么可以建立的,这仍然是一个死路。现在我的问题是:

  1. 是add_custom_target正确的方式来实现我想要的? 如果不是,那么更好的解决方案是什么?
  2. 如果是正确的方法,我该如何摆脱与目标名称的链接?另外,我想删除“CMake Rules”文件夹以使配置项目尽可能地干净。

回答

2

Visual Studio项目实质上是根据一组源文件构建目标。

不建议有一个只存在一组静态文件的项目,因为只要添加一个自定义目标,CMake就会盲目地尝试为该项目创建一个输出,以便与其他项目保持兼容后端系统。 试想一下,如果CMake创建了一个没有实际目标的Unix Makefile,那甚至不会是Makefile,对吗?

正确的做法是将文件实际添加到另一个现有项目。从技术上讲,如果您正在构建可执行文件,并且此可执行文件在运行时读取配置文件,则这些文件合法地成为项目的一部分。另外,我不推荐使用文件globing来列出源文件或配置文件,因为如果您在文件夹中添加文件,CMake将无法知道已添加新文件,并且Visual Studio项目将不会被重新生成以包含这些文件。相反,您应该列出CMakeLists.txt文件中的每个文件,以便在那里添加新文件将触发cmake文件再生。对于最后一点,如果你确实需要“干净”的项目,那么CMake不是你需要的工具,因为它产生的所有东西都有助于保持一致的构建过程。

+0

谢谢你这个有见地的答案。将这些文件添加到现有的项目中,我自己记住了;但问题是,这些项目实际上构建了我们项目外部框架使用的模块(动态库,dll或其他文件)。所以也许会把配置文件放到它们所属的模块中;有些被多重使用。还有一些文件将框架配置为使用模块,因此不会被任何模块读取。我知道,对于Unix Makefiles来说这没有用,但是这个项目的唯一目的是将配置文件添加到VS. – ahans

+0

@ahans没有什么能阻止你在多个项目中包含文件。开销很小,因为没有文件会被复制。 – SirDarius

+0

有趣的一点。这并不能解决配置框架的文件问题。我会牢记这一点,可能会在某些时候派上用场。现在我通过使用'add_library'解决了这个问题。这正是我想要的。 – ahans

相关问题