Находить, как именно rake вызывает gcc для компиляции кода c?
Я пытаюсь понять, как " cmock" / " unity" работает под капотом. Оба из них используют инструмент сборки ruby rake. Есть ли простой способ показать / записать в журнал все команды оболочки и их опции, которые были вызваны rake во время сборки? Я ожидаю увидеть среди других групп (или аналогичных):
gcc a.c -o a.o -Wall -g -I"some/path"
gcc b.c -o b.o -Wall -g -I"some/path"
редактировать:
Немного предыстории вопроса: я не понимаю (пока), как работают rake и cmock. Поэтому я подумал: было бы здорово помочь, если бы я мог регистрировать, как другие программы (в основном компилятор) вызывались rake при сборке предоставленного примера. Таким образом, я могу видеть процесс шаг за шагом, пока не слишком много узнавая о reke/cmock. (Я пробовал параметр -t, но он не показывает команды оболочки).
1 ответ
Здесь есть две основные проблемы.
Rake на самом деле не позволяет вам легко настраивать ваши компиляторы и не позволяет легко увидеть «магию», которую он творит за кулисами.
Я был в таком же положении и нашел ответы на оба этих вопроса. Вас, вероятно, волнует только проблема видимости, но я думаю, что другие захотят сделать следующий шаг («теперь, когда я вижу, что он делает, как мне это изменить?»), поэтому я добавлю их обоих.
Во-первых, гораздо проще. Rake выполняет кучу команд сборки, и вы можете увидеть их, добавив «--trace», например:
rake --trace compile
Однако во многих случаях вы можете обнаружить, что rake было предложено собрать Makefile и использовать «make», «gmake» или какой-либо другой вариант, который вы в конечном итоге увидите в выводе трассировки:
/bin/gmake install target_prefix=
И этот gmake запускает какой-то Makefile, вероятно, по какому-то пути, например «tmp/x86_64-linux/libxml_ruby/3.2.2» или тому, что соответствует вашей системе, библиотеке и версии, над которой вы работаете.
Этот Makefile генерируется задачей расширения rake, и обычно он просто использует «gcc» и «g++» вообще без пути, что является кошмаром, если у вас есть несколько установок gcc и вы хотите указать его.
Если ваша задача rake вызывает что-то вроде gmake или make, вы можете увидеть, какие команды она вызывает, сначала установив переменную среды:
bash/sh: export MAKE='gmake V=1'
tcsh/csh: setenv MAKE 'gmake V=1'
Но что еще более важно, если вы хотите указать реальный путь к компилятору, все становится запутанным. Если вы посмотрите в тот же каталог (tmp/..), где находится Makefile, вы увидите, что в нем (если он был создан с помощью rake Extensiontask) будет скрытый файл с именем «.rake-compiler-siteconf.rb» (это в Unix я не совсем уверен, какими будут пути Windows).
Внутри этого файла вы можете добавить несколько патчей. Я фактически обновил свою библиотеку компилятора rake, добавив строки в «lib/rake/extensiontask.rb» после строк вокруг:
siteconf.puts "require 'mkmf'"
(а затем пересобрать rake-compiler), но это изменит настройки CC/CXX для любого rake, использующего задачу расширения этого драгоценного камня.
Другой вариант — добавить его непосредственно в «.rake-compiler-siteconf.rb» библиотеки, которую вы пытаетесь скомпилировать, и попытаться снова выполнить сборку/компиляцию rake.
Строки будут выглядеть так:
RbConfig::MAKEFILE_CONFIG['CC'] = '/my/path/to/gcc'
RbConfig::MAKEFILE_CONFIG['CXX'] = '/my/path/to/c++/or/gcc/or/g++/or/whatever'
RbConfig::MAKEFILE_CONFIG['LDSHAREDXX'] = '/my/path/to/gcc/or/ld'
$DLDFLAGS.qsub!('-Wl,--example-of-removing-flags-from-default-ld-flags')