Нужно правило зависимости make-файла, которое может обрабатывать отсутствующие файлы

StackOverflow https://stackoverflow.com/questions/239004

  •  04-07-2019
  •  | 
  •  

Вопрос

Мы используем GNU Make для нашей системы. В конце наших make-файлов у нас есть include, называемый Makedepends, который генерирует кучу файлов .d с помощью ключа -MM на gcc. Затем мы включаем файл .d для каждого файла .cc, используя строку include $ (CXXFILES: .cc = .d). Но когда мы удаляем файл или перемещаем файлы, шаг зависимостей прерывается, и нам приходится вручную удалять файлы .d (даже make clean не работает, потому что зависимости не работают)

Есть ли способ создать эти файлы зависимостей .d или включить эти файлы зависимостей .d, которые будут корректно обрабатывать удаление или перемещение файлов?

РЕДАКТИРОВАТЬ: Например: у меня есть serial.cc, и make-файлы генерируют файл serial.d, который зависит от buffer.h, но затем я изменяю его, так что мне больше не нужен buffer.h, и я удаляю буфер .час. В следующий раз, когда я запущу make, он захлебнется, потому что он содержит файл .d, который все еще делает serial.o зависимым от buffer.h.

Это было полезно?

Решение

http://make.mad-scientist.net/papers / advanced-auto-dependency-generation есть описание этой конкретной проблемы и несколько способов ее решения. Первый немного ошибочен, но "продвинутый" по сути, на месте.

Другие советы

Две возможности:

Во-первых, вы можете добавить правило в ваш Makefile для запуска шага зависимости:

.SUFFIXES: .d

%.d::
   makedepend_command_here

Если нет, то из раздела Last Resort страницы info для GNU Make:

  

Например, при тестировании   makefile, вам может быть все равно, если   исходные файлы содержат только реальные данные   что они существуют. Тогда вы могли бы сделать   это:

 %::
         touch $@
     

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

Будет ли это работать для создания пустых файлов .d для вас?

Если вы используете makepp с параметром - rm-stale , он заметит файлы, которые больше не собираются, и удалит их. Если для вас это нормальный вариант использования, вы можете поместить эту опцию в .makepprc в корне дерева сборки, и он всегда будет использоваться.

Но, конечно, makepp сам обрабатывает все эти определения зависимостей, поэтому вам не нужно загромождать ваш make-файл. Это даже лучше, чем ваш подход, потому что он может своевременно генерировать необходимые заголовки, чтобы компилятор мог подобрать, где gcc -MM потерпит неудачу.

Есть еще много чего сделать. Помимо выполнения почти всего, что может сделать GNU make, есть еще много полезных вещей, и вы даже можете расширить свои make-файлы с помощью некоторого программирования на Perl.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top