@ -88,26 +88,46 @@
#
# i n c l u d i n g b i n a r y d i r e c t o r y f o r g e n e r a t e d h e a d e r s .
include_directories ( ${ CMAKE_ BINARY_DIR} )
include_directories ( ${ CMAKE_ CURRENT_ BINARY_DIR} )
if ( NOT APPLE )
if ( NOT APPLE AND NOT ANDROID )
find_package ( Threads REQUIRED )
link_libraries ( ${ CMAKE_THREAD_LIBS_INIT } )
endif ( NOT APPLE )
set ( CMAKE_CXX_LINK_EXECUTABLE "${CMAKE_CXX_LINK_EXECUTABLE} -ldl -lrt" )
endif ( NOT APPLE AND NOT ANDROID )
function ( merge_static_libs TARGET_NAME )
set ( libs ${ ARGN } )
list ( REMOVE_DUPLICATES libs )
# Fi 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
# Ge t a l l p r o p a g a t i o n d e p e n d e n c i e s f r o m t h e m e r g e d l i b r a r i e s
foreach ( lib ${ libs } )
set( libfiles ${ libfiles } $< TARGET_FILE:${lib} > )
list( APPEND libs_deps ${ ${lib } _LIB_DEPENDS} )
endforeach ( )
list ( REMOVE_DUPLICATES libs_deps )
if ( 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
# T o p r o d u c e a l i b r a r y w e n e e d a t l e a s t o n e s o u r c e f i l e .
# I t i s c r e a t e d b y a d d _ c u s t o m _ c o m m a n d b e l o w a n d w i l l h e l p s
# a l s o h e l p t o t r a c k d e p e n d e n c i e s .
set ( dummyfile ${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_NAME } _dummy.c )
# M a k e t h e g e n e r a t e d d u m m y s o u r c e f i l e d e p e n d e d o n a l l s t a t i c i n p u t
# l i b s . I f i n p u t l i b c h a n g e s , t h e s o u r c e f i l e i s t o u c h e d
# w h i c h c a u s e s t h e d e s i r e d effect ( relink ) .
add_custom_command ( OUTPUT ${ dummyfile }
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 $ { d u m m y f i l e }
D E P E N D S $ { l i b s } )
# G e n e r a t e d u m m y s t a i c l i b
file ( WRITE ${ dummyfile } "const char * dummy = \" ${ dummyfile } \";")
add_library ( ${ TARGET_NAME } STATIC ${ dummyfile } )
target_link_libraries ( ${ TARGET_NAME } ${ libs_deps } )
foreach ( lib ${ libs } )
# 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
set ( libfiles ${ libfiles } $< TARGET_FILE:${lib} > )
endforeach ( )
add_custom_command ( TARGET ${ TARGET_NAME } POST_BUILD
C O M M A N D r m " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / l i b $ { T A R G E T _ N A M E } . a "
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 " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / l i b $ { T A R G E T _ N A M E } . a " $ { l i b f i l e s } )
@ -117,7 +137,8 @@ function(merge_static_libs TARGET_NAME)
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 } )
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 }
D E P E N D S $ { l i b } )
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 } > "
@ -134,18 +155,18 @@ function(merge_static_libs TARGET_NAME)
list ( APPEND mergebases "${mergebase}" )
endforeach ( )
# 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 ( ${ TARGET_NAME } STATIC ${ mergebases } )
target_link_libraries ( ${ TARGET_NAME } ${ libs_deps } )
# G e t t h e f i l e n a m e o f t h e g e n e r a t e d l i b r a r y
set ( outlibfile "$<TARGET_FILE:${TARGET_NAME}>" )
foreach ( lib ${ libs } )
add_custom_command ( TARGET ${ TARGET_NAME } 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 } @ " . . / $ { l i b } . o b j l i s t "
C O M M A N D $ { C M A K E _ A R } c r $ { o u t l i b f i l e } * . o
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 }
W O R K I N G _ D I R E C T O R Y $ { l i b } . o b j d i r )
endforeach ( )
add_custom_command ( TARGET ${ TARGET_NAME } 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 ( merge_static_libs )
@ -162,7 +183,12 @@ function(cc_library TARGET_NAME)
endif ( )
if ( cc_library_DEPS )
add_dependencies ( ${ TARGET_NAME } ${ cc_library_DEPS } )
target_link_libraries ( ${ TARGET_NAME } ${ cc_library_DEPS } )
endif ( )
# c p p l i n t c o d e s t y l e
add_style_check_target ( ${ TARGET_NAME } ${ cc_library_SRCS } )
else ( cc_library_SRCS )
if ( cc_library_DEPS )
merge_static_libs ( ${ TARGET_NAME } ${ cc_library_DEPS } )
@ -193,7 +219,7 @@ function(cc_test TARGET_NAME)
add_executable ( ${ TARGET_NAME } ${ cc_test_SRCS } )
target_link_libraries ( ${ TARGET_NAME } ${ cc_test_DEPS } gtest gtest_main )
add_dependencies ( ${ TARGET_NAME } ${ cc_test_DEPS } gtest gtest_main )
add_test ( ${ TARGET_NAME } ${ TARGET_NAME } )
add_test ( NAME ${ TARGET_NAME } COMMAND ${ TARGET_NAME } WORKING_DIRECTORY ${ CMAKE_CURRENT_SOURCE_DIR } )
endif ( )
endfunction ( cc_test )
@ -211,6 +237,7 @@ function(nv_library TARGET_NAME)
endif ( )
if ( nv_library_DEPS )
add_dependencies ( ${ TARGET_NAME } ${ nv_library_DEPS } )
target_link_libraries ( ${ TARGET_NAME } ${ nv_library_DEPS } )
endif ( )
else ( nv_library_SRCS )
if ( nv_library_DEPS )
@ -263,8 +290,22 @@ function(go_library TARGET_NAME)
set ( ${ TARGET_NAME } _LIB_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}${TARGET_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}" CACHE STRING "output library name for target ${TARGET_NAME}" )
endif ( )
# A d d d u m m y c o d e t o s u p p o r t ` m a k e t a r g e t _ n a m e ` u n d e r T e r m i n a l C o m m a n d
set ( dummyfile ${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_NAME } _dummy.c )
# T h i s c u s t o m c o m m a n d w i l l a l w a y s r u n s i n c e i t d e p e n d s o n a n o t
# e x i s t i n g f i l e .
add_custom_command (
O U T P U T d u m m y _ r e b u l i d _ $ { T A R G E T _ N A M E }
C O M M A N D c m a k e - E t o u c h $ { d u m m y f i l e }
)
# C r e a t e a c u s t o m t a r g e t t h a t d e p e n d s o n t h e c u s t o m c o m m a n d o u t p u t
# f i l e , s o t h e c u s t o m c o m m a n d c a n b e r e f e r e n c e d a s a d e p e n d e n c y b y
# ` a d d _ d e p e n d e n c i e s ` .
add_custom_target ( rebuild_ ${ TARGET_NAME }
D E P E N D S d u m m y _ r e b u l i d _ $ { T A R G E T _ N A M E }
)
# A d d d u m m y c o d e t o s u p p o r t ` m a k e t a r g e t _ n a m e ` u n d e r T e r m i n a l C o m m a n d
file ( WRITE ${ dummyfile } "const char * dummy = \" ${ dummyfile } \";")
if ( go_library_SHARED OR go_library_shared )
add_library ( ${ TARGET_NAME } SHARED ${ dummyfile } )
@ -275,17 +316,26 @@ function(go_library TARGET_NAME)
add_dependencies ( ${ TARGET_NAME } ${ go_library_DEPS } )
endif ( go_library_DEPS )
# T h e " s o u r c e f i l e " o f t h e l i b r a r y i s ` $ { d u m m y f i l e } ` w h i c h n e v e r
# c h a n g e , s o t h e t a r g e t w i l l n e v e r r e b u i l d . M a k e t h e t a r g e t d e p e n d s
# o n t h e c u s t o m c o m m a n d t h a t t o u c h e s t h e l i b r a r y " s o u r c e f i l e " , s o
# r e b u i l d w i l l a l w a y s h a p p e n .
add_dependencies ( ${ TARGET_NAME } rebuild_ ${ TARGET_NAME } )
set ( ${ TARGET_NAME } _LIB_PATH "${CMAKE_CURRENT_BINARY_DIR}/${${TARGET_NAME}_LIB_NAME}" CACHE STRING "output library path for target ${TARGET_NAME}" )
file ( GLOB GO_SOURCE RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "*.go" )
string ( REPLACE "${PADDLE_GO_PATH}/" "" CMAKE_CURRENT_SOURCE_REL_DIR ${ CMAKE_CURRENT_SOURCE_DIR } )
add_custom_command ( TARGET ${ TARGET_NAME } POST_BUILD
C O M M A N D r m " $ { $ { T A R G E T _ N A M E } _ L I B _ P A T H } "
# G o l a n g b u i l d s o u r c e c o d e
C O M M A N D en v GO P A T H = $ { G O P A T H } $ { C M A K E _ G o _ C O M P I L E R } b u i l d $ { B U I L D _ M O D E }
C O M M A N D GO P A T H = $ { G O P A T H } $ { C M A K E _ G o _ C O M P I L E R } b u i l d $ { B U I L D _ M O D E }
- o " $ { $ { T A R G E T _ N A M E } _ L I B _ P A T H } "
$ { G O _ S O U R C E }
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
add_dependencies ( ${ TARGET_NAME } go_path )
" . / $ { C M A K E _ C U R R E N T _ S O U R C E _ R E L _ D I R } / $ { G O _ S O U R C E } "
# m u s t r u n u n d e r G O P A T H
W O R K I N G _ D I R E C T O R Y " $ { P A D D L E _ I N _ G O P A T H } / g o " )
add_dependencies ( ${ TARGET_NAME } go_vendor )
endfunction ( go_library )
function ( go_binary TARGET_NAME )
@ -293,35 +343,49 @@ function(go_binary TARGET_NAME)
set ( oneValueArgs "" )
set ( multiValueArgs SRCS DEPS )
cmake_parse_arguments ( go_binary "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
string ( REPLACE "${PADDLE_GO_PATH}/" "" CMAKE_CURRENT_SOURCE_REL_DIR ${ CMAKE_CURRENT_SOURCE_DIR } )
add_custom_command ( OUTPUT ${ TARGET_NAME } _timestamp
C O M M A N D e n v G O P A T H = $ { G O P A T H } $ { C M A K E _ G o _ C O M P I L E R } b u i l d
- o " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { T A R G E T _ N A M E } "
${ g o _ l i b r a r y _ S R C S }
W O R K I N G _ D I R E C T O R Y ${ C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
add_custom_target ( ${ TARGET_NAME } ALL DEPENDS ${ TARGET_NAME } _timestamp ${ go_binary_DEPS } )
". / $ { C M A K E _ C U R R E N T _ S O U R C E _ R E L _ D I R } / $ { g o _ b i n a r y _ S R C S } "
W O R K I N G _ D I R E C T O R Y "$ { P A D D L E _ I N _ G O P A T H } / g o " )
add_custom_target ( ${ TARGET_NAME } ALL DEPENDS go_vendor ${ TARGET_NAME } _timestamp ${ go_binary_DEPS } )
install ( PROGRAMS ${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_NAME } DESTINATION bin )
endfunction ( go_binary )
function ( go_test TARGET_NAME )
set ( options OPTIONAL )
set ( oneValueArgs "" )
set ( multiValueArgs SRCS DEPS)
set ( multiValueArgs DEPS)
cmake_parse_arguments ( go_test "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
add_custom_command ( OUTPUT ${ TARGET_NAME } _timestamp
C O M M A N D e n v G O P A T H = $ { G O P A T H } $ { C M A K E _ G o _ C O M P I L E R } t e s t
string ( REPLACE "${PADDLE_GO_PATH}" "" CMAKE_CURRENT_SOURCE_REL_DIR ${ CMAKE_CURRENT_SOURCE_DIR } )
add_custom_target ( ${ TARGET_NAME } ALL DEPENDS go_vendor ${ go_test_DEPS } )
add_custom_command ( TARGET ${ TARGET_NAME } POST_BUILD
C O M M A N D e n v G O P A T H = $ { G O P A T H } $ { C M A K E _ G o _ C O M P I L E R } t e s t - r a c e
- c - o " $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { T A R G E T _ N A M E } "
$ { g o _ t e s t _ S R C S }
" . $ { C M A K E _ C U R R E N T _ S O U R C E _ R E L _ D I R } "
W O R K I N G _ D I R E C T O R Y " $ { P A D D L E _ I N _ G O P A T H } / g o " )
add_test ( NAME ${ TARGET_NAME }
C O M M A N D $ { C M A K E _ C U R R E N T _ B I N A R Y _ D I R } / $ { T A R G E T _ N A M E }
W O R K I N G _ D I R E C T O R Y $ { C M A K E _ C U R R E N T _ S O U R C E _ D I R } )
add_custom_target ( ${ TARGET_NAME } ALL DEPENDS ${ TARGET_NAME } _timestamp ${ go_test_DEPS } )
add_test ( ${ TARGET_NAME } ${ CMAKE_CURRENT_BINARY_DIR } / ${ TARGET_NAME } )
endfunction ( go_test )
function ( proto_library TARGET_NAME )
set ( oneValueArgs "" )
set ( multiValueArgs SRCS )
set ( multiValueArgs SRCS DEPS )
cmake_parse_arguments ( proto_library "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
set ( proto_srcs )
set ( proto_hdrs )
protobuf_generate_cpp ( proto_srcs proto_hdrs ${ proto_library_SRCS } )
cc_library ( ${ TARGET_NAME } SRCS ${ proto_srcs } DEPS protobuf )
cc_library ( ${ TARGET_NAME } SRCS ${ proto_srcs } DEPS ${ proto_library_DEPS } protobuf )
endfunction ( )
function ( py_proto_compile TARGET_NAME )
set ( oneValueArgs "" )
set ( multiValueArgs SRCS )
cmake_parse_arguments ( py_proto_compile "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ ARGN } )
set ( py_srcs )
protobuf_generate_python ( py_srcs ${ py_proto_compile_SRCS } )
add_custom_target ( ${ TARGET_NAME } ALL DEPENDS ${ py_srcs } )
endfunction ( )