[CMake] faking convenience libraries

Bill Hoffman bill.hoffman at kitware.com
Fri Jan 19 22:43:29 EST 2007


Brandon J. Van Every wrote:
> We need to compile the same underlying code 7 times for 7 different 
> libraries.  3 of the resulting libs are dynamic and 4 are static.  We 
> would use "convenience libraries" to do this, if it were portable and 
> available in CMake.  We understand that "ar" in particular can't 
> include static libraries in other static libraries.  How can we reduce 
> the number of times we have to compile this code, without getting into 
> a lot of hairy details?  Currently we do like the following:
>
> ####################################################################
> #  PCRE LIBRARY                                                     #
> ####################################################################
>
> # The PCRE code is used several times by the various Chicken 
> libraries.  It is tempting to create a
> # PCRE library to be used by other Chicken libraries.  However, CMake 
> doesn't support so-called
> # "Convenience Libraries."  Static libraries can't include other 
> static libraries as a component, at least
> # not in a portable manner.  In particular, "ar" can't handle this.  
> So we take the path of least
> # resistance and just explicitly include the source files in all the 
> libraries we build.
> #
> # TODO: see if there's a way to reduce the number of times we must 
> compile the PCRE code.
>
> SET(PCRE_SOURCES
>  chartables.c
>  config.h
>  pcre.h
>  pcre_compile.c
>  pcre_config.c
>  pcre_dfa_exec.c
>  pcre_exec.c
>  pcre_fullinfo.c
>  pcre_get.c
>  pcre_globals.c
>  pcre_internal.h
>  pcre_maketables.c
>  pcre_ord2utf8.c
>  pcre_printint.c
>  pcre_refcount.c
>  pcre_study.c
>  pcre_tables.c
>  pcre_try_flipped.c
>  pcre_ucp_findchar.c
>  pcre_valid_utf8.c
>  pcre_version.c
>  pcre_xclass.c
> )
> ADD_PREFIX(${Chicken_SOURCE_DIR}/pcre/ PCRE_SOURCES)
> SET(STATIC_FLAGS "${STATIC_FLAGS} -DPCRE_STATIC")
>
> [...]
>
> ADD_LIBRARY(libchicken SHARED ${CHICKEN_LIB_SOURCES} ${PCRE_SOURCES})
>
> [and so forth]
>

I am not following the example here.   If PCRE where a "convenience" 
library you would want it
to be used by both the static and shared libchicken?  There are 
different compile flags for shared
and static so, it would have to be compiled twice.   What are the 7 
different types of libraries?

-Bill



More information about the CMake mailing list