powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Организовать оптимально Makefile
25 сообщений из 57, страница 1 из 3
Организовать оптимально Makefile
    #38285469
LowCoder
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего:
Есть три проекта с++. Все они лежат в общей папочке. Один из проектов как бы главный и использует остальные два. Остальные два могут собираться в своих папочках в основном для исполнения UNIT тестов. Однако главная цель таки собрать основной проект для 32 и 64 платформ. Вопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся. Хотя как я понял цель all может быть только одна и если мы инклюдим в один файл три других то будет ругань со стороны make что мол цель all должна быть одна.
Либо сделать общий для всех проектов Makefile там определить цель all и в одном файле прописывать все зависимости. В этом случае у нас проект получается жесткой структуры – все завсит от одного файла, страдает модульнось.
Посоветуйте как сделать именно правильно. Что бы бабушка гордилась
Еще вдогонку - проект должен быть под 32 и 64 - как лучше поступить - сделать специальную цель для скажем 32 если я ожидаю, что большинство будет строить под 64 или держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать...
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285682
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВопрос гуру make – как организовать правильно (так что би через 20 лет было не стыдно) make файл для следующего:


Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake.


авторЕсть три проекта с++. Все они лежат в общей папочке. Один из проектов как бы главный и использует остальные два. Остальные два могут собираться в своих папочках в основном для исполнения UNIT тестов. Однако главная цель таки собрать основной проект для 32 и 64 платформ. Вопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся.

Как бы всё равно. MAKE сам не накладывает какие-то ограничения и правила. autotools -- те уже да, накладывают.


Код: plaintext
1.
Хотя как я понял цель all может быть только одна и если мы инклюдим в один файл три других то будет ругань со стороны make что мол цель all должна быть одна.



Цель all может быть только одна в одном makefile, в нескольких их может быть много.
Каждый makefile обрабатывается независимо.

авторЛибо сделать общий для всех проектов Makefile там определить цель all и в одном файле прописывать все зависимости. В этом случае у нас проект получается жесткой структуры – все завсит от одного файла, страдает модульнось.

Ну, не думаю, что модульность зависит от того, как написан makefile.

авторПосоветуйте как сделать именно правильно. Что бы бабушка гордилась
Еще вдогонку - проект должен быть под 32 и 64 - как лучше поступить - сделать специальную цель для скажем 32 если я ожидаю, что большинство будет строить под 64 или держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать...

Безусловно надо делать одним файлом, а целевую платформу задавать конфигурацией сборки.
autotools для этого ВСЕГДА используют off-the-tree сборку -- сборку вне дерева исходников, каждая конфигурация -- в отдельном поддереве ФС.

На самом деле рекомендую не использовать голый Makefile, а использовать либо autotools, либо qmake, либо CMake.
CMake рекомендую больше всего.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285742
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
ifeq ($(platform),32)
sometool = tool32
else 
sometool = tool64
endif

%.compiled: %.source
    $(sometool) $< $@


А потом можешь запускать make platform=32. Но в 99% случаев у тебя будет в системе какая-нибудь переменная которая однозначно подскажет платформу и вручную ее почти никогда задавать никогда не нужно. Ну разве что если ты делаешь кросс-компиляцию и хост-платформа не совпадает с целевой.

LowCoderВопрос как лучше поступить - сделать основной Makefile в общей папочке и держать в каждой подпапочке свой Makefile и основной Makefile просто будет инклюдить все остальные и можно ожидать что они будут последовательно исполнятся. Только не инклудить а вызывать.
В случае инклуда у тебя будет последовательное исполнение одного единственного скрипта сборки. И его всегда надо будет вызывать из корневого каталога. А если делать независимые сценарии для каждого подпроекта плюс один сценарий с subdirs в корне проекта, то можно будет собирать любой кусок проекта независимо (или зависимо от других). Опять таки, читай главу 5.7, там есть примеры.

LowCoderили держать два Makefile каждый для своей платформы в отдельных подпапках или как? Или скрипты специальные строительные сделать...Если нужно (удобнее), то можно сделать. что-то в духе:
Код: plaintext
1.
2.
# win32.mak
someflags = abcd

Код: plaintext
1.
2.
# win64.mak
someflags = efgh

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
# makefile
ifeq ($(OS),Windows_NT)
include win32.mak
else 
include win64.mak
endif

all: a b c d
   tool $(someflags) $^


Но в таком разделении есть смысл только если платформо-зависимых флагов много и их удобнее держать в отдельных файлах.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285751
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 есть под все платформы и не привязан ни к одному транслятору.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285786
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285793
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovskyв хедере изменилась только дата файла

