2016-03-18 2 views
0

В моей системе сборки некоторые файлы заголовков создаются автоматически. Их поколение занимает некоторое время. Генератор сначала создает пустой файл в файловой системе, затем записывает содержимое - поэтому есть небольшое временное окно, в течение которого файл существует и пуст.Нельзя полагаться на атомарное создание зависимостей с помощью GNU Make?

Это приводит к ошибкам параллельной сборки: процесс требует заголовка file.h и запускает команду генерации. Процесс B нуждается в том же файле; если он, похоже, начинает компиляцию в течение указанного временного окна, компилятор видит зависимость на месте, получает пустой заголовок и прерывает ошибку компиляции.

Каков правильный способ решения этой проблемы? Я ищу решение для GNU Make, но общие соображения также высоко ценятся.

+2

Не могли бы вы сгенерировать файл, дающий ему другое имя, а затем переименуйте его, когда он будет полностью сгенерирован. – 4386427

+1

Инструмент сломан. Он не должен этого делать. Но параллельный make не должен запускать задание, в котором перечисляется необходимое условие для файла, пока не будет создано правило, которое генерирует этот файл. У вас есть правильное правило и предпосылки? –

ответ

0

Вы не дали сделать всю историю. Просто скажите, какой рецепт делает заголовочный файл под вопросом, и ваши параллельные сборки с началом работы.

Это может быть немного сложно получить, если тот же рецепт создает сразу несколько заголовков. Единственный способ кодирования этого в сделать с чистыми правилами шаблона, и я не являюсь поклонником этих (вы хотите, чтобы шаблон соответствовал только вашему явному списку заголовков, не более). Неизбежно, однако, заголовки не имеют одинаковые временные метки (ls -l -t --full-time), , чтобы вы могли притворяться, что они сделаны один за другим.

Эскиз:

# Headers created by the recipe are h0.h h1.h h2.h 

h0.h: h1.h 
h1.h: h2.h 
h2.h: 
    recipe line 1 
    recipe line 2 

Теперь, когда сделать хочет компилировать f.c, который включает h1.h (скажем), он понимает, что он должен ждать h2.h быть построен по его рецепту, и только потом начните компиляцию f.c.

Смежные вопросы