在我的基于CMake的项目中,我的CMakeLists.txt中有一个变量,可以启用后端目标。此变量的有效值是有限的,例如6.
我想缓存有效值列表,以便用户可以选择要启用的功能。 CMake应该验证变量。
这可能吗?如果可以,怎么做?
答案 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})
缓存变量,就像任何其他字符串变量一样,但如果用户点击它来编辑它,而不是通用文本框,您将获得包含商品trafficLight
,Red
和Orange
的组合框。
虽然这不是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()