А что за злодей её изменил? cvs up вернёт её обратно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285820
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owl,

А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?Если ты мне объяснишь смысл этого желания я тебе объясню как это сделать.
По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285823
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovAnatoly Moskovskyв хедере изменилась только дата файла

А что за злодей её изменил? cvs up вернёт её обратно.
Дата может меняться по множеству причин, самая простая - внесли в текст изменения, потом вернули обратно.
И например, исходники в таком состоянии что нельзя делать ни коммит, ни апдейт.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285824
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать.
По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит.
А по-моему дата исходника никак не должна влиять на компиляцию - в ней не содержатся никакие данные от которых зависит содержимое конечного бинарника.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285827
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать.
Т.е. просто объяснить нельзя - необходимые опции в make добавятся только после моего объяснения ?
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285874
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owl,

А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?Но вообще-то, это сделать элементарно. Просто убери зависимость от заголовка и все.

А если все совсем плохо, и тебе надо убрать заголовок из уже объявленного списка заголовков, то filter-out спасет:
Код: plaintext
1.
2.
3.
4.
5.
ALL_HEADERS = a.h b.h c.h d.h
IGNORE = b.h d.h
HEADERS = $(filter-out $(IGNORE), $(ALL_HEADERS))

%.o: %.c $(HEADERS)
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285881
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl,

Наоборот, я хочу чтобы была зависимость от заголовка. Но не от его даты, а от содержимого.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285886
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlЕсли ты мне объяснишь смысл этого желания я тебе объясню как это сделать.
По моему, если дата заголовка изменилась, НАДО перекомпилировать все что от него зависит.
А по-моему дата исходника никак не должна влиять на компиляцию - в ней не содержатся никакие данные от которых зависит содержимое конечного бинарника.Дата исходника это главный источник ответа на вопрос: "изменился исходник или нет?"

Если ты хочешь вместо даты изменения файла проверять какой-то другой критерий (ну например есть реальная разница между рабочей копией исходника и архивной), то можно сделать первичную зависимость целей от специальных флаговых файлов а эти флаговые файлы уже создавать/трогать на основе диффа от рабочего исходника и архивной копии исходника.
Хотя зачем это все нужно я не представляю.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285909
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlДата исходника это главный источник ответа на вопрос: "изменился исходник или нет?"
Нет. Это просто суррогатный признак изменения содержимого, за неимением лучшего в make.

White OwlЕсли ты хочешь вместо даты изменения файла проверять какой-то другой критерий (ну например есть реальная разница между рабочей копией исходника и архивной), то можно сделать первичную зависимость целей от специальных флаговых файлов а эти флаговые файлы уже создавать/трогать на основе диффа от рабочего исходника и архивной копии исходника.
Да я понял уже, что make не умеет этого без костылей :)
White OwlХотя зачем это все нужно я не представляю.
Если я работаю над проектом и внес изменения в хедер от которого зависит большая часть проекта, а потом вернул обратно (или например переключился на другую ветку в контроле версий, а потом обратно - эффект такой же: даты файлов меняются, а содержимое нет), то я не хочу ждать перекомпиляции проекта, когда этого можно избежать. Проекты они знаете ли немаленькие бывают.
Да и вообще, мало ли что вы себе не представляете. Вселенная гораздо шире, чем ваш личный опыт :)
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285936
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlХотя зачем это все нужно я не представляю.
Если я работаю над проектом и внес изменения в хедер от которого зависит большая часть проекта, а потом вернул обратно (или например переключился на другую ветку в контроле версий, а потом обратно - эффект такой же: даты файлов меняются, а содержимое нет), то я не хочу ждать перекомпиляции проекта, когда этого можно избежать.Хорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние.

