Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Вопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего: Есть три проекта с++. Все они лежат в общей папочке. Один из проектов как бы главный и использует остальные два. Остальные два могут собираться в своих папочках в основном для исполнения UNIT тестов. Однако главная цель таки собрать основной проект для 32 и 64 платформ. Вопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся. Хотя как я понял цель all может быть только одна и если мы инклюдим в один файл три других то будет ругань со стороны make что мол цель all должна быть одна. Либо сделать общий для всех проектов Makefile там определить цель all и в одном файле прописывать все зависимости. В этом случае у нас проект получается жесткой структуры – все завсит от одного файла, страдает модульнось. Посоветуйте как сделать именно правильно. Что бы бабушка гордилась Еще вдогонку - проект должен быть под 32 и 64 - как лучше поступить - сделать специальную цель для скажем 32 если я ожидаю, что большинство будет строить под 64 или держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 16:39 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
авторВопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего: Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake. авторЕсть три проекта с++. Все они лежат в общей папочке. Один из проектов как бы главный и использует остальные два. Остальные два могут собираться в своих папочках в основном для исполнения UNIT тестов. Однако главная цель таки собрать основной проект для 32 и 64 платформ. Вопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся. Как бы всё равно. MAKE сам не накладывает какие-то ограничения и правила. autotools -- те уже да, накладывают. Код: plaintext 1. Цель all может быть только одна в одном makefile, в нескольких их может быть много. Каждый makefile обрабатывается независимо. авторЛибо сделать общий для всех проектов Makefile там определить цель all и в одном файле прописывать все зависимости. В этом случае у нас проект получается жесткой структуры – все завсит от одного файла, страдает модульнось. Ну, не думаю, что модульность зависит от того, как написан makefile. авторПосоветуйте как сделать именно правильно. Что бы бабушка гордилась Еще вдогонку - проект должен быть под 32 и 64 - как лучше поступить - сделать специальную цель для скажем 32 если я ожидаю, что большинство будет строить под 64 или держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать... Безусловно надо делать одним файлом, а целевую платформу задавать конфигурацией сборки. autotools для этого ВСЕГДА используют off-the-tree сборку -- сборку вне дерева исходников, каждая конфигурация -- в отдельном поддереве ФС. На самом деле рекомендую не использовать голый Makefile, а использовать либо autotools, либо qmake, либо CMake. CMake рекомендую больше всего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 19:16 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
LowCoderВопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего:Возьми десяток многолетних open source проектов и посмотреть как это обычно делается. LowCoderЕсть три проекта с++. Все они лежат в общей папочке. Один из проектов как бы главный и использует остальные два. Остальные два могут собираться в своих папочках в основном для исполнения UNIT тестов.Если хочешь делать на чистом make, то читай главы 4.6 Phony targets и 5.7 Recursive Use. Там даже примеры есть как организовать работу с под-проектами. LowCoder Однако главная цель таки собрать основной проект для 32 и 64 платформ.Чем эти проекты отличаются друг от друга? Вот у меня сейчас один и тот-же проект пишется на WinXP-32 и на Linux Debian 64. Один и тот же makefile, никаких поклонов в сторону ОС или битности нет вообще. Из makefile я вызываю просто gcc - а он уже сам знает на какой ОС он живет и какая целевая платформа. Ну а если тебе действительно нужно какие-то специфические бубны для битности делать то можно например так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. А потом можешь запускать make platform=32. Но в 99% случаев у тебя будет в системе какая-нибудь переменная которая однозначно подскажет платформу и вручную ее почти никогда задавать никогда не нужно. Ну разве что если ты делаешь кросс-компиляцию и хост-платформа не совпадает с целевой. LowCoderВопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся. Только не инклудить а вызывать. В случае инклуда у тебя будет последовательное исполнение одного единственного скрипта сборки. И его всегда надо будет вызывать из корневого каталога. А если делать независимые сценарии для каждого подпроекта плюс один сценарий с subdirs в корне проекта, то можно будет собирать любой кусок проекта независимо (или зависимо от других). Опять таки, читай главу 5.7, там есть примеры. LowCoderили держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать...Если нужно (удобнее), то можно сделать. что-то в духе: Код: plaintext 1. 2. Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Но в таком разделении есть смысл только если платформо-зависимых флагов много и их удобнее держать в отдельных файлах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 20:16 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
MasterZivавторВопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего: Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake.У CMake смысл только один - если ты будешь собирать проект в разных make'ах. Вот если ты хочешь одновременно писать на GNU C/C++, на MS Visual Studio, и на каком-нибудь Borland - то CMake может быть полезен. Но на самом деле люди выбирающие CMake просто не умеют писать makefile. Я абсолютно убежден что CMake (да и autotools) это ненужный костыль с гигантскими ограничениями. Все что могут делать эти уродцы (CMake и autotools) можно сделать на gnu make с той-же легкостью и намного большим контролем над происходящим. При этом, make есть под все платформы и не привязан ни к одному транслятору. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 20:25 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White Owl, А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:11 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyв хедере изменилась только дата файла А что за злодей её изменил? cvs up вернёт её обратно. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:17 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owl, А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?Если ты мне объяснишь смысл этого желания я тебе объясню как это сделать. По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:44 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovAnatoly Moskovskyв хедере изменилась только дата файла А что за злодей её изменил? cvs up вернёт её обратно. Дата может меняться по множеству причин, самая простая - внесли в текст изменения, потом вернули обратно. И например, исходники в таком состоянии что нельзя делать ни коммит, ни апдейт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:47 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать. По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит. А по-моему дата исходника никак не должна влиять на компиляцию - в ней не содержатся никакие данные от которых зависит содержимое конечного бинарника. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:48 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать. Т.е. просто объяснить нельзя - необходимые опции в make добавятся только после моего объяснения ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 21:51 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owl, А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?Но вообще-то, это сделать элементарно. Просто убери зависимость от заголовка и все. А если все совсем плохо, и тебе надо убрать заголовок из уже объявленного списка заголовков, то filter-out спасет: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 22:52 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White Owl, Наоборот, я хочу чтобы была зависимость от заголовка. Но не от его даты, а от содержимого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 22:58 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать. По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит. А по-моему дата исходника никак не должна влиять на компиляцию - в ней не содержатся никакие данные от которых зависит содержимое конечного бинарника.Дата исходника это главный источник ответа на вопрос: "изменился исходник или нет?" Если ты хочешь вместо даты изменения файла проверять какой-то другой критерий (ну например есть реальная разница между рабочей копией исходника и архивной), то можно сделать первичную зависимость целей от специальных флаговых файлов а эти флаговые файлы уже создавать/трогать на основе диффа от рабочего исходника и архивной копии исходника. Хотя зачем это все нужно я не представляю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 23:00 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlДата исходника это главный источник ответа на вопрос: "изменился исходник или нет?" Нет. Это просто суррогатный признак изменения содержимого, за неимением лучшего в make. White OwlЕсли ты хочешь вместо даты изменения файла проверять какой-то другой критерий (ну например есть реальная разница между рабочей копией исходника и архивной), то можно сделать первичную зависимость целей от специальных флаговых файлов а эти флаговые файлы уже создавать/трогать на основе диффа от рабочего исходника и архивной копии исходника. Да я понял уже, что make не умеет этого без костылей :) White OwlХотя зачем это все нужно я не представляю. Если я работаю над проектом и внес изменения в хедер от которого зависит большая часть проекта, а потом вернул обратно (или например переключился на другую ветку в контроле версий, а потом обратно - эффект такой же: даты файлов меняются, а содержимое нет), то я не хочу ждать перекомпиляции проекта, когда этого можно избежать. Проекты они знаете ли немаленькие бывают. Да и вообще, мало ли что вы себе не представляете. Вселенная гораздо шире, чем ваш личный опыт :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 23:21 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlХотя зачем это все нужно я не представляю. Если я работаю над проектом и внес изменения в хедер от которого зависит большая часть проекта, а потом вернул обратно (или например переключился на другую ветку в контроле версий, а потом обратно - эффект такой же: даты файлов меняются, а содержимое нет), то я не хочу ждать перекомпиляции проекта, когда этого можно избежать.Хорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние. Anatoly MoskovskyДа и вообще, мало ли что вы себе не представляете. Вселенная гораздо шире, чем ваш личный опыт :)Ну вот и обогати мой опыт пожалуйста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.06.2013, 23:41 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlХорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние. scons умеет и по дате и по содержимому зависимости строить. White OwlНу вот и обогати мой опыт пожалуйста. Я выше уже привел два кейса. В прошлом у меня бывали и более жесткие кейсы. Например если контроль версий при чекауте устанавливает в локальных файлах дату из репозитория, и как часть сборки генерятся какие-то файлы, то периодически возникала ситуация когда сгенеренные файлы были новее новой версии файлов из которых они генерились. Это уже конкретная проблема, а не неудобство, и она не заметна пока не наткнешься случайно на неверно работающий код. К счастью Git с которым я сейчас работаю всегда при чекауте ставит текущую дату и не приходится извращаться в проектах где не используется scons. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 00:35 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite OwlХорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние. scons умеет и по дате и по содержимому зависимости строить.Не совсем корректная альтернатива. scons это не инструмент, а библиотека. Пользуясь которой можно написать программу сценария. Если хочешь корректно сравнивать scons и make, то бери makefile в котором каждое правило расписано через $(shell ...). В принципе, у scons есть положительные моменты. И я бы его пожалуй попытался бы использовать если бы он не был написан на Питоне. Вот когда его перепишут на чем-либо более надежном тогда и будем брать его в реальную работу. А пока, при всех своих достоинствах и умениях scons это симпатичная идея напрочь убитая собственным фреймворком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 01:28 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White Owlscons это не инструмент, а библиотека. Да-да, а когда вы в ком. строке набираете scons - это вы пишете код использующий эту библиотеку ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 01:37 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owlscons это не инструмент, а библиотека. Да-да, а когда вы в ком. строке набираете scons - это вы пишете код использующий эту библиотеку ?Нет, набирая scons в командной строке я запускаю скрипт который подгружает файл SConstruct как модуль и выполняет его. А вот когда я пишу содержимое файла SConstruct - то да, я пишу программу на Питоне 2.4 использующей эту библиотеку. Да... А если у меня стоит Питон 3.2, то scons мрёт почти сразу. А если 2.6 то работает, но потом тоже мрёт. Потому что Питон не совместим сам с собой. Поэтому не смотря на все плюшки scons'а - я очень не советую использовать его в серьезных проектах. Из более-менее серьезных альтернатив gnu make я могу назвать только makepp. Вернее это альтернатива для scons. Тот же самый принцип, только Перл вместо Питона и при этом полная обратная совместимость со стандартным make. Единственный минус makepp - его малая известность. Я сам, если честно, только документацию на него читал, да ради прикола несколько примеров попробовал. А на практике, привычка к make берет свое :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 02:04 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White Owlкогда я пишу содержимое файла SConstruct - то да, я пишу программу на Питоне Если вы пишете этот файл как программу на питоне, а не как декларативное описание сборки, то вы неверно используете scons. Не удивительно, что у всех он работает, а у вас - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 03:12 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlMasterZivпропущено... Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake.У CMake смысл только один - если ты будешь собирать проект в разных make'ах. Вот если ты хочешь одновременно писать на GNU C/C++, на MS Visual Studio, и на каком-нибудь Borland - то CMake может быть полезен. Но на самом деле люди выбирающие CMake просто не умеют писать makefile. Я абсолютно убежден что CMake (да и autotools) это ненужный костыль с гигантскими ограничениями. Все что могут делать эти уродцы (CMake и autotools) можно сделать на gnu make с той-же легкостью и намного большим контролем над происходящим. При этом, make есть под все платформы и не привязан ни к одному транслятору. Люди выбирающие CMake планируют рационально свое время. Мы, например, благодаря CMake, перешли с Visual Studio 6 на Visual Studio 10 за две недели и то только потому, что надо было выравнивать исходники в плане их компилируемости. Сам же студийный проект мы получили за счетное число секунд. А проект нешуточный о 600 dll-ках. Так что, мета описание проекта плюс последующая генерация под конкретную систему сборки выбор профессионалов :D ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 10:06 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlMasterZivпропущено... Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake.У CMake смысл только один - если ты будешь собирать проект в разных make'ах. ... При этом, make есть под все платформы и не привязан ни к одному транслятору. У cmake есть один смысл — он человеческий, в отличие от make, autotools и многого другого. И работает, в отличие от boostbuild и другого человеческого в этой области. Вот в этом и смысл использовать его. А про make под все платформы — это просто песня, ну так повеселил... Во-первых, его нет. Т.е. он есть, но он везде разный. А во вторых, одним make ты нифига не соберешь, нужен shell и ещё много всякой всячины. А ее нет. Вот за этим и нужен CMake. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 11:37 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White OwlНо на самом деле люди выбирающие CMake просто не умеют писать makefile. Ты абсолютно прав. Если бы ты знал, сколько раз я изучал make и благополучно забывал после того, как в нем терялась нужда... Make — это абсолютно невменяемый тул, У его существования есть только два оправдания — традиция, раньше ничего другого не было, и что он таки работает. Кстати, я видал не раз, как люди просто писали скрипты сборки на шеле, чем связываться с make ом. White OwlЯ абсолютно убежден что CMake (да и autotools) это ненужный костыль с гигантскими ограничениями. Ты абсолютно неправ. Как бы чтобы это доказать, достаточно поискать в сети проекты аналогичного назначения и прочитать мотивацию к их созданию. Очень хорошо это написано в Ant е. Почитай. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 11:47 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyWhite Owl, А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 12:00 |
|
||
|
Организовать оптимально Makefile
|
|||
|---|---|---|---|
|
#18+
White Owlто filter-out спасет: Код: plaintext 1. 2. 3. 4. 5. ... который поддерживается только GNU Make-ом... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.06.2013, 12:01 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38286492&tid=2020158]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
200ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 298ms |
| total: | 580ms |

| 0 / 0 |
