Вы уезжаете некоторую информацию, например, какие платформы вам нужно запустить это, и если есть какие-либо дополнительные средства, которые можно использовать. Если вы можете использовать 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 вы можете просто вставить команду внутри backticks. Если вы злитесь в то время как выяснить квотирование, переместить всю логику вашей команды внутри оболочки-скрипта так вам нужно только положить mycommand.sh
в ваших add_definitions():
if(UNIX)
add_definitions(`${CMAKE_CURRENT_SOURCE_DIR}/custom-options.sh`)
endif()
Для окна на основе пакетного файла генераторов вещей намного сложнее, и у меня нет хорошего решения. Проблема в том, что команды PRE_BUILD
не выполняются как часть того же командного файла, что и действительный вызов компилятора (изучите BuildLog.htm для получения дополнительной информации), поэтому моя первоначальная идея не работала (генерирование custom.bat в PRE_BUILD
, а затем выполните «call custom.bat» на нем, чтобы получить набор переменных, который позже может быть , упомянутый в командной строке компилятора). Если в пакетных файлах есть эквивалент обратных ссылок, это решит проблему.
Надеюсь, это дает некоторые идеи и отправные точки.
(Теперь к неизбежному встречный вопрос: что вы действительно пытается сделать?)
EDIT: Я не знаю, почему вы не хотите, чтобы 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)
для копирования файла1.h в файл2.h.
Во всяком случае, если вы не хотите, чтобы генерировать заголовок-файлы с помощью CMake, вам нужно будет либо ссылаться на отдельные .bat/.sh скриптов для создания файла заголовка, или сделать это с помощью эха:
add_custom_command(OUTPUT custom.h COMMAND echo #define SOMETHING 1 > custom.h)
При необходимости отрегулируйте цитату.
Я уточнил свой вопрос. Не могли бы вы разъяснить вам ответ в этом свете? –