Возникла проблема при компиляции файлов C с использованием rake. Я могу определить свою константу в файле rakefile и распечатать значение этой константы в моем файле C.
Это работает нормально, компилирует, связывает и выполняет, как ожидается, когда заданная константа является целым числом.
Но когда строка определена как константа в файле rake, я не могу скомпилировать. Я уверен, что здесь отсутствует правильный синтаксис.
Вот мой rakefile.rb
require 'rake/clean'
CLEAN.include('*.o')
CLOBBER.include('*.exe')
source_files = Rake::FileList["*.c"]
object_files = source_files.ext(".o")
TEST_CONST="A STRING" #### <---- This causes problem
task :default => "test_app"
task :clean do
sh "rm -rfv *.o"
end
desc "Build the binary executable"
file "test_app" => object_files do |task|
sh "gcc #{object_files} -o #{task.name}"
end
rule '.o' => '.c' do |task|
sh "gcc -c #{task.source} -DVAR=#{TEST_CONST}"
end
Это мой файл C:
#include <stdio.h>
int main () {
printf("Running main\n");
printf("VAR: %s\n",VAR);
}
Это журнал ошибок:
<command-line>:0:5: error: ‘A STRING’ undeclared (first use in this function)
main.c:6:24: note: in expansion of macro ‘VAR’
printf("VAR: %s\n",VAR);
^~~
<command-line>:0:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:6:24: note: in expansion of macro ‘VAR’
printf("VAR: %s\n",VAR);
^~~
rake aborted!
В make-файле я бы добавил что-то вроде этого в CFLAGS: -DSTRVAR=\"$(VAR)\"
Я понятия не имею, как это сделать с помощью rake, т.е. передать строковую константу в качестве флага компиляции. Кто-нибудь сталкивался с этой конкретной проблемой раньше и мог бы поделиться некоторыми идеями?
РЕДАКТИРОВАТЬ 1:
Я изменил присвоение на TEST_CONST="'(A STRING)'"
, как предложено, и это ошибка, которую я получаю, я работаю на Ubuntu Linux.
gcc -c main.c -DVAR='A STRING'
main.c: In function ‘main’:
<command-line>:0:5: error: ‘A’ undeclared (first use in this function)
main.c:10:25: note: in expansion of macro ‘VAR’
printf("VAR: %s \n",VAR);
^~~
<command-line>:0:5: note: each undeclared identifier is reported only once for each function it appears in
main.c:10:25: note: in expansion of macro ‘VAR’
printf("VAR: %s \n",VAR);
^~~
<command-line>:0:7: error: expected ‘)’ before ‘STRING’
main.c:10:25: note: in expansion of macro ‘VAR’
printf("VAR: %s \n",VAR);
^~~
rake aborted!
Command failed with status (1): [gcc -c main.c -DVAR='A STRING'...]
/home/abel/Projects/rake_test/rakefile.rb:23:in `block in <top (required)>'
Tasks: TOP => default => test_app => main.o
(See full trace by running task with --trace)