@ -16,114 +16,59 @@
function ( merge_static_libs outlib )
set ( libs ${ ARGV } )
list ( REMOVE_AT libs 0 )
# C r e a t e a d u m m y f i l e t h a t t h e t a r g e t w i l l d e p e n d o n
set ( dummyfile ${ CMAKE_CURRENT_BINARY_DIR } / ${ outlib } _dummy.c )
file ( WRITE ${ dummyfile } "const char * dummy = \" ${ dummyfile } \";")
add_library ( ${ outlib } STATIC ${ dummyfile } )
list ( REMOVE_DUPLICATES libs ) # j u s t i n c a s e
if ( "${CMAKE_CFG_INTDIR}" STREQUAL "." )
set ( multiconfig FALSE )
else ( )
set ( multiconfig TRUE )
endif ( )
# F i r s t g e t t h e f i l e n a m e s o f t h e l i b r a r i e s t o b e m e r g e d
# F i r s t g e t t h e f i l e n a m e s o f t h e l i b r a r i e s t o b e m e r g e d
foreach ( lib ${ libs } )
get_target_property ( libtype ${ lib } TYPE )
if ( NOT libtype STREQUAL "STATIC_LIBRARY" )
message ( FATAL_ERROR " M erge_static_libs can only process static libraries")
message ( FATAL_ERROR "merge_static_libs can only process static libraries" )
endif ( )
if ( multiconfig )
foreach ( CONFIG_TYPE ${ CMAKE_CONFIGURATION_TYPES } )
get_target_property ( "libfile_${CONFIG_TYPE}" ${ lib } "LOCATION_${CONFIG_TYPE}" )
list ( APPEND libfiles_ ${ CONFIG_TYPE } ${ libfile_${CONFIG_TYPE } } )
endforeach ( )
else ( )
get_target_property ( libfile ${ lib } LOCATION )
list ( APPEND libfiles "${libfile}" )
endif ( multiconfig )
set ( libfiles "${libfiles} $<TARGET_FILE:${lib}>" )
endforeach ( )
message ( STATUS "will be merging ${libfiles}" )
# J u s t t o b e s u r e : c l e a n u p f r o m d u p l i c a t e s
if ( multiconfig )
foreach ( CONFIG_TYPE ${ CMAKE_CONFIGURATION_TYPES } )
list ( REMOVE_DUPLICATES libfiles_ ${ CONFIG_TYPE } )
set ( libfiles ${ libfiles } ${ libfiles_${CONFIG_TYPE } } )
if ( MSVC ) # l i b . e x e d o e s t h e m e r g i n g o f g i v e n a l i s t
set_target_properties ( ${ outlib } PROPERTIES STATIC_LIBRARY_FLAGS "${libfiles}" )
elseif ( APPLE ) # U s e O S X ' s l i b t o o l t o m e r g e a r c h i v e s
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D r m " $ < T A R G E T _ F I L E : $ { o u t l i b } > "
C O M M A N D / u s r / b i n / l i b t o o l - s t a t i c - o " $ < T A R G E T _ F I L E : $ { o u t l i b } > " $ { l i b f i l e s } )
else ( ) # g e n e r a l UNIX : u s e " a r " t o e x t r a c t o b j e c t s a n d r e - a d d t o a c o m m o n l i b
foreach ( lib ${ libs } )
set ( objlistfile ${ lib } .objlist ) # l i s t o f o b j e c t s i n t h e i n p u t l i b r a r y
set ( objdir ${ lib } .objdir )
add_custom_command ( OUTPUT ${ objdir }
C O M M A N D $ { C M A K E _ C O M M A N D } - E m a k e _ d i r e c t o r y $ { o b j d i r } )
add_custom_command ( OUTPUT ${ objlistfile }
C O M M A N D $ { C M A K E _ A R } - x " $ < T A R G E T _ F I L E : $ { l i b } > "
C O M M A N D $ { C M A K E _ A R } - t " $ < T A R G E T _ F I L E : $ { l i b } > " > . . / $ { o b j l i s t f i l e }
D E P E N D S $ { l i b } $ { o b j d i r }
W O R K I N G _ D I R E C T O R Y $ { o b j d i r } )
# E m p t y d u m m y s o u r c e f i l e t h a t g o e s i n t o m e r g e d l i b r a r y
set ( mergebase ${ lib } .mergebase.c )
add_custom_command ( OUTPUT ${ mergebase }
C O M M A N D $ { C M A K E _ C O M M A N D } - E t o u c h $ { m e r g e b a s e }
D E P E N D S $ { o b j l i s t f i l e } )
list ( APPEND mergebases "${mergebase}" )
endforeach ( )
endif ( )
list ( REMOVE_DUPLICATES libfiles )
# N o w t h e e a s y p a r t f o r MSVC a n d f o r M A C
if ( MSVC )
# l i b . e x e d o e s t h e m e r g i n g o f l i b r a r i e s j u s t n e e d t o c o n v e r t h e l i s t i n t o s t r i n g
foreach ( CONFIG_TYPE ${ CMAKE_CONFIGURATION_TYPES } )
set ( flags "" )
foreach ( lib ${ libfiles_${CONFIG_TYPE } } )
set ( flags "${flags} ${lib}" )
# W e n e e d a t a r g e t f o r t h e o u t p u t m e r g e d l i b r a r y
add_library ( ${ outlib } STATIC ${ mergebases } )
set ( outlibfile "$<TARGET_FILE:${outlib}>" )
foreach ( lib ${ libs } )
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D $ { C M A K E _ A R } r u $ { o u t l i b f i l e } @ " . . / $ { o b j l i s t f i l e } "
W O R K I N G _ D I R E C T O R Y $ { o b j d i r } )
endforeach ( )
string ( TOUPPER "STATIC_LIBRARY_FLAGS_${CONFIG_TYPE}" PROPNAME )
set_target_properties ( ${ outlib } PROPERTIES ${ PROPNAME } "${flags}" )
endforeach ( )
elseif ( APPLE )
# U s e O S X ' s l i b t o o l t o m e r g e a r c h i v e s
if ( multiconfig )
message ( FATAL_ERROR "Multiple configurations are not supported" )
endif ( )
get_target_property ( outfile ${ outlib } LOCATION )
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D r m $ { o u t f i l e }
C O M M A N D / u s r / b i n / l i b t o o l - s t a t i c - o $ { o u t f i l e }
$ { l i b f i l e s }
)
else ( )
# g e n e r a l UNIX - n e e d t o " a r - x " a n d t h e n " a r - r u "
if ( multiconfig )
message ( FATAL_ERROR "Multiple configurations are not supported" )
endif ( )
get_target_property ( outfile ${ outlib } LOCATION )
message ( STATUS "outfile location is ${outfile}" )
foreach ( lib ${ libfiles } )
# o b j l i s t f i l e w i l l c o n t a i n t h e l i s t o f o b j e c t f i l e s f o r t h e l i b r a r y
set ( objlistfile ${ lib } .objlist )
set ( objdir ${ lib } .objdir )
set ( objlistcmake ${ objlistfile } .cmake )
# w e o n l y n e e d t o e x t r a c t f i l e s o n c e
if ( ${ CMAKE_CURRENT_BINARY_DIR } /CMakeFiles/cmake.check_cache IS_NEWER_THAN ${ objlistcmake } )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FILE ( WRITE ${ objlistcmake }
" # E x t r a c t o b j e c t f i l e s f r o m t h e l i b r a r y
message ( STATUS \"Extracting object files from ${ lib } \")
EXECUTE_PROCESS ( COMMAND ${ CMAKE_AR } -x ${ lib }
W O R K I N G _ D I R E C T O R Y $ { o b j d i r } )
# s a v e t h e l i s t o f o b j e c t f i l e s
EXECUTE_PROCESS ( COMMAND ls .
O U T P U T _ F I L E $ { o b j l i s t f i l e }
W O R K I N G _ D I R E C T O R Y $ { o b j d i r } ) " )
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
file ( MAKE_DIRECTORY ${ objdir } )
add_custom_command (
O U T P U T $ { o b j l i s t f i l e }
C O M M A N D $ { C M A K E _ C O M M A N D } - P $ { o b j l i s t c m a k e }
D E P E N D S $ { l i b } )
endif ( )
list ( APPEND extrafiles "${objlistfile}" )
# r e l a t i v e p a t h i s n e e d e d b y a r u n d e r M S Y S
file ( RELATIVE_PATH objlistfilerpath ${ objdir } ${ objlistfile } )
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E e c h o " R u n n i n g : $ { C M A K E _ A R } r u $ { o u t f i l e } @ $ { o b j l i s t f i l e r p a t h } "
C O M M A N D $ { C M A K E _ A R } r u " $ { o u t f i l e } " @ " $ { o b j l i s t f i l e r p a t h } "
W O R K I N G _ D I R E C T O R Y $ { o b j d i r } )
endforeach ( )
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D $ { C M A K E _ C O M M A N D } - E e c h o " R u n n i n g : $ { C M A K E _ R A N L I B } $ { o u t f i l e } "
C O M M A N D $ { C M A K E _ R A N L I B } $ { o u t f i l e } )
endif ( )
file ( WRITE ${ dummyfile } .base "const char* ${outlib}_sublibs=\" ${ libs } \";")
add_custom_command (
O U T P U T $ { d u m m y f i l e }
C O M M A N D $ { C M A K E _ C O M M A N D } - E c o p y $ { d u m m y f i l e } . b a s e $ { d u m m y f i l e }
D E P E N D S $ { l i b s } $ { e x t r a f i l e s } )
endfunction ( )
add_custom_command ( TARGET ${ outlib } POST_BUILD
C O M M A N D $ { C M A K E _ R A N L I B } $ { o u t l i b f i l e } )
endif ( )
endfunction ( )