如何在CMAKE中使用FIND_PACKAGE请求最佳版本

时间:2016-09-02 12:29:06

标签: cmake

我有一个包含库列表的文件夹:

libs\libA-1.0
    \libB-1.2
    \libB-1.4
    \libB-1.6 

我正在使用例如

在我的cmake脚本中加载这些库
FIND_PACKAGE(libB CONFIG)

在这种情况下,CMAKE只是加载libs文件夹中存在的第一个可接受的版本(在本例中为libB-1.2,因为它是文件夹中的第一个)

我知道我可以使用

请求特定的库版本
FIND_PACKAGE(libB 1.6 CONFIG)

但是我希望使用最大版本号(或至少是最新的词典顺序)来恢复库,而不指定它(这样我就可以在不修改所有cmake的情况下更新库脚本)。

这可能吗?

2 个答案:

答案 0 :(得分:1)

来自latest documentation

  

当多个包配置文件可用时,其版本文件声称与所请求的版本兼容,则未指定选择哪一个。不会尝试选择最高或最接近的版本号。

事实上,如果您认为版本号没有标准,那么猜测什么是最高或最接近的"版。明确地给出你在问题中写的确切想要的版本是你能做的最好的。

如果您真的需要它,则必须fork cmake并提出该功能。类似的东西:

FIND_PACKAGE(libB latest CONFIG)

这将需要替代版本文件来比较版本号。类似libB-config-version-compare.cmake的内容包含:

# given two variables to be compared:
# PACKAGE_FIRST_VERSION and PACKAGE_SECOND_VERSION

SET(PACKAGE_LATEST_VERSION ...)

答案 1 :(得分:1)

自CMAKE 3.7.0 this is now possible

以来
  

控制find_package检查兼容性使用的顺序   两个变量CMAKE_FIND_PACKAGE_SORT_ORDER和   CMAKE_FIND_PACKAGE_SORT_DIRECTION。   例如,为了选择最高版本,可以设置:

exports.saveMedia = ((req, res) => {
        const storage = multer.diskStorage({
            destination: (req, file, callback) => {
                callback(null, (config.const.path.base + config.const.path.productReviewMedia));
            },
            filename: (req, file, callback) => {
                callback(null, Date.now() + '-' + file.originalname);

            }
        });

        const upload = multer({storage: storage}).any('file');

        upload(req, res, (err) => {
            if (err) {
                return res.status(400).send({
                    message: helper.getErrorMessage(err)
                });
            }
            let results = req.files.map((file) => {
                return {
                    mediaName: file.filename,
                    origMediaName: file.originalname,
                    mediaSource: 'http://' + req.headers.host + config.const.path.productReviewMedia + file.filename
                }
            });
            res.status(200).json(results);
        });
    });