Определите, скомпилируйте и выполните терминальную команду в Makefile в C - PullRequest
0 голосов
/ 06 апреля 2020

во время выполнения некоторых задач мне нужно выполнить команду терминала в файле. c. У меня был следующий макет в моем файле. c, и он прекрасно работает:

 #ifdef CONDITION_A
 static const char * funcA(){
   #define SIZE 56
   #define T_A_CMD "sudo info | grep \"Memory Size:\""
   ...
   ...}
 #endif 

 #ifdef CONDITION_B
 static const char * funcB(){
   #define SIZE 56
   #define T_B_CMD "sudo info | grep \"Battery Level:\""
   ...
   ...}
 #endif 

Теперь, допустим, у нас есть submakeA.mk и submakeB.mk и основной Makefile. Когда вы компилируете с make TARGET=submakeA, funA() будет скомпилировано и запущено. Если вы запустите make TARGET=submakeB, funcB() будет скомпилирован и запущен.

Теперь меня просят определить «T_A_CMD» и «T_B_CMD» в их соответствующих файлах submakeA.mk и submakeB.mk.

У меня есть следующий макет: 1) В основном Makefile:

ifdef t_a_cmd
     cflag += -DCONFIG_T_A_CMD='"$(t_a_cmd)"'
endif
ifdef t_b_cmd
     cflag += -DCONFIG_T_B_CMD='"$(t_b_cmd)"'
endif

2) В submakeA.mk:

t_a_cmd = sudo info | grep \"Memory Size:\"

3) В submakeB.mk :

t_b_cmd = sudo info | grep \"Battery Level:\"

4) В. c файле

#ifndef CONFIG_T_A_CMD
//do nothing 
#else
     #define T_A_CMD "sudo info | grep \"Memory Size:\""
#endif
#ifndef CONFIG_T_B_CMD
//do nothing 
#else
     #define T_B_CMD "sudo info | grep \"Battery Level:\""
#endif


 #ifdef CONDITION_A
 static const char * funcA(){
   #define SIZE 56
   #ifdef T_A_CMD 
   ...
   ...
 #endif
 }
 #endif 

 #ifdef CONDITION_B
 static const char * funcB(){
   #define SIZE 56
   #ifdef T_B_CMD 
   ...
   ...
 #endif
 }
 #endif 

Когда я запускаю его, компилятор выдает мне эту ошибку:

> Generating info details header file
/bin/sh: 3: syntax error: "(" unexpected
/home/usr/build.mk:59: recipe for target '/home/usr/build/submakeA/A.o' failed
make[1]:***[/home/usr/build/submakeA/A.o] Error2
Makefile:230: recipe for target 'A' failed
make: *** [A] Error

Я пытался изменить расположение #ifdef T_A_CMD и #endif вокруг, но все комбинации не помогли. Может кто-нибудь дать мне знать, что пошло не так, пожалуйста? Кроме того, я не нашел никакой документации или ресурсов об использовании «DCONFIG» и «CONFIG» в Makefile и о том, как они могут быть полностью переданы в исходный файл. c. Если кто-то может указать мне на такие ресурсы, это тоже будет здорово

1 Ответ

1 голос
/ 06 апреля 2020

Вопрос не совсем ясен, но, похоже, слово CONFIG может быть ненужным и вызывать проблемы.

Я бы предложил следующее содержание Makefile. Я предполагаю, что cflag играет роль, аналогичную более обычной CFLAGS, в том, что его значение передается компилятору C:

ifdef t_a_cmd
     cflag += -DT_A_CMD='"$(t_a_cmd)"'
endif
ifdef t_b_cmd
     cflag += -DT_B_CMD='"$(t_b_cmd)"'
endif

... и я бы предложил следующее .c содержимое файла, где T_A_CMD и T_B_CMD имеют #define -d, только если они не были определены через Makefile. Измените этот существующий код:

#ifndef CONFIG_T_A_CMD
//do nothing 
#else
     #define T_A_CMD "sudo info | grep \"Memory Size:\""
#endif
#ifndef CONFIG_T_B_CMD
//do nothing 
#else
     #define T_B_CMD "sudo info | grep \"Battery Level:\""
#endif

... на этот:

#ifndef T_A_CMD
#define T_A_CMD "sudo info | grep \"Memory Size:\""
#endif
#ifndef T_B_CMD
#define T_B_CMD "sudo info | grep \"Battery Level:\""
#endif
...