2011-07-07 11 views
12

Estoy incursionando con cmake, y parece que genera makefiles recursivos. Lo que significa que en un proyecto grande, la construcción vacía puede demorar unos 5 segundos, lo cual es realmente inaceptable.¿Se puede generar un makefile no recursivo?

No he encontrado la forma de generar makefiles no recursivos con cmake. ¿Es posible?

Respuesta

3

No es posible con CMake, como está.

Puede ser posible modificando la fuente de CMake ... pero no estoy seguro de cuán pequeña o grande, simple o compleja sería esa tarea.

Bastante seguro que tomaría más de 5 segundos, sin embargo. Incluso multiplicado en todas las compilaciones vacías que harás en los próximos años.

Si 5 segundos son inaceptables para su compilación vacía, ¿qué umbral es aceptable? ¿1 segundo? 0.25 segundos? Es curioso: se ha trabajado mucho para minimizar al máximo el tiempo de construcción vacío para grandes proyectos.

+6

El umbral de construcción vacía es "imperceptible", por lo menos de un segundo es probablemente correcto. Hay buenas herramientas de compilación que pueden lograr eso para un gran proyecto razonable. Incluso los makefiles no recursivos simples pueden hacerlo. 5 segundos para una compilación vacía es una locura, no entiendo por qué en la tierra 'cmake' decidió emitir makefiles recursivos en primer lugar (tiene sentido para proyectos pequeños, pero de nuevo, para proyectos pequeños no lo haces necesita 'cmake'. Ver' tup' donde build vacía para una distribución completa de Linux es menor que '.5' segundos. –

2

CMake utiliza la marca recursiva porque tiene que hacerlo. CMake es una herramienta general y tiene que generar información dependiente sobre la marcha. Para ser compatible con make (no solo gmake), debe usar make recursivo para poder hacer eso. CMake también admite múltiples niveles de generadores de código. Uno podría escribir potencialmente un generador de tup para CMake. Se está trabajando para CMake y ninja. Sin embargo, con el generador de creación simple no hay forma de hacer lo que CMake hace sin algún nivel de marca recursiva.

"No creo que CMake" tuviera que "usar recursivo" Si puede crear un archivo MAKE que no es recursivo y funciona con más de gmake, y puede calcular información dependiente sobre la marcha, entonces lo probaría incorrecto. Pasamos bastante tiempo intentando que no sea recursivo. Es "menos" recursivo que solía ser.

Brad King ha creado una entrada en Preguntas que describe la manera maquillaje se utiliza en CMake:

+4

No me convenciste.Incluso simple, viejo hace soporte 'a.o: a.c; a.exe: a.o b.a; b.o: b.c; b.a: b.o'. No veo ninguna razón por la cual no se puede hacer. –

+2

No creo que CMake 'tuviera que' usar recursivo. Creo que lo hicieron porque es más fácil de implementar. Me ha llevado 2 días doblar hacer para invocar una vez, encontrar fuente y volcar objetos en una sola ubicación fuera de la fuente: sería de 1/2 día para una invocación recursiva a la marca. – Oliver

+0

Al leer las preguntas frecuentes de CMake, aclara lo que significa hacer recursivamente. No es recursivo en el sentido tradicional, es decir, cada subdirectorio tiene su propio archivo MAKE. Pero es más bien una recursión de 3 niveles que parece generar dependencias de compilación en una recursión (capa 2) y luego invocar los pasos de compilación reales en otra recursión (capa 3). También sugieren usar ninjas en lugar de hacer si esto es inaceptable. – jfritz42

3

Mientras que la respuesta sigue siendo la misma de Makefile, las versiones recientes (CMake 2.8.9 liberado en agosto 09, 2012) incluyen los generadores Ninja habilitados por defecto. En una base de código C++ relativamente grande (Torque3D, aproximadamente 40M de archivos fuente en aproximadamente 241 directorios), toma a Ninja en promedio (de diez carreras) 0.14 segundos decidir que no queda nada por hacer y tarda en promedio (otra vez , de diez ejecuciones) 2.55 segundos (tiempos basados ​​en un proyecto que ya se construyó completamente sin nada que hacer.)

Por lo tanto, CMake & Ninja podría ser una buena opción si encuentra que Hacer es demasiado lento. Mencionas a Tup en una respuesta. Ninja parece tener objetivos similares a Tup.


  1. mejor conjetura basada en find Torque3D/Engine -iname ".c" -or -iname ".cpp" -or -iname "*.h" | xargs dirname | sort -u | wc -l
+0

Sí, ninja es increíble, y de hecho hay soporte experimental para ninjas en Cmake, pero si ya uso ninja, probablemente rodaré mi propio script para generar archivos ninja. O usa gyp. –

Cuestiones relacionadas