Как установить пользовательские предопределенные макросы для gcc через среду Linux, чтобы избежать их постоянной передачи

#linux #gcc

#linux #gcc

Вопрос:

У меня есть несколько проектов, в которых я использую много пользовательских макросов. Например,

 //prog.c

#include <stdio.h>

#ifdef DBG_LEVEL_1
#define P(d) printf("%s:%dn", #d, d);
#else
#define P(...)
#endif

#ifdef INLINE
#define INL static inline
#else
#define INL
#endif

INL void func_Sqr(int a)
{
  printf("sqr(a):%dn", a*a);
}

int main()
{
  int a = 3;
  P(a);
  func_Sqr(a);
  return 0;
}
  

Я компилирую это несколькими способами,

 gcc prog.c
gcc -DINLINE prog.c
gcc -DDBG_LEVEL_1 prog.c
gcc -DDBG_LEVEL_1 -DINLINE-DINLINE prog.c
  

Есть ли способ установить эти макросы включенными по умолчанию через переменную среды?

Мы можем решить эту проблему, создав makefile, где установлены эти макросы. Но я хочу знать, есть ли какое-либо решение, связанное со средой Linux

Комментарии:

1. Вы можете установить переменную окружения для каждого из этих макросов и вызвать эту переменную с помощью gcc и вашего исходного файла. Это должно быть тривиально

Ответ №1:

Есть ли способ установить эти макросы включенными по умолчанию через переменную среды?

Как правило, нет. Переменные среды не влияют на аргументы Gcc (за исключением, может быть DEPENDENCIES_OUTPUT ..).

Я советую написать небольшую функцию-оболочку вокруг команды, например, функцию bash:

 wgcc() {
   gcc "${GCCARGS[@]}" "$@"
}
  

а затем выполнить:

 GCCARGS =(-DA=1 -DB=2)
wgcc something.c
  

это просто сделать, легко понять и поддерживать, а также общаться с другими членами команды, легко реализовать и поделиться. Удивительно, что haisenbugs будет легко отслеживать — wgcc отличается ли тогда уникальное имя gcc . Тем не менее, вы могли бы перезаписать исходную команду с помощью gcc() { command gcc "${GCCARGS[@]}" "$@"; } или путем создания /usr/local/bin/gcc файла, что делает его немного более запутанным.

Но! Вы можете, и я бы настоятельно не советовал этого делать, потому что это будет сбивать с толку других и трудно поддерживать. Вы можете использовать переменную среды COMPILER_PATH для перезаписи инструментов компилятора и предоставления пользовательских параметров. Пошагово:

  • Создайте временный каталог
  • В этом каталоге все подпрограммы gcc привязаны к его обычному префиксу, за исключением инструментов, поведение которых вы хотите изменить, например cc1 .
  • Затем создайте cc1 как скрипт, который вызовет оригинал cc1 , но будет использовать некоторую переменную среды для передачи дополнительных аргументов.
  • Затем экспортируйте путь как COMPILER_PATH, чтобы gcc его принял.

На моем archlinux с gcc10.0.1 я сделал:

 mkdir /tmp/temp
cd /tmp/temp
for i in /usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/{cc1plus,collect2,lto-wrapper,lto1}; do ln -vs "$i"; done
printf "%sn" '#!/bin/sh' '/usr/lib/gcc/x86_64-pc-linux-gnu/10.1.0/cc1 $GCCARGS "$@"' > cc1
chmod  x cc1
export COMPILER_PATH=/tmp/temp
  

После этого вы можете:

 export GCCARGS=-DA=1
gcc -xc - <<<'int main() { printf("A=%dn", A); }'
./a.out
> A=1