具有有限有效值的CMake变量

时间:2016-09-23 23:21:11

标签: build cmake

在我的基于CMake的项目中,我的CMakeLists.txt中有一个变量,可以启用后端目标。此变量的有效值是有限的,例如6.

我想缓存有效值列表,以便用户可以选择要启用的功能。 CMake应该验证变量。

这可能吗?如果可以,怎么做?

1 个答案:

答案 0 :(得分:7)

如果要验证允许的值,您需要自己在import React from 'react'; import jsonp from 'jsonp'; import Gallery from './Gallery.jsx'; export const MF = 'http://auryn/modern-frontend/public_html'; export default class App extends React.Component { constructor(props) { super(props); this.state = { images: [ 'DSCF1176.jpg' ], height: window.innerHeight+'px' }; var self = this; // get images var url = MF+'/api/posts'; jsonp(url, {}, function (err, data) { const blogs = data.data.blogs.map(item => { return { 'images': item.image } }); var images = []; blogs.forEach(b => { b.images.forEach(i => { images.push(i.filename); }); }); //console.log(JSON.stringify(images)); //self.images = images; self.setState({ images }); }); } componentDidMount() { window.addEventListener('resize', this.handleResize); } handleResize(e) { this.setState({height: window.innerHeight+'px'}); } componentWillUnmount() { window.removeEventListener('resize', this.handleResize); } render() { return ( <Gallery images={this.state.images} height={this.state.height} /> ); } } 文件中执行此操作。但是,您可以为CMake提供一个值列表,以便在CMake GUI应用程序中显示为STRING缓存变量的组合框(以及ccmake中基于ncurses的等效项)。您可以通过设置缓存变量的STRINGS属性来实现。例如:

CMakeLists.txt

在该示例中,CMake GUI将显示set(trafficLightColors Red Orange Green) set(trafficLight Green CACHE STRING "Status of something") set_property(CACHE trafficLight PROPERTY STRINGS ${trafficLightColors}) 缓存变量,就像任何其他字符串变量一样,但如果用户点击它来编辑它,而不是通用文本框,您将获得包含商品trafficLightRedOrange的组合框。

虽然这不是100%强大的验证,但如果使用GUI,它确实可以帮助用户输入有效值。如果他们在命令行使用cmake,那么就没有什么能阻止他们将缓存变量设置为他们喜欢的任何值。因此,我建议您使用STRINGS缓存变量属性来帮助您的用户,还要进行验证。如果您已使用上述示例的模式,则您已经拥有有效值列表,因此验证应该很容易。例如:

Green

或者,如果您正在使用CMake 3.5或更高版本:

list(FIND trafficLightColors ${trafficLight} index)
if(index EQUAL -1)
    message(FATAL_ERROR "trafficLight must be one of ${trafficLightColors}")
endif()