GNU make: генерировать список исходных файлов - PullRequest
3 голосов
/ 17 апреля 2011

Нормально ли автоматически генерировать список исходных файлов (.c, .cpp и т. Д., А не заголовков)?

Как бы вы это сделали? Я думаю использовать find и sed.

РЕДАКТИРОВАТЬ: проект библиотеки. Все исходные файлы находятся в каталоге проекта. Никаких не связанных исходных файлов там нет. Все объектные файлы создаются с использованием одинаковых параметров компилятора. Я подумываю создать список всех исходных файлов, а затем файл зависимостей для каждого исходного файла, следуя примеру Тромея. Это жизнеспособный подход?

БОЛЬШЕ РЕДАКТИРОВАТЬ: Это довольно большая библиотека C ++. Проект разрабатывается. Минимизация перекомпиляции крайне желательна.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2011

Нормальный? Это распространено, но не мудро.

Многие люди используют подстановочные знаки Make или find или что-то подобное, чтобы сгенерировать список всех исходных файлов, которые существуют в определенном дереве каталогов, затем передать их компилятору и связать объекты вместе. Это хрупкое решение, которое доставит вам неприятности. Если между исходными файлами появляется конфликт (например, два отдельных определения void foo()), компоновщик будет жаловаться, и может быть неочевидно, как решить проблему. Вы можете оказаться в лесу с исходными файлами, многие из которых не нужны вашему проекту, замедляя сборку и вызывая конфликты. И если вы хотите использовать некоторые из этих источников (но не все) в другом исполняемом файле, вам придется прибегнуть к символическим ссылкам или к другой хитрости.

Лучший подход - указать в make-файле, какие объекты необходимы для данной цели, а затем позволить Make выяснить, какие источники использовать. Это то, что делает Make хорошо. Не существует надежного способа поддерживать списки объектов автоматически, вы просто должны сделать это вручную, но это не так много работы; если вы меняете их достаточно часто, чтобы это была настоящая рутина, значит, вы делаете что-то не так.

EDIT:
Если проект - это библиотека, как вы описываете, то да, это жизнеспособный и довольно хороший метод. И метод Тромея будет прекрасно работать, чтобы предотвратить ненужную перекомпиляцию.

2 голосов
/ 17 апреля 2011

С GNU make вы можете использовать подстановочные знаки.См. этот вопрос для примера.

...