Находить, как именно 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')
Другие вопросы по тегам