Mxx_ru -- это кросс-платформенный инструмент управления компиляцией и сборкой проектов, реализованный на языке Ruby. Ориентирован, в первую очередь на C/C++, но может быть адаптирован для других языков. Mxx_ru построен как набор шаблонов для наиболее распространенных типов целей. Например, проектный файл для сборки HelloWorld в Mxx_ru выглядит как:
Mxx_ru предназначен для C/C++ разработчиков, которым необходимо разрабатывать кросс-платформенные проекты. Проекты, которые приходится компилировать разными компиляторами на разных платформах. В этом случае Mxx_ru позволяет использовать один и тот же проектный файл на всех платформах и для всех компиляторов.
Где взять и как установить Mxx_ru
Mxx_ru оформлен в виде RubyGem-а. Поэтому для его загрузки и инсталляции достаточно всего лишь дать команду:
gem install -r mxx_ru
После этого нужно настроить Mxx_ru для своей платформы/компилятора, установив соответствующим образом переменную среды MXX_RU_CPP_TOOLSET. Например:
Методы composite_target, exe_target, dll_target, lib_target.
Возможность устанавливать значения по умолчанию для runtime_mode, rtti_mode, rtl_mode, threading_mode.
Изменены правила управления PDB-файлами при компиляции Visual C++ в DEBUG-режиме.
Улучшено удаление промежуточных результатов компиляции Visual C++ (.exp-файлы).
Добавлена поддержка манифестов Visual C++ 8.0.
Благодарности
Огромное спасибо Михаилу Лёсину за неоценимую помощь в переводе Mxx_ru на английский язык и подготовку версии 1.1.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Re: [ANN] Mxx_ru v.1.1
От:
Аноним
Дата:
10.04.06 07:32
Оценка:
Здравствуйте, eao197, Вы писали:
E>Вышла версия 1.1 build-системы Mxx_ru
Такой вопрос: чем он лучше scons, cmake, ..., autotools наконец? Сейчас выбираю систему для сборки проекта и пока остановился на autotools, т.к. в сумме он мне кажется более приемлемым вариантом, чем прочие, вышеперечисленные.
E>>Вышла версия 1.1 build-системы Mxx_ru
А>Такой вопрос: чем он лучше scons, cmake, ..., autotools наконец? Сейчас выбираю систему для сборки проекта и пока остановился на autotools, т.к. в сумме он мне кажется более приемлемым вариантом, чем прочие, вышеперечисленные.
Он интуитивно понятен, не требует длительного изучения для своего применения, даже весьма продвинутые скрипты проектов легко читаются новичком не обладающим глубокими знаниями ни о руби, ни о mxx_ru, и при этом очень гибок за счет того что используется не набор статических конструкций и макросов, а полноценный язык — а это значит что позволяет решить практически любую задачу связанную с построением без каких-либо проблем.
Здравствуйте, Аноним, Вы писали:
E>>Вышла версия 1.1 build-системы Mxx_ru
А>Такой вопрос: чем он лучше scons, cmake, ..., autotools наконец? Сейчас выбираю систему для сборки проекта и пока остановился на autotools, т.к. в сумме он мне кажется более приемлемым вариантом, чем прочие, вышеперечисленные.
С autotools ты будешь хорошо себя чувствовать только в Unix-овом окружении. Как только потребуется работать с Windows не через GNU/Cygwin инструменты, то...
CMake, насколько я знаю, это генератор makefile. Он сам не управляет процессом сборки.
SCons -- это да, серьезная альтернатива. Но, мне показалось, что сложные проекты (включающие в себя несколько композитных подпроектов) описывать в mxx_ru проще. Кроме того, в mxx_ru специально закладывались для C++ такие фишки, как:
— upspread опции (т.е., если какой-то проект требует, чтобы все, кто его используют определяли define SOME_PROJECT_IN_DLL, то такой define объявляется как upspred-опция и автоматически устанавливается для всех проектов, которым это действительно нужно);
— централизованный контроль за такими режимами, как multithreading, rtl (shared/static) и rtti (enabled/disabled);
— имхо, расширяется mxx_ru проще (за счет Ruby), чем Python-овский SCons.
Пока mxx_ru менее наворочен, чем SCons или Boost.Build.v2, предоставляет меньше готовых настроек. Но, он и гораздо моложе. А так же у mxx_ru русскоязычные разработчики, с которыми проще обсудить проблемы и высказать замечания/предложения. Так что обращайтесь
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, mlesin, Вы писали:
E>>>Вышла версия 1.1 build-системы Mxx_ru
А>>Такой вопрос: чем он лучше scons, cmake, ..., autotools наконец? Сейчас выбираю систему для сборки проекта и пока остановился на autotools, т.к. в сумме он мне кажется более приемлемым вариантом, чем прочие, вышеперечисленные.
M>Он интуитивно понятен, не требует длительного изучения для своего применения, даже весьма продвинутые скрипты проектов легко читаются новичком не обладающим глубокими знаниями ни о руби, ни о mxx_ru, и при этом очень гибок за счет того что используется не набор статических конструкций и макросов, а полноценный язык — а это значит что позволяет решить практически любую задачу связанную с построением без каких-либо проблем.
---
кроме того (простите доку читал по диагонали -- мож чо и пропустил -- поправьте еси я ошибаюсь):
*) ничо не заметил про создание tarballов из сорцов
*) а также про инсталляцию
*) а также про эмуляцию какоголибо подобия autoconf (или интеграцию с последним) -- рулить странными переменными окружения не зачот! (это и пользователь пакета тоже должен делать??)
*) где (тяжело ли сделать) аналог `make check`? -- я привык юнит-тесты компилять in that way... -- make distcheck потом сделает комплексную проверку моего дистра
*) ну и наконец руби не мега распространенная весчь -- требует доп инсталляции и неопределенного числа телодвижений -- а пользователю чтоб собрать мой пакет тоже нада руби иметь???
*) как бы вы не хотели скрипты не выглядят "интуитивно понятно"... -- после беглого просмотра складывается ощющение что читать таки придется и много... но функционал не подрывает все бросить и забив на autotoolsы заняться изучением...
Уже проще. Т.к. я нигде не указываю, от каких конкретно библиотек зависит моя DLL-ка. И от каких библиотек зависят библиотеки, от которых зависит моя DLL. При компиляции под Windows ко мне будут прилинкованны только непосредственно используемые мной статическе библиотеки и библиотеки импорта. А под Unix-ом будет прилинкованы все библиотеки, нужные моей DLL. Вне зависимо от уровня косвенности.
И еще один момент, в таком скрипте mxx_ru проконтролирует совместимость выставленных режимов компиляции.
И еще один момент, сменить расположение результатов компиляции/линковки ничего не изменяя ни в самом проекте, ни в одном из подпроектов.
Z>кроме того (простите доку читал по диагонали -- мож чо и пропустил -- поправьте еси я ошибаюсь): Z>*) ничо не заметил про создание tarballов из сорцов Z>*) а также про инсталляцию
А вот это пока авторам mxx_ru не нужно было, поэтому и не сделали.
Если расскажите, что к чему и как бы вам хотелось это видеть -- то почему бы и не реализовать?
Z>*) а также про эмуляцию какоголибо подобия autoconf (или интеграцию с последним) -- рулить странными переменными окружения не зачот! (это и пользователь пакета тоже должен делать??)
Рулить нужно только одной переменной
И, например, мне приходится много работать под Windows, сразу с несколькими компиляторами. autoconf здесь отдыхает по полной.
А вот на счет интеграции с autoconf мысли есть.
Z>*) где (тяжело ли сделать) аналог `make check`? -- я привык юнит-тесты компилять in that way... -- make distcheck потом сделает комплексную проверку моего дистра
Вот пример того, как у меня строятся тесты для SObjectizer: отдельный файл test/build_tests.rb:
Файлы с расширением .ut.rb -- это unit-тесты, mxx_ru их после компиляции запускает и останавливает процесс, если какой-то unit-тест завершается не нормально.
Z>*) ну и наконец руби не мега распространенная весчь -- требует доп инсталляции и неопределенного числа телодвижений -- а пользователю чтоб собрать мой пакет тоже нада руби иметь???
Да.
А если в качестве build-системы использовать SCons, то Python.
И делу мегараспространения Ruby я (и не только я) здесь активно способствую. Так что со временем Ruby уже не будет экзотикой.
И вообще, в исходном сообщении было сказано, что mxx_ru нужен разработчикам, которые занимаются кросс-платформенной (не Unix-only) разработкой. Если кому-то вполне устраивает использование только GNU инструментов (ну повезло, можно позавидовать только), то нет проблем -- GNU make/GNU autotools уготована еще долгая жизнь.
Z>*) как бы вы не хотели скрипты не выглядят "интуитивно понятно"... -- после беглого просмотра складывается ощющение что читать таки придется и много... но функционал не подрывает все бросить и забив на autotoolsы заняться изучением...
Функционал -- это как пословица: "Были бы кости, мясо наростет". Кости есть.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Здравствуйте, zaufi, Вы писали:
Z>>а можно пример "весьма продвинутого скрипта"??
E>Например, вот таким скриптом настраивается компиляция ACE.
<skip>
УЖОС! -- мои Makefile.am даже в очень сложных случаях (чего тока не было за 6 лет) выглядят куда проще и интуитивно понятнее
E>Ну это и не проще. А вот, например:
<skip>
E>Уже проще. Т.к. я нигде не указываю, от каких конкретно библиотек зависит моя DLL-ка. И от каких библиотек зависят библиотеки, от которых зависит моя DLL. При компиляции под Windows ко мне будут прилинкованны только непосредственно используемые мной статическе библиотеки и библиотеки импорта. А под Unix-ом будет прилинкованы все библиотеки, нужные моей DLL. Вне зависимо от уровня косвенности.
??? смишно! -- тоесь еси я пишу:
extern try_to_find_this_megafunction_at_link_stage(int);
int main()
{
try_to_find_this_megafunction_at_link_stage(123);
return 0;
}
мне ничо не нада никому указывать??? -- еси так, тада вы гении ребята!
или всетки require_project это оно и есь?? -- тада разочарую вас -- открытый вами велосипед уже давно применяется даже в автотулайзнутых пакетах... (хотите знать больше?
насчет UNIXовой фичи (про библы) -- c `man libtool`
E>И еще один момент, в таком скрипте mxx_ru проконтролирует совместимость выставленных режимов компиляции.
не нужно просто разбрасывать флаги компиляции по всем мэйкам -- если сделать один конфигурационный скрипт который определит какие нужно флаги (и библы за одно) и пробъет их во все мэйкфайлы таких проблем не буит... (автоконфовский подход в этом месте куда более удобен на мой взгляд) -- конфигурационная инфа вычисляется 1 раз! а не в каждом подкаталоге при каждой сборке...
E>И еще один момент, сменить расположение результатов компиляции/линковки ничего не изменяя ни в самом проекте, ни в одном из подпроектов.
сомнительная фича. я не догоняю зачем менять расположение результата компиляции? кому какая разница как оно умя там компилица -- главное куда все это проинсталлица после `make install` -- и что собсно проинсталлица...
Z>>кроме того (простите доку читал по диагонали -- мож чо и пропустил -- поправьте еси я ошибаюсь): Z>>*) ничо не заметил про создание tarballов из сорцов Z>>*) а также про инсталляцию
E>А вот это пока авторам mxx_ru не нужно было, поэтому и не сделали. E>Если расскажите, что к чему и как бы вам хотелось это видеть -- то почему бы и не реализовать?
хочется как во всех нормальных пакетах иметь аналог `make install` -- который пройдясь по подкаталогам пакета проинсталлит (чо там описано куда инсталлить) все необходимые файлы... а по `make uninstall` снесет все это...
Z>>*) а также про эмуляцию какоголибо подобия autoconf (или интеграцию с последним) -- рулить странными переменными окружения не зачот! (это и пользователь пакета тоже должен делать??)
E>Рулить нужно только одной переменной E>И, например, мне приходится много работать под Windows, сразу с несколькими компиляторами. autoconf здесь отдыхает по полной.
смишно! -- хотите знать больше? (c)
E>А вот на счет интеграции с autoconf мысли есть.
главное что хотелось бы видеть чтоб mxx не брал на ся слишком много... -- пусь он доверит автоконфу задачу определения того в каком окружении мы запускаемся, какие тулзы нам нужны для работы (компиляции) -- где они находятся и как их запускать
задача mxx сводится к трэканию зависимостей внутри пакета и обеспечению сборки его компонент (позволя лишь тюнить то что наопределял автоконф) стремясь предоставить пользователю гибкость (и простоту) настройки данной сборки а также установки этого пакета (и создание тарбола -- ибо исходники из VCS будучи заархивированными не всегда (а зачастую никогда) не являются тем что должен получать пользователь пакета для последующей компиляции)
Z>>*) где (тяжело ли сделать) аналог `make check`? -- я привык юнит-тесты компилять in that way... -- make distcheck потом сделает комплексную проверку моего дистра
E>Вот пример того, как у меня строятся тесты для SObjectizer: отдельный файл test/build_tests.rb:
<skip>
я предпочитаю иметь _маленькие_ (а чего там может быть большого описать построение бинарника из нескольких cpp файлов) Makefile.am _рядом_ с кодом юниттестов (который в свою очередь находится _рядом_ с тестируемым кодом) -- меньше теложвижений... а будучи рекурсивным targetом по `make check` мне построятся все тесты где бы они не находились вглубь от места запуска...
Z>>*) ну и наконец руби не мега распространенная весчь -- требует доп инсталляции и неопределенного числа телодвижений -- а пользователю чтоб собрать мой пакет тоже нада руби иметь???
E>Да. E>А если в качестве build-системы использовать SCons, то Python. E>И делу мегараспространения Ruby я (и не только я) здесь активно способствую. Так что со временем Ruby уже не будет экзотикой.
E>И вообще, в исходном сообщении было сказано, что mxx_ru нужен разработчикам, которые занимаются кросс-платформенной (не Unix-only) разработкой. Если кому-то вполне устраивает использование только GNU инструментов (ну повезло, можно позавидовать только), то нет проблем -- GNU make/GNU autotools уготована еще долгая жизнь.
да ради Бога... смущает только то что например в проекте для Lunix, Solaris, Windows система сборки должна следовать Windows-way (тоесь в основном наследовать странности этого подхода) а не более традиционному ./configure && make && make install ... -- *NIX like систем тут 2 а винда тока одна
Z>>*) как бы вы не хотели скрипты не выглядят "интуитивно понятно"... -- после беглого просмотра складывается ощющение что читать таки придется и много... но функционал не подрывает все бросить и забив на autotoolsы заняться изучением...
E>Функционал -- это как пословица: "Были бы кости, мясо наростет". Кости есть.
можит тут и есь мегапотенциал в расширяемости... но все это смахивает пока на overkill (т.е. из пушки по воробьям) -- нада делаться проще... даже проще чем автотулзы!!! -- уж не спрашивайте как
тогда есь какойта шанс завоевать разработчиков -- а пока я не встречал таких проектов в которых нельзя былоб обойтись автотулзами... единстно чо раздражает чо в бальших проектах конфигурение занимает раздражающе долгое время... и либтул при инсталляции хотелось бы пошустрее чтоб все это делал...
а вообще я чесно гря слабо представляю как можно сделать единую среду для управления пакетами в Win и *NIX котоыре имеют довольно разные к этому подходы...
Здравствуйте, zaufi, Вы писали:
Z>УЖОС! -- мои Makefile.am даже в очень сложных случаях (чего тока не было за 6 лет) выглядят куда проще и интуитивно понятнее
Можно посмотреть?
Z>мне ничо не нада никому указывать??? -- еси так, тада вы гении ребята!
За такие слова при личном общении мог последовать прямой правый в голову.
Вы здесь поерничать собрались? Или же поговорить нормально? На нормальном русском языке, с нормальными вменяемыми коллегами. Если так, то давайте так и разговаривать.
По поводу приведенного примера. Нет, фишка в другом:
В проектном файле для superpuper нужно указать только require_prj 'powerful/prj.rb'. И все, к superpuper будут прилинкованы libbase.a, libuseful.so, libpowerful.so.
Z>или всетки require_project это оно и есь?? -- тада разочарую вас -- открытый вами велосипед уже давно применяется даже в автотулайзнутых пакетах... (хотите знать больше?
Да. С примерами пожалуйста. Собственными.
E>>И еще один момент, в таком скрипте mxx_ru проконтролирует совместимость выставленных режимов компиляции. Z>не нужно просто разбрасывать флаги компиляции по всем мэйкам -- если сделать один конфигурационный скрипт который определит какие нужно флаги (и библы за одно) и пробъет их во все мэйкфайлы таких проблем не буит... (автоконфовский подход в этом месте куда более удобен на мой взгляд) -- конфигурационная инфа вычисляется 1 раз! а не в каждом подкаталоге при каждой сборке...
В каждом подкаталоге при каждой сборке -- это подход make, если не ошибаюсь. mxx_ru позволяет не задавать общий конфиг для проекта. Он позволяет каждому подпроекту настроить параметры не задумываясь, с кем придется дружить в одном общем проекте. А тому, кто объединяет все это дело в одном месте не придется делать общий конфиг. Зато он будет уверен, что либы, скомпилированные в режиме single threading не будут слинкованы с либами, скомпилированными в multi threading.
E>>И еще один момент, сменить расположение результатов компиляции/линковки ничего не изменяя ни в самом проекте, ни в одном из подпроектов. Z>сомнительная фича. я не догоняю зачем менять расположение результата компиляции? кому какая разница как оно умя там компилица -- главное куда все это проинсталлица после `make install` -- и что собсно проинсталлица...
Кому сомнительная, а кому-то очень нужная. Например, иметь в одном каталоге проект, скомпилированный в RELEASE и в DEBUG режимах.
Речь сейчас не о make install и не об исталляции чужой либы на своем компьютере, а о разработке своего проекта.
А еще бывают разработчики, кому нужно одновременно иметь скомпилированные версии в RELEASE и DEBUG, с поддержкой UNICODE и без нее, с оформлением собственных библиотек в виде DLL или в виде статических библиотек.
Z>>>кроме того (простите доку читал по диагонали -- мож чо и пропустил -- поправьте еси я ошибаюсь): Z>>>*) ничо не заметил про создание tarballов из сорцов Z>>>*) а также про инсталляцию
E>>А вот это пока авторам mxx_ru не нужно было, поэтому и не сделали. E>>Если расскажите, что к чему и как бы вам хотелось это видеть -- то почему бы и не реализовать? Z>хочется как во всех нормальных пакетах иметь аналог `make install` -- который пройдясь по подкаталогам пакета проинсталлит (чо там описано куда инсталлить) все необходимые файлы... а по `make uninstall` снесет все это...
Понятно.
Z>>>*) а также про эмуляцию какоголибо подобия autoconf (или интеграцию с последним) -- рулить странными переменными окружения не зачот! (это и пользователь пакета тоже должен делать??)
E>>Рулить нужно только одной переменной E>>И, например, мне приходится много работать под Windows, сразу с несколькими компиляторами. autoconf здесь отдыхает по полной. Z>смишно! -- хотите знать больше? (c)
Да.
E>>А вот на счет интеграции с autoconf мысли есть. Z>главное что хотелось бы видеть чтоб mxx не брал на ся слишком много... -- пусь он доверит автоконфу задачу определения того в каком окружении мы запускаемся, какие тулзы нам нужны для работы (компиляции) -- где они находятся и как их запускать
А вы знаете, что берет на себя mxx_ru?
Может сначала попробуете?
Z>>>*) где (тяжело ли сделать) аналог `make check`? -- я привык юнит-тесты компилять in that way... -- make distcheck потом сделает комплексную проверку моего дистра
Z>я предпочитаю иметь _маленькие_ (а чего там может быть большого описать построение бинарника из нескольких cpp файлов) Makefile.am _рядом_ с кодом юниттестов (который в свою очередь находится _рядом_ с тестируемым кодом) -- меньше теложвижений... а будучи рекурсивным targetом по `make check` мне построятся все тесты где бы они не находились вглубь от места запуска...
А если какие-то нужно запретить для построение и запуска?
И если результаты компиляции нужно куда-то в другое место складывать?
Кроме того, это же язык программирования! Продвинутый язык.
Z>да ради Бога... смущает только то что например в проекте для Lunix, Solaris, Windows система сборки должна следовать Windows-way (тоесь в основном наследовать странности этого подхода) а не более традиционному ./configure && make && make install ... -- *NIX like систем тут 2 а винда тока одна
Вот интересно, autotools и make уже давно существуют, стандарт практически. А все равно кого-то не устраивает. Настолько не устраивает, что одни пишут, а другие используют инструменты вроде SCons, CMake, MPC, Boost.Build, Ant, A-A-P и Mxx_ru. Может не все так ладно в датском королевстве?
И, если посмотерть внимательно, компиляция проекта в Windows через ruby (или даже через SCons или Boost.Build) -- это совсем даже не Windows-way.
Z>а вообще я чесно гря слабо представляю как можно сделать единую среду для управления пакетами в Win и *NIX котоыре имеют довольно разные к этому подходы...
Ну посмотрите со временем на такие вещи, как SCons, Boost.Build, MPC и, я надеюсь, mxx_ru.
Что-то из этого обязательно получится.
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>...А чем оно лучше Rake? По виду — несколько сложнее
У них разные подходы к проблеме.
Какой из них удобнее — выбирать Вам. =)
Rake основан на формировании правил, по сути таких же, как и в make файлах, с разницей только в более удобном(возможно) синтаксисе.
Mxx_ru же предлагает совсем другой подход к проблеме — шаблонно-ориентированый. И хотя в нем тоже есть возможность задавать простые правила — это скорее мера для преодоления возможных непредусмотренных шаблонами действий, чем основной инструмент.
Здравствуйте, Зверёк Харьковский, Вы писали:
ЗХ>...А чем оно лучше Rake?
Тем, что Rake -- это тот же make, только в Ruby синтаксисе
А Mxx_ru -- это набор шаблонов для описания проектов. Что-то вроде Ant, только в виде Ruby программ. Соответственно, в make нужно описывать, что из чего и как нужно получить. А в mxx_ru -- что и из чего. А вот как -- это уже задача mxx_ru.
ЗХ>По виду — несколько сложнее
require 'rake/clean'
CLEAN.include('*.o')
CLOBBER.include('hello')
task :default => ["hello"]
SRC = FileList['*.c']
OBJ = SRC.ext('o')
rule '.o' => '.c'do |t|
sh "cc -c -o #{t.name} #{t.source}"end
file "hello" => OBJ do
sh "cc -o hello #{OBJ}"end# File dependencies go here ...
file 'main.o' => ['main.c', 'greet.h']
file 'greet.o' => ['greet.c']
При этом мы привязаны к конкретному компилятору, к конкретному режиму компиляции (выше используется и не RELEASE (нет -O2) и не DEBUG (нет -g)) и сами должны перечислять зависимости для main.c.
А вот так тот же самый пример выглядел бы на mxx_ru:
т.к. в основном я буду пользовать mmx_ru для сборки С++ проектов, то было бы удобно если бы данный модуль подгружался автоматов,
конечно -rlibrary спасает, но это костыль.
Mxx_ru::Cpp::exe_target
Тоже давольно устрашающе выглядет, на мой взгляд имя для таргета могло бы быть и по дружелюбней, например build_program,
конечно зная ruby костыли и подпорки прикрутить не сложно, но все же.
Здравствуйте, megawatt, Вы писали:
M>Несколько смущает синтаксический оверхед:
M>require 'mxx_ru/cpp'
M>т.к. в основном я буду пользовать mmx_ru для сборки С++ проектов, то было бы удобно если бы данный модуль подгружался автоматов, M>конечно -rlibrary спасает, но это костыль.
От этого можно избавиться только одним способом: запускать ruby-скрипт (который где-то в PATH-е валяется), а уже ruby скрипт будет искать файл с нужным именем и запускать его. По аналогии с подходом SCons.
Например, само описание проекта:
Mxx_ru::Cpp::exe_target( 'hello.rb' ) { ... }
запускается как:
$ mxx_ru hello.rb --mxx-cpp-release
Но мне больше нравится запускать компиляцию вообще вот так:
$ hello.rb --mxx-cpp-relese
а для этого как раз require 'mxx_ru/cpp' писать нужно.
Ну и кроме того, такой явный require может со временем позволить более спокойно переходить на новые версии Mxx_ru. Скажем:
и использовать в одном проекте разные проектные файлы, которые требуют разные версии Mxx_ru.
M>Mxx_ru::Cpp::exe_target
M>Тоже давольно устрашающе выглядет, на мой взгляд имя для таргета могло бы быть и по дружелюбней, например build_program, M>конечно зная ruby костыли и подпорки прикрутить не сложно, но все же.
Имхо, разница между exe_target и build_program -- это дело вкуса. К тому же, с точки зрения реальной работы Mxx_ru, exe_target более точно отражает суть происходящего: описание цели, которая будет являтся исполнимым файлом. Само простроение цели не выполняется, поэтому название build_program не точно.
Забавно, что настоящий оверхед, который пока существует, ты и не указал. У меня require 'mxx_ru/cpp' и Mxx_ru::Cpp::*_target() пишутся уже на автомате. А вот необходимость указывать в качестве псевдонима цели само имя файле -- вот это действительно и оверхед и просчет. Но, надеюсь, скоро можно будет писать так:
Здравствуйте, Зверёк Харьковский, Вы писали:
E>>Вышла версия 1.1 build-системы Mxx_ru
ЗХ>...А чем оно лучше Rake?
Кстати еще по поводу лучше/хуже. Вот небольшая статистика об объемах проектов, в которых Mxx_ru применяется для управления компиляцией. Это три самых крупных проекта:
В первом 872 *.cpp файла и 74 проектных (prj.rb) файла (проект портирован под Window, Linux, NonStop).
Во втором 1124 *.cpp файла и 121 проектный (prj.rb) файл (только под Windows).
В третьем, самом крупном, 1181 *.cpp файл и 188 проектных (prj.rb) файлов (проект портирован под Windows, Linux, Solaris).
В каждом из проектов есть один build.rb из которого прямо или косвенно подгружаются практически все проектные файлы в проекте. И на все подпроекты таким образом распространяются общие глобальные настройки, а так же проверяется согласованность настроект подпроектов. Так же Mxx_ru отслеживает include-зависимости у всех *.cpp файлов.
Так что, не знаю, как Rake на подобных объемах
А вот Mxx_ru может не только HelloWorld компилировать, это проверено
ЗХ>По виду — несколько сложнее
Сейчас в svn-репозитории в branches/1.1.1 следующая версия готова (тестируется перед релизом), так в ней использование Mxx_ru еще больше упрощено. Например, файл какой-нибудь проектный файл fast/renderer/prj.rb может выглядеть так:
require 'mxx_ru/cpp'
Mxx_ru::Cpp::dll_target { # Не нужно больше указывать псевдоним проектного файла.
target( 'fast.renderer' )
# Все C++ файлы из fast/renderer с подкаталогами одним движением руки.
cpp_sources Dir.glob( 'fast/renderer/**/*.cpp' )
}
А запуск компиляции всех подпроектов какого-то проекта (файл build.rb):
require 'mxx_ru/cpp'
Mxx_ru::Cpp::composite_target( Mxx_ru::BUILD_ROOT ) {
# Все подпроекты компилируются через свои prj.rb файлы.
required_prjs Dir.glob( '**/prj.rb' )
}
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Здравствуйте, eao197, Вы писали:
E>Вышла версия 1.2 build-системы Mxx_ru
Что нового
Исправлено несколько ошибок в работе с MinGW и Borland C++.
Аргумент prj_alias для методов exe_target, lib_target, dll_target, composite_target теперь опциональный и выводится автоматически из имени проектного файла. Это позволило избавится от дублирования имени проектного файла внутри самого проектного файла. Т.е. вместо:
Добавлены методы required_prjs, c_sources, cpp_sources, который получают в качестве аргумента Enumerable (т.е. сразу несколько значений). Это позволяет писать так:
. Этот проектный файл сначала находит все файлы unit-тестов и добавляет их в список проектов для построения, а затем находит проекты, которые не являются unit-тестами (для таких проектов есть prj.rb, но рядом нет prj.ut.rb).
Добавлены аргументы --mxx-brief-show, --mxx-brief-hide, которые включают/выключают печать краткого описания выполняемого действия (т.к. 'Compilling hello.c...', 'Building hello.exe...').
Установка и/или обновление
Для обновления уже установленной версии Mxx_ru нужно воспользоваться командой:
gem update Mxx_ru
Для установки новой версии Mxx_ru (когда предыдущей копии не было) нужно воспользоваться командой:
gem install -r Mxx_ru
Благодарности
Константину Назарову (rut at users dot sourceforge dot net)
И всем, кто в обсуждении Mxx_ru высказывался по поводу синтаксического оверхеда
SObjectizer: <микро>Агентно-ориентированное программирование на C++.
Наверное имеет смысл предоставить пользователю возможность переопределения расширения таргета в Mxx_ru. Сейчас такой нет. Например при компиляции плагинов для Maya компилятся обычные dllки, но расширение у них должно быть — mll.
Предлагаю ввести переменные с областью действия ограниченной текущим проектом (без наследований, и заполненные автоматом самим mxx_ru по дефолту) типа exe_ext, dll_ext, lib_ext, которые пользователь может изменить если захочет.
Здравствуйте, mlesin, Вы писали:
M>Наверное имеет смысл предоставить пользователю возможность переопределения расширения таргета в Mxx_ru. Сейчас такой нет. Например при компиляции плагинов для Maya компилятся обычные dllки, но расширение у них должно быть — mll. M>Предлагаю ввести переменные с областью действия ограниченной текущим проектом (без наследований, и заполненные автоматом самим mxx_ru по дефолту) типа exe_ext, dll_ext, lib_ext, которые пользователь может изменить если захочет.
В branches/1.3 реализован метод target_ext, который позволяет изменять расширение цели. Для примера с Maya его использование может выглядеть так:
В branches/1.3 реализован еще один тип CustomSubdirObjPlacement -- позволяет задать отдельно каталог для расположения финальных результатов компиляции (exe/dll/lib/so/a) и отдельно каталог для промежуточных (obj/o/res).
Например, если в проекте указать:
Mxx_ru::Cpp::composite_target {
global_obj_placement Mxx_ru::Cpp::CustomSubdirObjPlacement.new(
# Final resuls going here.'bin32',
# All intermediate files going here.'tmp/output32' )
required_prj ...
}
В branches/1.3 реализован дополнительный режим обработки C/C++ проектов.
Если в командной строке указать аргумент --mxx-cpp-extract-options, то вместо построения цели будет распечатаны опции компилятора/линкера, которые будут использоваться при компиляции/линковки. Эта возможность предназначена для случаев, когда результат компиляции через Mxx_ru нужно использовать в другой build-системе: другой build-системе придется явно указывать все опции, неявно вычисляемые Mxx_ru.
Например, если взять пример из дистрибутива SObjectizer