Может ли cmake генерировать нерекурсивный make файл?

Я занимаюсь cmake, и кажется, что он генерирует рекурсивные make файлы. Это означает, что в большом проекте пустая сборка может занять около 5 секунд, что действительно неприемлемо.

Я не нашел способ создания нерекурсивных make файлов с помощью cmake. Возможно ли это?

Ответ 1

Это невозможно с CMake, как есть.

Это может быть возможно путем изменения источника CMake... но я не уверен, насколько маленькой или большой, простой или сложной была бы такая задача.

Довольно уверен, что это займет больше 5 секунд. Даже умноженный на все пустые сборки, которые вы будете делать в ближайшие пару лет.

Если для вашей пустой сборки неприемлемо 5 секунд, какой порог является приемлемым? 1 секунда? 0,25 секунды? Просто любопытно - было много работы, чтобы максимально свести к минимуму время сборки для больших проектов.

Ответ 2

В то время как ответ остается неизменным для Makefile, последние версии (CMake 2.8.9, выпущенные 9 августа 2012 г.) включают генераторы Ninja, включенные по умолчанию. На относительно большой базе кода С++ (Torque3D - примерно 40M исходных файлов в примерно 241 каталоге 1) требуется в среднем ниндзя (с десяти прогонов) 0,14 секунды, чтобы решить, что ничего не остается делать, и требуется в среднем (опять же, с десяти прогонов) 2,55 секунды (раз по проекту, который уже был полностью построен, и ничего не осталось делать.)

Итак, CMake и Ninja могут быть хорошим вариантом для вас, если вы обнаружите, что Make слишком медленный. Вы упомянете Tup в ответе. Кажется, что ниндзя имеет аналогичные цели для Tup.


  • Лучшее предположение, основанное на find Torque3D/Engine -iname ".c" -or -iname ".cpp" -or -iname "*.h" | xargs dirname | sort -u | wc -l

Ответ 3

CMake использует рекурсивный make, потому что он должен. CMake - это общий инструмент и должен генерировать информацию о взаимозависимости на лету. Чтобы быть совместимым с make (а не только gmake), вы должны использовать рекурсивный make, чтобы иметь возможность сделать это. CMake также поддерживает несколько уровней генераторов кода. Можно было бы написать генератор tup для CMake. Существует некоторая работа для CMake и ниндзя. Тем не менее, с генератором простой генерации нет возможности сделать то, что делает CMake без некоторого уровня рекурсивного make.

"Я не считаю, что CMake" должен был использовать рекурсивный ". Если вы можете создать make файл, который не является рекурсивным, и работает с более чем gmake, и может вычислять информацию о взаимозависимости на лету, тогда это окажется неправильным, Мы потратили немало времени, пытаясь сделать его не рекурсивным. Он" меньше" рекурсивный, чем раньше.

Брэд Кинг создал запись в FAQ, в которой описывается, как make используется в CMake:

http://www.cmake.org/Wiki/CMake_FAQ#Why_does_CMake_generate_recursive_Makefiles.3F