2011-01-22 7 views
9

Estoy intentando construir un archivo de objeto usando CMake, pero parece que no puedo hacer que CMake construya algo más que un ejecutable completo. básicamente estoy buscando el resultado de la siguiente recopilación (el resultado será cargado en un objetivo VxWorks y vinculado a continuación):¿Cómo puedo producir solo un archivo de objeto (* .o) desde un destino de compilación CMake?

$(CC) $(CFLAGS) $(INC_DIRS) -c src/object.c 

He intentado cambiar la propiedad output_name del objetivo, pero Eso no También parece ayudar.

Creo que podría evitar esto mediante el uso de un comando personalizado, pero parece que también estoy trabajando en torno a las cosas buenas que proporciona CMake.

Gracias por su ayuda!

+0

Me pregunto por qué quieres el archivo objeto. ¿No es posible construir una lib estática con CMake? Si es necesario, ¿una lib estática de solo un archivo fuente? Alternativamente, podría tratar de vincular el ejecutable de todos modos y "reutilizar" los archivos de objetos generados –

+0

@Andre Una ventaja sería trabajar en la reparación de errores de compilación para un solo archivo cuando sepa que también hay errores de compilación en otro lugar del proyecto (por ejemplo, si está trabajando estrechamente con otro desarrollador en un código que aún no está listo para el consumo general) sin necesidad de editar archivos 'CMakeLists.txt'. –

Respuesta

1

Iría por la ruta del comando personalizado. Recuerde que aún puede usar esos archivos de objetos para la compilación con CMake último si establece las propiedades del archivo fuente GENERADO y EXTERNAL_OBJECT.

4

se le dio esta respuesta a mí en el CMake mailing list y funcionó como un encanto:

vistazo a la siguiente secuencia de comandos ${CMAKE_SOURCE_DIR}/cpo:

#!/bin/sh 
d=$1; shift 
while [ "$1" != "--" ]; do 
    cp $1 $d/$(basename $1); shift 
done 

Ahora, mira el siguiente CMakeLists.txt:

CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) 
PROJECT(CPO C) 
FILE(WRITE ${CMAKE_BINARY_DIR}/f.c "void f(void){}\n") 
ADD_LIBRARY(f SHARED f.c) 
SET_TARGET_PROPERTIES(f PROPERTIES RULE_LAUNCH_LINK 
    "${CMAKE_SOURCE_DIR}/cpo ${CMAKE_BINARY_DIR} <OBJECTS> --" 
) 

La secuencia de comandos de inicio "cpo" hace que el objetivo "f" produzca archivos de objeto en el directorio pasado como primer par un medidor en lugar de una biblioteca; todo lo demás debería ser un negocio como siempre. La clave es el acceso del script al marcador de posición <OBJECTS>, por lo que puede operar en los archivos del objeto, mientras que el comando de enlace real después de "-" se ignora. Esa forma , puede usar todas las capacidades de CMake para la compilación y la interceptación justo antes de que se realice el enlace. IMO, esa es una solución bastante limpia que debe ser fácilmente adaptable a sus necesidades; la desventaja es que el uso de RULE_LAUNCH_LINK está limitado a Makefile generadores.

Cuestiones relacionadas