Итак, судя по критериям, изложенным в вопросе, система сборки, которая кажется наилучшим образом подходит, вероятно, waf - чистый Python, обеспечивает поддержку C++ и других языков, общий, мощный, а не DSL.
Однако, исходя из моего личного опыта, я предпочитаю CMake для проектов на C++. (Я попробовал CMake, SCons и waf, и понравился им примерно в таком порядке). CMake - общее решение, но у него встроенная поддержка C++, которая делает его более приятным, чем более общее решение, когда вы на самом деле выполняете C++.
Модель сборки CMake для C++ более декларативная и менее настоятельная, и, следовательно, для меня проще в использовании.Синтаксис языка CMake невелик, но декларативная сборка с нечетным синтаксисом превосходит обязательную сборку в Python. Из трех, CMake также, похоже, имеет лучшую поддержку «продвинутых» вещей, таких как предварительно скомпилированные заголовки. Настройка предварительно скомпилированных заголовков сократила время восстановления примерно на 70%.
Другие плюсы для CMake включают приличную документацию и значительное сообщество. Многие библиотеки с открытым исходным кодом имеют файлы сборки CMake либо в дереве, либо предоставляются сообществом CMake. Существуют крупные проекты, которые уже используют CMake (OGRE приходит на ум), а другие крупные проекты, такие как Boost и LLVM, находятся в процессе перехода на CMake.
Часть вопроса, который я обнаружил при экспериментировании с системами сборки, заключается в том, что я пытался создать плагин NPAPI на OS X, и выясняется, что очень мало систем сборки настроены так, чтобы XCode обеспечивало точное сочетание флагов для этого. CMake, признавая, что XCode является сложной и движущейся целью, обеспечивает крючок для ручной настройки команд в сгенерированных проектах XCode (и, я думаю, Visual Studio). Это очень хорошо, насколько я могу судить.
Независимо от того, строите ли вы библиотеку или приложение, вы также можете определить, какая система сборки лучше. Boost по-прежнему использует систему на основе Jam, отчасти потому, что она обеспечивает самую полную поддержку для управления типами сборки, которые сложнее, чем «Debug» и «Release». Большинство ускорительных библиотек имеют пять или шесть различных версий, особенно в Windows, предвосхищая людей, которым нужны совместимые библиотеки, которые связаны с различными версиями ЭЛТ.
У меня не было никаких проблем с CMake в Windows, но, конечно, ваш пробег может отличаться. Есть достойный графический интерфейс для настройки зависимостей сборки, хотя он неуклюже используется для перестроек. К счастью, есть также клиент командной строки. До сих пор я решил иметь тонкую оболочку Makefile, которая вызывает CMake из objdir; Затем CMake генерирует Makefiles в objdir, а исходный Makefile использует их для выполнения сборки. Это гарантирует, что люди не случайно ссылаются на CMake из исходного каталога и загромождают свой репозиторий. В сочетании с MinGW этот «сэндвич CMake» обеспечивает замечательную совместимость с кросс-платформенным построением!
Я смущен. Вы говорите: «ему не нужно поддерживать полный набор автоустановок». Означает ли это, что ваш вопрос следует перефразировать: «Какая следующая лучшая система сборки после autoconf/automake?» –
@William Pursell: Нет. Я явно отказываюсь от необходимости поддержки autoconf и automake, так как он настолько тесно связан с Makefiles. –
Я не вижу ничего плохого в исходном вопросе или в результате обсуждения. Учитывая, что этот вопрос теперь является ключевым поисковым движком для «лучшей системы сборки», этот вопрос следует вновь открыть. Я мог бы понять, как закрыть его, если обсуждение действительно было упрямо или если оно действительно привлекло спам, но это не так. – user1110743