我可以在CMake中定义结构数据类型吗?

时间:2015-08-11 13:48:15

标签: cmake

CMake中的主导数据类型是字符串,而CMake中的几乎所有变量都基于字符串。我想知道是否有可能创建一个类似于C / C ++结构的结构。我举了下面的例子来说明我的问题:

使用C / C ++,我们可以用这种方式定义结构:

struct targetProperty
{
   std::string folder_name;
   std::string lib_name;
   std::string exe_name;
   std::string lib_type;
};

在CMake中,我们可以使用LIST来模拟这个结构:

set(targetProperty "the location for the folder")
list(APPEND targetProperty "the name of the lib")
list(APPEND targetProperty "the name of the executable")
list(APPEND targetProperty "the type of the lib")

但它不如C / C ++中的struct targetProperty那么清晰,我想知道是否还有其他智能替代品。谢谢。

2 个答案:

答案 0 :(得分:3)

如果您需要将结构与CMake目标(可执行文件,库,自定义目标)相关联,最简单的方法是使用CMake属性:

define_property(TARGET PROPERTY folder_name
    BRIEF_DOCS "The location for the folder"
    FULL_DOCS "The location for the folder"
)
define_property(TARGET PROPERTY lib_name
    BRIEF_DOCS "The name of the lib"
    FULL_DOCS "The name of the lib"
)

... # Define other structure field as properties


# Add some CMake target
add_custom_target(my_target1 ...)

# Associate structure with target
set_target_properties(my_target1 PROPERTIES
    folder_name "dir1"
    ... # set other properties
)

# Use properties
get_target_property(my_target1_folder my_target1 folder_name)
message("folder_name for my_target1 is ${my_target1_folder}")

CMake属性也可以与源目录相关联,这允许某种继承。

有关详细信息,请参阅define_property命令desctiption。或者问更具体的问题。

答案 1 :(得分:2)

您可以使用后缀为字段名称的变量名称模拟结构:

set(targetProperty_folder_name "the location for the folder")
set(targetProperty_lib_name "the name of the lib")

另一种方法是CMake用来模拟命令中的命名参数:

list(APPEND targetProperty FOLDER_NAME "the location for the folder")
list(APPEND targetProperty LIB_NAME "the name of the lib")

然后您可以使用CMakeParseArguments模块解析列表。

在这两种情况下,您都可以编写setter和getter宏来自动执行操作。

对于复杂的框架解决方案,请参阅cmakepp/Objects