Не уверен, понравится ли вам это, но я думаю, что компиляция и запуск небольшой 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 - ИСТИНА или ЛОЖЬ. И если файл не найден, try_run возвращает ошибку (в RUN_RESULT). В противном случае cmake запускает программу, которая ищет конец файла и печатает размер в байтах. Результат фиксируется в переменной FILE_SIZE.
Единственная проблема с этим состоит в том, что он не будет работать для кросс-компиляции, так как try_run ничего не запускает в этом случае.