2012-03-03 12 views
18

Parece que CMake es bastante arraigada en su opinión de que debería ser uno, y sólo uno, CMAKE_CXX_COMPILER para todos los archivos de código fuente de C++. No puedo encontrar una manera de anular esto por objetivo. Esto hace que una combinación de compilación de host y cross compilada en un solo CMakeLists.txt sea muy difícil con las funciones incorporadas de CMake.CMake con múltiples compiladores para el mismo idioma

lo tanto, mi pregunta es: ¿cuál es la mejor manera de utilizar múltiples compiladores para el mismo idioma (es decir, C++)?

Respuesta

12

Es imposible hacer esto con CMake.

CMake sólo mantiene un conjunto de propiedades del compilador que es compartida por todos los objetivos en un archivo CMakeLists.txt. Si desea utilizar dos compiladores, debe ejecutar CMake dos veces. Esto es cierto incluso para, por ejemplo, construyendo binarios de 32 bits y 64 bits desde la misma cadena de herramientas del compilador.

La forma más rápida y sucia-en torno a esto es usar comandos personalizados. Pero luego terminas con lo que son guiones de shell básicamente glorificados, que probablemente no sea lo que quieres.

La solución limpia es: No los puso en el mismo CMakeLists.txt! No puede vincular entre diferentes arquitecturas de todos modos, por lo que no es necesario que estén en el mismo archivo. Puede reducir las redundancias refaccionando partes comunes de las secuencias de comandos CMake en archivos separados y include().

La principal desventaja aquí es que pierde la capacidad de compilación con un solo comando, pero puede resolverlo escribiendo un contenedor en su lenguaje de scripting favorito que se encarga de llamar a los diferentes archivos CMake-makefiles.

+2

parece que add_directory (other_build_kind_folder) es una posibilidad, así, en lugar de hacer una envoltura personalizada, ya que eso es lo que he estado haciendo y parece que funciona. :-) – cdleary

+2

@cdleary ¿Podría aclarar cómo funciona? ¿Cómo te permite 'add_subdirectory' (o realmente quisiste decir' add_directory'?) Cambiar las toolchains? –

+1

Guau, este es realmente un diseño realmente malo ... –

0

Para extender la respuesta de @ Bill Hoffman: generar el proyecto como una super-estructura, mediante el uso de algún tipo de plantilla como la que aquí https://github.com/Sarcasm/cmake-superbuild que configurará tanto las dependencias como su proyecto como ExternalProject (entorno de configuración/compilación/instalación de cmake independiente).

Cuestiones relacionadas