Вы опускаете некоторую информацию, например, какие платформы вам нужны
чтобы запустить это, и если есть какие-либо дополнительные инструменты, которые вы можете использовать. Если
Вы можете использовать Ruby, Perl, Python, все становится намного проще. Больной
Предположим, что вы хотите работать на Unix и Windows pqlatform и
что нет доступных дополнительных инструментов.
Если вы хотите вывод команды из символа препроцессора,
Самый простой способ - создать файл заголовка вместо того, чтобы возиться
с параметрами командной строки. Помните, что в CMake есть скрипт-режим
(-P), где он обрабатывает только команды скрипта в файле, так что вы можете
сделать что-то вроде этого:
CMakeLists.txt:
project(foo)
cmake_minimum_required(VERSION 2.6)
add_executable(foo main.c custom.h)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
add_custom_command(OUTPUT custom.h
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/custom.cmake)
Файл "custom.h" генерируется во время компиляции командой "cmake".
-P custom.cmake ". Custom.cmake выглядит следующим образом:
execute_process(COMMAND uname -a
OUTPUT_VARIABLE _output OUTPUT_STRIP_TRAILING_WHITESPACE)
file(WRITE custom.h "#define COMPILE_TIME_VALUE \"${_output}\"")
Она выполняет команду (в этом случае "uname -a", вы замените ее
с любой командой, которую вы хотите), и помещает вывод в переменную
_output, который затем записывает в custom.h. Обратите внимание, что это будет только
работать, если команда выводит одну строку. (Если вам нужна многострочная
вывод, вам придется написать более сложный custom.cmake, в зависимости от
как вы хотите многострочные данные в вашей программе.)
Основная программа выглядит так:
#include <stdio.h>
#include "custom.h"
int main()
{
printf("COMPILE_TIME_VALUE: %s\n", COMPILE_TIME_VALUE);
return 0;
}
Если вы действительно хотите рассчитать параметры компилятора во время компиляции,
все становится намного сложнее. Для генераторов Bourne-shell вы можете просто
вставьте команду в кавычки. Если вы злитесь, выясняя,
цитируя, переместите всю логику вашей команды в shell-скрипт так
вам нужно только добавить mycommand.sh
в вашу add_definitions ():
if(UNIX)
add_definitions(`${CMAKE_CURRENT_SOURCE_DIR}/custom-options.sh`)
endif()
Для генераторов на основе пакетных файлов Windows все гораздо сложнее, и я
нет хорошего решения Проблема в том, что команды PRE_BUILD
не выполняются как часть того же пакетного файла, что и фактический компилятор
вызов (изучите BuildLog.htm для деталей), поэтому моя первоначальная идея
не работает (создание custom.bat в шаге PRE_BUILD
, а затем сделать
"вызвать custom.bat", чтобы получить набор переменных, который позже может быть
упоминается в командной строке компилятора). Если есть эквивалент
обратные пометки в пакетных файлах, которые решат проблему.
Надеюсь, это даст некоторые идеи и отправные точки.
(Теперь к неизбежному встречному вопросу: что вы действительно
пытаешься сделать?)
РЕДАКТИРОВАТЬ: Я не уверен, почему вы не хотите, чтобы CMake использовался для генерации заголовочного файла. Использование $ {CMAKE_COMMAND} расширится до CMake, используемого для генерации Makefiles / .vcproj-файлов, и, поскольку CMake на самом деле не поддерживает переносимые Makefiles / .vcproj-файлы, вам нужно будет повторно запустить CMake на целевых машинах.
CMake также имеет несколько служебных команд (для этой цели запустите "cmake -E"). Вы можете, например, сделать
add_custom_command(OUTPUT custom.h COMMAND ${CMAKE_COMMAND} -E copy file1.h file2.h)
для копирования file1.h в file2.h.
В любом случае, если вы не хотите создавать заголовочные файлы с помощью CMake, вам нужно будет либо запустить отдельные сценарии .bat / .sh для генерации заголовочного файла, либо сделать это с помощью echo:
add_custom_command(OUTPUT custom.h COMMAND echo #define SOMETHING 1 > custom.h)
Отрегулируйте кавычки по мере необходимости.