将CMake选项从命令行移动到顶级CMakeLists.txt

时间:2015-10-29 17:55:40

标签: cmake dcmtk

我正在使用命令行构建DCMTK,使用以下命令:

ClaimValueTypes

我想将BUILD_APPS设置从命令行移动到顶级CMakeLists.txt配置文件中。无论我如何尝试在顶级配置文件中设置BUILD_APPS选项,我都不会得到正确的行为,除非我从命令行显式设置了BUILD_APPS选项。

有没有办法从顶级CMakeLists.txt文件中显式设置命令行选项?

我从DCMTK来源和借阅中借用了这个。它不起作用:

public static class ClaimExtensions
{
    public static object ValueAsValueType(this Claim claim)
    {
        switch (claim.ValueType)
        {
            case ClaimValueTypes.Double:
                return double.Parse(claim.Value);
            case ClaimValueTypes.String:
                return claim.Value;
            default:
                throw new Exception(string.Format("Unhandled ClaimValueType {0} in ClaimExtensions.ValueAsValueType()", claim.ValueType));
        }
    }

    public static List<Claim> ToClaims(this Dictionary<string, object> payload)
    {
        return payload.Select(x =>
        {
            string valueType;
            var value = x.Value;

            if (x.Value is double || x.Value is decimal)
                valueType = ClaimValueTypes.Double;
            else if (x.Value is string)
                valueType = ClaimValueTypes.String;
            else
                throw new Exception(string.Format("Unhandled type of Claim Value {0} in ClaimExtensions.ToClaims()", value.GetType()));

            return new Claim(x.Key, x.Value.ToString(), valueType);
        }).ToList();

    } 
}

当我查看上面的SET命令生成的CMakeCache.txt文件时,我看到正确设置了选项:

cmake -DBUILD_APPS=BOOL:OFF ../latest_dcmtk

不幸的是,该选项不起作用。

1 个答案:

答案 0 :(得分:0)

一般来说,使用CMake时必须记住两件事:

  1. CMake是一种脚本语言,因此所有代码都是顺序处理的
  2. CMake的变量缓存用于在两次运行之间保持值
  3. 所以我同意@Tsyvarev和@ usr1234567,这很可能是一个订购问题:

    • 在您/代码检查set(BUILD_APPS OFF CACHE BOOL "" FORCE)
    • 之前,您必须执行if (BUILD_APPS)
    • 您必须检查主set(BUILD_APPS ...)中隐藏缓存变量
    • 之后是否存在正常变量CMakeLists.txt
    • CMakeCache.txt文件中的任何内容只是在代码的所有处理完成后(在主CMakeLists.txt的末尾)的那些变量的状态

    我再次尝试,-D强制执行缓存条目。因此,使用-D命令行选项和set(... CACHE ... FORCE)之间应该没有区别。只是你不能组合使用它们(后者总是会覆盖给定选项的任何命令行)。

    请尝试在主CMakeLists.txt的顶部添加variable_watch(BUILD_APPS),以找到隐藏/覆盖变量的代码部分。

    <强>参考