Может ли препроцессор gcc C использовать вывод команды оболочки? - PullRequest
2 голосов
/ 16 марта 2011

Например, можно ли использовать вывод 'uname -a' для создания макроса COMPILED_ON ниже?

#include <stdio.h>

#define COMPILED_ON `call uname -a and use the output as a quoted string'

int main( int argc, char **argv ) {
    printf( COMPILED_ON );
    return 0;
}

Ответы [ 5 ]

12 голосов
/ 16 марта 2011

нет, но:

gcc -DCOMPILED_ON="$(uname -a)"
4 голосов
/ 16 марта 2011

Я не думаю, что вы можете сделать это с препроцессором GNU, но, конечно, это невозможно сделать с простым стандартным препроцессором;вместо этого я думаю, что это задание для Makefile.

Пусть он запустит uname -a и сохранит его в переменной Makefile, которая будет использоваться для создания правильной директивы -D для компилятора.

Вы также можете заставить Makefile создать файл .h, который будет содержать определение макроса, и этот файл будет #include d для файлов, которые нуждаются в макросе COMPILED_ON.Это дает дополнительный бонус, заключающийся в том, что он не зависит от специфичных для компилятора опций для определения макросов.

Обратите внимание, что эти предложения применимы также и для создания инструментов, отличных от хорошего старого.

3 голосов
/ 16 марта 2011

Не так, нет.

Вам нужно сделать:

gcc "-DCOMPILED_ON=\"`uname -a`\"" -c file.c -o file.o

В качестве альтернативы, ваш make-файл может создать простой файл .h:

echo "#define COMPILED_ON \"`uname -a`\"" > compiledon.h

Тогда #include "compiledon.h"

Вам понадобится часть \", чтобы получить пригодную для использования строку.

0 голосов
/ 20 декабря 2016

Если вы используете CMake, у меня есть хороший фрагмент кода, который может помочь:

# This ensures the SHA1 git ref is shown within the app
execute_process(COMMAND git rev-parse HEAD WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} OUTPUT_VARIABLE GITSHA1REF)
string(REGEX REPLACE "\n$" "" GITSHA1REF "${GITSHA1REF}")
message(STATUS "GITSHA1REF = ${GITSHA1REF}")
add_definitions("-DGITSHA1REF=\"${GITSHA1REF}\"")

После этого я получаю текущий хеш Git SHA1 и использую его в своем коде C ++ следующим образом:

std::cout << "Git-SHA1: " << GITSHA1REF << std::endl;
0 голосов
/ 16 марта 2011

Нет, но вы можете достичь своей цели менее хрупким и SCCS-враждебным способом.

  1. Пусть make make запустит скрипт оболочки для создания .h файла.

  2. Настройте переменную make самостоятельно с помощью команды оболочки и передайте -D. Не все реализации make(1) поддерживают это.

  3. Пусть ваша цель make запустит компилятор с ключом -D, включающим команду оболочки.

...