2008-10-06 30 views
8

Boost es una biblioteca muy grande con muchas interdependencias, que también lleva mucho tiempo compilar (lo que para mí ralentiza nuestro tiempo de respuesta CruiseControl).¿Cómo manejas las grandes dependencias en Boost?

Las únicas partes de boost que uso son boost :: regex y boost :: format.

¿Hay una manera fácil de extraer solo las partes de impulso necesarias para que una sub biblioteca particular aumente las compilaciones más rápido?

EDIT: Para responder a la pregunta acerca de por qué estamos reconstrucción de impulso ...

  1. Análisis de los archivos de cabecera a impulsar aún lleva mucho tiempo. Sospecho que si pudiéramos extraer solo lo que necesitamos, el análisis también ocurriría más rápido.
  2. Nuestra configuración CruiseControl construye todo desde cero. Esto también lo hace más fácil si actualizamos la versión de boost que estamos usando. Pero investigaré para ver si podemos cambiar nuestro proceso de compilación para ver si nuestra máquina de compilación puede generar impulso cuando se producen cambios y comprometer esos cambios a SVN. (Mi compañía tiene una política de que todo lo que sale por la puerta debe construirse en la "máquina de compilación").

Respuesta

8

Primero, puede usar la herramienta bcp (se puede encontrar en la subcarpeta de herramientas) para extraer los encabezados y archivos que está utilizando. Sin embargo, esto no ayudará con los tiempos de compilación. Segundo, no tienes que reconstruir Boost todo el tiempo. Simplemente precompila los archivos lib una vez y en cada cambio de versión, y copia la carpeta "stage" en el momento de compilar.

2

A menos que esté parcheando las bibliotecas de refuerzo, no hay razón para recompilarlo cada vez que lo hace una construcción.

1

¡Los encabezados precompilados son la palabra del día! Incluya los encabezados de impulso que necesita en su encabezado precompilado - ¡tada!

+0

El único problema con esto es que esto funciona mejor si uno viola las mejores prácticas de incluir sólo el los encabezados requeridos Pero para mí, las compilaciones rápidas terminaron siendo más importantes que las mejores prácticas ... –

1

Estamos utilizando Boost, pero solo incluimos archivos de objeto para los tipos que realmente utilizamos. Es decir, construimos nuestra propia biblioteca estática con un grupo de utilidades propias e incluimos aquellas partes de Boost que consideramos útiles. Nuestra CMakeLists.txt se ve algo como esto (usted debe ser capaz de cargar esto en CMake, si ajustar las fuentes en consecuencia.)

project(MyBoost) 

set(SOURCES 
    boost/regex/src/c_regex_traits.cpp 
    boost/regex/src/cpp_regex_traits.cpp 
    boost/regex/src/cregex.cpp 
    boost/regex/src/fileiter.cpp 
    boost/regex/src/icu.cpp 
    boost/regex/src/instances.cpp 
    boost/regex/src/posix_api.cpp 
    boost/regex/src/regex.cpp 
    boost/regex/src/regex_debug.cpp 
    boost/regex/src/regex_raw_buffer.cpp 
    boost/regex/src/regex_traits_defaults.cpp 
    boost/regex/src/static_mutex.cpp 
    boost/regex/src/usinstances.cpp 
    boost/regex/src/w32_regex_traits.cpp 
    boost/regex/src/wc_regex_traits.cpp 
    boost/regex/src/wide_posix_api.cpp 
    boost/regex/src/winstances.cpp 
) 

add_library(MyBoost STATIC ${SOURCES}) 
Cuestiones relacionadas