Anatoly MoskovskyДа и вообще, мало ли что вы себе не представляете. Вселенная гораздо шире, чем ваш личный опыт :)Ну вот и обогати мой опыт пожалуйста.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38285989
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlХорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние.
scons умеет и по дате и по содержимому зависимости строить.
White OwlНу вот и обогати мой опыт пожалуйста.
Я выше уже привел два кейса.
В прошлом у меня бывали и более жесткие кейсы. Например если контроль версий при чекауте устанавливает в локальных файлах дату из репозитория, и как часть сборки генерятся какие-то файлы, то периодически возникала ситуация когда сгенеренные файлы были новее новой версии файлов из которых они генерились.
Это уже конкретная проблема, а не неудобство, и она не заметна пока не наткнешься случайно на неверно работающий код.
К счастью Git с которым я сейчас работаю всегда при чекауте ставит текущую дату и не приходится извращаться в проектах где не используется scons.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286028
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlХорошо, показывай альтернативу make которая способна узнать что файл вернули в предыдущее состояние.
scons умеет и по дате и по содержимому зависимости строить.Не совсем корректная альтернатива. scons это не инструмент, а библиотека. Пользуясь которой можно написать программу сценария. Если хочешь корректно сравнивать scons и make, то бери makefile в котором каждое правило расписано через $(shell ...).
В принципе, у scons есть положительные моменты. И я бы его пожалуй попытался бы использовать если бы он не был написан на Питоне. Вот когда его перепишут на чем-либо более надежном тогда и будем брать его в реальную работу. А пока, при всех своих достоинствах и умениях scons это симпатичная идея напрочь убитая собственным фреймворком.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286031
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlscons это не инструмент, а библиотека.
Да-да, а когда вы в ком. строке набираете scons - это вы пишете код использующий эту библиотеку ?
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286044
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owlscons это не инструмент, а библиотека.
Да-да, а когда вы в ком. строке набираете scons - это вы пишете код использующий эту библиотеку ?Нет, набирая scons в командной строке я запускаю скрипт который подгружает файл SConstruct как модуль и выполняет его. А вот когда я пишу содержимое файла SConstruct - то да, я пишу программу на Питоне 2.4 использующей эту библиотеку. Да... А если у меня стоит Питон 3.2, то scons мрёт почти сразу. А если 2.6 то работает, но потом тоже мрёт. Потому что Питон не совместим сам с собой. Поэтому не смотря на все плюшки scons'а - я очень не советую использовать его в серьезных проектах.

Из более-менее серьезных альтернатив gnu make я могу назвать только makepp. Вернее это альтернатива для scons. Тот же самый принцип, только Перл вместо Питона и при этом полная обратная совместимость со стандартным make.
Единственный минус makepp - его малая известность.
Я сам, если честно, только документацию на него читал, да ради прикола несколько примеров попробовал. А на практике, привычка к make берет свое :)
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286059
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlкогда я пишу содержимое файла SConstruct - то да, я пишу программу на Питоне
Если вы пишете этот файл как программу на питоне, а не как декларативное описание сборки, то вы неверно используете scons.
Не удивительно, что у всех он работает, а у вас - нет.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286259
Фотография Анатолий Широков
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286430
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlMasterZivпропущено...
Чтобы совсем не стыдно было через 20 лет, надо правильно организовать сборку проекта на CMake.У CMake смысл только один - если ты будешь собирать проект в разных make'ах.
...
При этом, make есть под все платформы и не привязан ни к одному транслятору.

У cmake есть один смысл — он человеческий, в отличие от make, autotools и многого другого. И работает, в отличие от boostbuild и другого человеческого в этой области.

Вот в этом и смысл использовать его.
А про make под все платформы — это просто песня, ну так повеселил...

Во-первых, его нет. Т.е. он есть, но он везде разный. А во вторых, одним make ты нифига не соберешь, нужен shell и ещё много всякой всячины. А ее нет.

Вот за этим и нужен CMake.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286451
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНо на самом деле люди выбирающие CMake просто не умеют писать makefile.

Ты абсолютно прав.
Если бы ты знал, сколько раз я изучал make и благополучно забывал после того, как в нем терялась нужда...

Make — это абсолютно невменяемый тул,
У его существования есть только два оправдания — традиция, раньше ничего другого не было, и что он таки работает.

Кстати, я видал не раз, как люди просто писали скрипты сборки на шеле, чем связываться с make ом.

White OwlЯ абсолютно убежден что CMake (да и autotools) это ненужный костыль с гигантскими ограничениями.


Ты абсолютно неправ.
Как бы чтобы это доказать, достаточно поискать в сети проекты аналогичного назначения и прочитать мотивацию к их созданию.
Очень хорошо это написано в Ant е.
Почитай.
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286490
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite Owl,

А как просто в make сделать, что если в хедере изменилась только дата файла, то не надо перекомпилировать все что от него зависит?
...
Рейтинг: 0 / 0
Организовать оптимально Makefile
    #38286492
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlто filter-out спасет:
Код: plaintext
1.
2.
3.
4.
5.
ALL_HEADERS = a.h b.h c.h d.h
IGNORE = b.h d.h
HEADERS = $(filter-out $(IGNORE), $(ALL_HEADERS))

%.o: %.c $(HEADERS)



... который поддерживается только GNU Make-ом...
...
Рейтинг: 0 / 0
25 сообщений из 57, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Организовать оптимально Makefile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]