我需要通过一个CMake脚本来确定任意文件中的字节数,但是要以便携的方式。
该文件可能很大,因此使用文件(READ …)读取它并计算string长度并不是最佳select。
如果我只需要在MacOS和/或Linux上运行,我只需要使用wc -c
,这正是我想要的。 但脚本需要与Windows工具链兼容。 (我对Windows开发不是很了解。)
我期望这是一个普通的操作,但是在CMake Modules源代码中找不到任何类似的东西(可能是在寻找错误的东西),而且看起来没有被cmake -E
命令支持。
所以我正在寻找一个聪明的方法来获得这个信息与一个单一的命令,或build议我可以在Windows中使用什么命令(S),并绕过if(WIN32)
条件。
有一个名为FileInformation的CMake模块,它可以让您以便携的方式获取文件的大小。 它为CMake的内置file
命令添加了一个新的子命令:
file (SIZE filename variable)
不知道你是否会喜欢这个,但我认为编译和运行一个小的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在这种情况下不运行任何东西。
那么,对于短文件你可以做:
function(get_file_size var filename) file(READ "${filename}" content HEX) string(LENGTH "${content}" content_length) math(EXPR content_length "${content_length} / 2") set(${var} ${content_length} PARENT_SCOPE) endfunction() get_file_size(len "main.c") message(STATUS "len(main.c)=${len}")