У меня есть проект, в котором структура каталогов такая:
$projectroot
|
+---------------+----------------+
| | |
part1/ part2/ part3/
| | |
+------+-----+ +---+----+ +---+-----+
| | | | | | |
data/ src/ inc/ src/ inc/ src/ inc/
Как мне написать make-файл, который будет частично / src (или где-то еще), который может частично дополнять / связывать исходные файлы c / c ++? / Src?
Могу я сделать что-нибудь вроде -I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src ...
Если это сработает, есть ли более простой способ сделать это. Я видел проекты, где в каждой соответствующей части есть make-файл? папки. [в этом посте я использовал знак вопроса, как в синтаксисе bash]
recursive invocation
, который выглядит довольно элегантно.Ответы:
Традиционный способ - иметь
Makefile
в каждом подкаталоге (part1
,part2
и т. Д.), Что позволяет создавать их независимо. Кроме того, создайтеMakefile
в корневом каталоге проекта, в котором все строится. «Корень»Makefile
будет выглядеть примерно так:Поскольку каждая строка в цели make запускается в своей собственной оболочке, нет необходимости беспокоиться о поиске резервной копии дерева каталогов или других каталогов.
Я предлагаю взглянуть на раздел 5.7 руководства GNU make ; это очень полезно.
источник
+$(MAKE) -C part1
и т. Д. Это позволяет управлять работой Make в подкаталогах.Если у вас есть код в одном подкаталоге, зависящий от кода в другом подкаталоге, вам, вероятно, будет лучше с одним make-файлом на верхнем уровне.
Полное обоснование см. В разделе Рекурсивное создание считается вредным , но в основном вы хотите, чтобы у make была полная информация, необходимая для принятия решения о том, нужно ли перестраивать файл, и у него не будет этого, если вы скажете ему только о трети ваш проект.
Похоже, что ссылка выше недоступна. Тот же документ доступен здесь:
источник
Может пригодиться опция VPATH, которая сообщает программе make, в каких каталогах искать исходный код. Однако вам все равно понадобится опция -I для каждого пути включения. Пример:
Это автоматически найдет соответствующие файлы partXapi.cpp в любом из указанных каталогов VPATH и скомпилирует их. Однако это более полезно, когда ваш каталог src разбит на подкаталоги. Для того, что вы описываете, как говорили другие, вам, вероятно, лучше иметь файл makefile для каждой части, особенно если каждая часть может стоять отдельно.
источник
VPATH=..
у меня сработало!Вы можете добавить правила в свой корневой Makefile, чтобы скомпилировать необходимые файлы cpp в других каталогах. Приведенный ниже пример Makefile должен стать хорошим началом для того, чтобы привести вас туда, где вы хотите быть.
источник
Если источники распределены во многих папках и имеет смысл иметь отдельные файлы Makefile, то, как предлагалось ранее, рекурсивный make - хороший подход, но для небольших проектов мне легче перечислить все исходные файлы в Makefile с их относительным путем. в Makefile вот так:
Затем я могу установить
VPATH
это так:Затем строю объекты:
Теперь правило простое:
А создание вывода еще проще:
Можно даже
VPATH
автоматизировать генерацию:Или используя тот факт, что
sort
удаляет дубликаты (хотя это не должно иметь значения):источник
Я думаю, что лучше отметить, что использование Make (рекурсивного или нет) - это то, чего обычно вы можете избегать, потому что по сравнению с современными инструментами его сложно изучать, поддерживать и масштабировать.
Это замечательный инструмент, но в 2010+ его следует считать устаревшим.
Если, конечно, вы не работаете в особой среде, например, с унаследованным проектом и т. Д.
Используйте IDE, CMake или, если у вас жесткий ядро, Autotools .
(отредактировано из-за отрицательных голосов, Тай Хонза за указание)
источник
Сообщение RC было СУПЕР полезным. Я никогда не думал об использовании функции $ (dir $ @), но она сделала именно то, что мне нужно.
В parentDir создайте несколько каталогов с исходными файлами: dirA, dirB, dirC. Различные файлы зависят от объектных файлов в других каталогах, поэтому я хотел иметь возможность создать один файл из одного каталога и сделать так, чтобы он создавал эту зависимость, вызывая make-файл, связанный с этой зависимостью.
По сути, я сделал один Makefile в parentDir, который имел (среди прочего) общее правило, подобное RC:
Каждый подкаталог включал этот make-файл верхнего уровня, чтобы унаследовать это общее правило. В Makefile каждого подкаталога я написал собственное правило для каждого файла, чтобы я мог отслеживать все, от чего зависит каждый отдельный файл.
Когда мне нужно было создать файл, я использовал (по сути) это правило для рекурсивного создания любых / всех зависимостей. Отлично!
ПРИМЕЧАНИЕ: есть утилита под названием «makepp», которая, кажется, выполняет эту задачу даже более интуитивно, но ради переносимости и не в зависимости от другого инструмента я решил сделать это таким образом.
Надеюсь это поможет!
источник
Рекурсивное использование Make
Это позволяет
make
разделить на задания и использовать несколько ядер.источник
make -j4
?make
вообще использовать контроль заданий. При запуске отдельного процесса make он не подлежит контролю заданий.Я искал что-то подобное, и после некоторых попыток и неудач я создал свой собственный make-файл, я знаю, что это не «идиоматический способ», но это начало понимания make, и это работает для меня, может, вы могли бы попробовать в своем проекте.
Я знаю, что это просто, и для некоторых людей мои флаги неверны, но, как я уже сказал, это мой первый Makefile, который скомпилирует мой проект в нескольких каталогах и связывает все вместе, чтобы создать мою корзину.
Принимаю предложения: D
источник
Предлагаю использовать
autotools
://##
Поместите сгенерированные объектные файлы (.o) в тот же каталог, что и их исходные файлы, чтобы избежать конфликтов при использовании нерекурсивного make.просто включив его
Makefile.am
с другими довольно простыми вещами.Вот учебник .
источник