Может ли cmake генерировать нерекурсивный make-файл? - PullRequest
13 голосов
/ 07 июля 2011

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

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

Ответы [ 3 ]

3 голосов
/ 18 декабря 2012

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

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


  1. Наилучшее предположение на основе find Torque3D/Engine -iname "<em>.c" -or -iname "</em>.cpp" -or -iname "*.h" | xargs dirname | sort -u | wc -l
3 голосов
/ 08 июля 2011

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

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

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

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

2 голосов
/ 14 июля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...