Как сохранить листинг компилятора пофайлово, используя *Autotools*?

Как сохранить листинг компилятора пофайлово, используя *Autotools*?

Пожалуйста, поймите, я использую Autotools / Automake / Autoconf, иЯ не могу использовать перенаправлениепоскольку его необходимо применять команда за командой в make-файле, сгенерированном autotools.

Мне нужен способ, позволяющий autotools создать make-файл, который содержит положения для генерации и сохранения листингов компилятора и/или ассемблера, связанных с каждыминдивидуальныйисточник в пакете.

Моя первая попытка заключалась в добавлении '-Wa,-acdhln -g' в CCFLAGS. Это действительно привело к составному листингу c/assembler, но этопошел к терминалу,не в файл. Если бы я захватил вывод make (используя перенаправление), у меня было бы 47 различных листингов, связанных вместе с перемежающимися командами сборки.

То, на что я надеялся, с оптимизмом читая документ ССЗОбщие параметры — использование коллекции компиляторов GNU,

-o file
Поместить вывод в файл file. Это применимо к любому виду вывода, будь то исполняемый файл, объектный файл, ассемблерный файл или предварительно обработанный код C.

Если -o не указано, по умолчанию исполняемый файл помещается в a.out, объектный файл для source.suffix в source.o, его ассемблерный файл в source.s, предварительно скомпилированный заголовочный файл в source.suffix.gch и весь предварительно обработанный исходный код C в стандартный вывод.

предназначен для отображения файлов {file}.o и {file}.s на основе "-o {file}.o" в командной строке GCC.

Произошло следующее: листинг ассемблера, по-видимому, был отправлен на стандартный вывод.

EDIT для добавления 23 октября 2016 г. Теперь я понимаю, что в документации говорилось о таких вещах, как выходной файл компилятора, переданный в качестве входных данных ассемблеру, и выходной файл ассемблера, переданный в качестве входных данных линкеру. Ни один из них не будет файлом LISTING ассемблера, который я хочу захватить.

Это также относится к использованию параметра -save-temps; он сохранит только выходные данные ассемблера, которые являются входным файлом компоновщика, а не файлом листинга ассемблера.

  • Альтернативная интерпретация документа может подразумевать, что каждый выходной файл будет помещен в один файл, указанный в операнде -o, либо смешанный, либо с последним созданным файлом, наложенным на ранее созданные файлы. (Например, вывод из прохода компилятора накладывается на вывод из прохода ассемблера, наложенный на вывод из прохода сбора.)

    Поскольку это кажется контрпродуктивным, я предположил, что GCC (исполнитель верхнего уровня) может быть достаточно умен, чтобы корректировать имя файла для разных проходов. Это, похоже, не так.

  • Исключение имени файла из "-o" казалось бы как раз то, что нужно, за исключением того, что объектный файл всегда называется "a.out" вместо "{source}.o". Почему была выбрана константа для имени выходного источника, мне не понятно, но шаг переименования после каждого вызова GCC может изменить "a.out" на "{source}.o".

  • КонсультацииДокументация по GNU Assemblerговорит еще меньше о -o и не имеет возможности работать с листингом вывода. Одна версия ассемблера, tigcc, документирует, что листинг выдается как стандартный вывод.

    • Разве пересмотренные версии GNU и GNU Build Standard для Unix не решали эту проблему?

    • (Я сошел с ума или просто живу в нереальности под названием Unix? ? ?)

Теперь, похоже, Make должен сообщить GCC, что при выполнении шага сборки стандартный вывод следует поместить в[email protected]file. Я подозреваю, что это невозможно сделать, учитывая, как ведут себя параметры GCC (и беглый взгляд на то, как используются файлы спецификаций). Возможно, Automake (или libtools?) может создать многошаговую операцию компиляции, разделяя различные шаги, чтобы можно было захватить вывод сборки.

Но,поскольку файл make создается с помощью autotools, мне нужен способскажите autotools создать make-файлкоторый создаст/захватит выходной файл сборки. Эта задача, похоже, потребует переписывания некоторых правил autoconf/automake и/или макросов.

Наконец, я работаю с пакетом, который кто-то другой создал с помощью autotools, заархивировал в tar-ball и скачал мне. Я не делал упаковку autotools, и я не создавал гигантские файлы *.ac, и я не хочу их хакать, если этого вообще можно избежать.

Мне просто нужно получить некоторые карты сборки и компоновки, чтобы попытаться устранить проблему с пакетом.

решение1

Я наконец сломался и написал настоящую программу, которая анализировала захваченный вывод терминала и извлекала файлы листинга. Хотя это работает для моей конкретной системы / конфигурации сборки / пакета, я не могу предложить это как что-то большее, чем пример. Это определенно не готовый к использованию инструмент.

Мне жаль, что это не универсальный ответ на вопрос, как преодолеть недостаток AutoTools.

Связанный контент