CMake中用于确定文件大小的可移植方式是什么?

时间:2011-06-30 12:48:39

标签: windows scripting posix cmake portable-applications

我需要通过CMake脚本确定任意文件中的字节数,但是要以可移植的方式。

此文件可能很大,因此使用文件(READ ...)命令读取它并计算字符串长度不是最佳的。

如果我只需要在MacOS和/或Linux上运行,我就会使用wc -c,这正是我想要的。但是假设只有Windows工具链,脚本需要与Windows兼容。 (我对Windows开发知之甚少。)

我希望这是一个常见的操作,但我没有在CMake Modules源代码中发现任何类似内容(可能会搜索错误的内容),并且cmake -E似乎不支持它命令。

因此,我正在寻找一种巧妙的方法,可以通过单个命令获取此信息,或者建议我可以在Windows中使用哪些命令并环绕if(WIN32)条件。

2 个答案:

答案 0 :(得分:3)

有一个名为FileInformation的CMake模块,可让您以便携方式获取文件大小。它为CMake的内置file命令添加了一个新的子命令:

file (SIZE filename variable)

答案 1 :(得分:2)

不确定你是否会喜欢这个,但我认为编译和运行一个小的C程序并使用它的输出将是最简单的方法。毕竟,你需要做的是非常自定义,但在C中很容易做到。

cmake_minimum_required(VERSION 2.8)
project(test)

try_run(RUN_RESULT COMPILE_RESULT ${CMAKE_CURRENT_BINARY_DIR}/bin
    ${CMAKE_CURRENT_SOURCE_DIR}/filesize.c
    RUN_OUTPUT_VARIABLE FILE_SIZE
    ARGS ${CMAKE_CURRENT_SOURCE_DIR}/bigfile)

if (NOT COMPILE_RESULT)
    message(FATAL_ERROR "Filesize failed to compile")
endif()

if (RUN_RESULT EQUAL 0)
    message(STATUS "Filesize ${FILE_SIZE}")
else()
    message(WARNING "Filesize failed")
endif()

在filesize.c中:

#include <stdio.h>
int main(int argc, const char *argv[])
{
        FILE *fp = fopen(argv[1], "rb");
        if (fp != NULL) {
                fseek(fp, 0, SEEK_END);
                printf("%d", ftell(fp));
                fclose(fp);
                return 0;
        }
        return 1;
}

COMPILE_RESULT为TRUE或FALSE。如果找不到该文件,try_run将返回错误(在RUN_RESULT中)。否则cmake运行程序,该程序寻找文件的末尾并以字节为单位打印大小。结果将在FILE_SIZE变量中捕获。

唯一的问题是它不能用于交叉编译,因为在这种情况下try_run不运行任何东西。