message ( STATUS "=============================================================================" )
message ( STATUS "CTEST_FULL_OUTPUT (Avoid ctest truncation of output)" )
message ( STATUS "" )
if ( NOT CPackComponentsForAll_BINARY_DIR )
message ( FATAL_ERROR "CPackComponentsForAll_BINARY_DIR not set" )
endif ( )
if ( NOT CPackGen )
message ( FATAL_ERROR "CPackGen not set" )
endif ( )
message ( "CMAKE_CPACK_COMMAND = ${CMAKE_CPACK_COMMAND}" )
if ( NOT CMAKE_CPACK_COMMAND )
message ( FATAL_ERROR "CMAKE_CPACK_COMMAND not set" )
endif ( )
if ( NOT CPackComponentWay )
message ( FATAL_ERROR "CPackComponentWay not set" )
endif ( )
set ( expected_file_mask "" )
# The usual default behavior is to expect a single file
# Then some specific generators (Archive, RPM, ...)
# May produce several numbers of files depending on
# CPACK_COMPONENT_xxx values
set ( expected_count 1 )
set ( config_type $ENV{ CMAKE_CONFIG_TYPE } )
set ( config_args )
if ( config_type )
set ( config_args -C ${ config_type } )
endif ( )
set ( config_verbose )
if ( CPackGen MATCHES "ZIP" )
set ( expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.zip" )
if ( ${ CPackComponentWay } STREQUAL "default" )
set ( expected_count 1 )
elseif ( ${ CPackComponentWay } STREQUAL "OnePackPerGroup" )
set ( expected_count 3 )
elseif ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
set ( expected_count 4 )
elseif ( ${ CPackComponentWay } STREQUAL "AllInOne" )
set ( expected_count 1 )
endif ( )
elseif ( CPackGen MATCHES "RPM" )
set ( config_verbose -D "CPACK_RPM_PACKAGE_DEBUG=1" )
set ( expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.rpm" )
if ( ${ CPackComponentWay } STREQUAL "default" )
set ( expected_count 1 )
elseif ( ${ CPackComponentWay } STREQUAL "OnePackPerGroup" )
set ( expected_count 3 )
elseif ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
set ( expected_count 4 )
elseif ( ${ CPackComponentWay } STREQUAL "AllInOne" )
set ( expected_count 1 )
endif ( )
elseif ( CPackGen MATCHES "DEB" )
set ( expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.deb" )
if ( ${ CPackComponentWay } STREQUAL "default" )
set ( expected_count 1 )
elseif ( ${ CPackComponentWay } STREQUAL "OnePackPerGroup" )
set ( expected_count 3 )
elseif ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
set ( expected_count 4 )
elseif ( ${ CPackComponentWay } STREQUAL "AllInOne" )
set ( expected_count 1 )
endif ( )
endif ( )
if ( CPackGen MATCHES "DragNDrop" )
set ( expected_file_mask "${CPackComponentsForAll_BINARY_DIR}/MyLib-*.dmg" )
if ( ${ CPackComponentWay } STREQUAL "default" )
set ( expected_count 1 )
elseif ( ${ CPackComponentWay } STREQUAL "OnePackPerGroup" )
set ( expected_count 3 )
elseif ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
set ( expected_count 4 )
elseif ( ${ CPackComponentWay } STREQUAL "AllInOne" )
set ( expected_count 1 )
endif ( )
endif ( )
# clean-up previously CPack generated files
if ( expected_file_mask )
file ( GLOB expected_file "${expected_file_mask}" )
if ( expected_file )
file ( REMOVE ${ expected_file } )
endif ( )
endif ( )
message ( "config_args = ${config_args}" )
message ( "config_verbose = ${config_verbose}" )
execute_process ( COMMAND ${ CMAKE_CPACK_COMMAND } ${ config_verbose } -G ${ CPackGen } ${ config_args }
R E S U L T _ V A R I A B L E C P a c k _ r e s u l t
O U T P U T _ V A R I A B L E C P a c k _ o u t p u t
E R R O R _ V A R I A B L E C P a c k _ e r r o r
W O R K I N G _ D I R E C T O R Y $ { C P a c k C o m p o n e n t s F o r A l l _ B I N A R Y _ D I R } )
if ( CPack_result )
message ( FATAL_ERROR "error: CPack execution went wrong!, CPack_output=${CPack_output}, CPack_error=${CPack_error}" )
else ( )
message ( STATUS "CPack_output=${CPack_output}" )
endif ( )
# Now verify if the number of expected file is OK
# - using expected_file_mask and
# - expected_count
if ( expected_file_mask )
file ( GLOB expected_file "${expected_file_mask}" )
message ( STATUS "expected_count='${expected_count}'" )
message ( STATUS "expected_file='${expected_file}'" )
message ( STATUS "expected_file_mask='${expected_file_mask}'" )
if ( NOT expected_file )
message ( FATAL_ERROR "error: expected_file=${expected_file} does not exist: CPackComponentsForAll test fails. (CPack_output=${CPack_output}, CPack_error=${CPack_error}" )
endif ( )
list ( LENGTH expected_file actual_count )
message ( STATUS "actual_count='${actual_count}'" )
if ( NOT actual_count EQUAL expected_count )
message ( FATAL_ERROR "error: expected_count=${expected_count} does not match actual_count=${actual_count}: CPackComponents test fails. (CPack_output=${CPack_output}, CPack_error=${CPack_error})" )
endif ( )
endif ( )
# Validate content
if ( CPackGen MATCHES "RPM" )
find_program ( RPM_EXECUTABLE rpm )
if ( NOT RPM_EXECUTABLE )
message ( FATAL_ERROR "error: missing rpm executable required by the test" )
endif ( )
set ( CPACK_RPM_PACKAGE_SUMMARY "default summary" )
set ( CPACK_RPM_libraries_PACKAGE_SUMMARY "libraries summary" )
set ( CPACK_RPM_libraries_PACKAGE_DESCRIPTION "libraries description" )
set ( CPACK_COMPONENT_APPLICATIONS_DESCRIPTION
" A n e x t r e m e l y u s e f u l a p p l i c a t i o n t h a t m a k e s u s e o f M y L i b " )
set ( CPACK_COMPONENT_HEADERS_DESCRIPTION
" C / C \ \ + \ \ + h e a d e r f i l e s f o r u s e w i t h M y L i b " )
if ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
# set gnu install prefixes to what they are set during rpm creation
# CMAKE_SIZEOF_VOID_P is not set here but lib is prefix of lib64 so
# relocation path test won't fail on OSes with lib64 library location
include ( GNUInstallDirs )
set ( CPACK_PACKAGING_INSTALL_PREFIX "/usr/foo/bar" )
foreach ( check_file ${ expected_file } )
string ( REGEX MATCH ".*libraries.*" check_file_libraries_match ${ check_file } )
string ( REGEX MATCH ".*headers.*" check_file_headers_match ${ check_file } )
string ( REGEX MATCH ".*applications.*" check_file_applications_match ${ check_file } )
string ( REGEX MATCH ".*Unspecified.*" check_file_Unspecified_match ${ check_file } )
execute_process ( COMMAND ${ RPM_EXECUTABLE } -pqi ${ check_file }
O U T P U T _ V A R I A B L E c h e c k _ f i l e _ c o n t e n t
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
execute_process ( COMMAND ${ RPM_EXECUTABLE } -pql ${ check_file }
O U T P U T _ V A R I A B L E c h e c k _ p a c k a g e _ c o n t e n t
E R R O R _ Q U I E T
O U T P U T _ S T R I P _ T R A I L I N G _ W H I T E S P A C E )
if ( check_file_libraries_match )
set ( check_file_match_expected_summary ".*${CPACK_RPM_libraries_PACKAGE_SUMMARY}.*" )
set ( check_file_match_expected_description ".*${CPACK_RPM_libraries_PACKAGE_DESCRIPTION}.*" )
set ( check_file_match_expected_relocation_path "Relocations : ${CPACK_PACKAGING_INSTALL_PREFIX} ${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR}" )
set ( spec_regex "*libraries*" )
set ( check_content_list "^/usr/foo/bar\n/usr/foo/bar/lib.*\n/usr/foo/bar/lib.*/libmylib.a$" )
elseif ( check_file_headers_match )
set ( check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*" )
set ( check_file_match_expected_description ".*${CPACK_COMPONENT_HEADERS_DESCRIPTION}.*" )
set ( check_file_match_expected_relocation_path "Relocations : ${CPACK_PACKAGING_INSTALL_PREFIX} ${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR}" )
set ( spec_regex "*headers*" )
set ( check_content_list "^/usr/foo/bar\n/usr/foo/bar/include\n/usr/foo/bar/include/mylib.h$" )
elseif ( check_file_applications_match )
set ( check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*" )
set ( check_file_match_expected_description ".*${CPACK_COMPONENT_APPLICATIONS_DESCRIPTION}.*" )
set ( check_file_match_expected_relocation_path "Relocations : ${CPACK_PACKAGING_INSTALL_PREFIX} ${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}" )
set ( spec_regex "*applications*" )
set ( check_content_list "^/usr/foo/bar\n/usr/foo/bar/bin\n/usr/foo/bar/bin/mylibapp$" )
elseif ( check_file_Unspecified_match )
set ( check_file_match_expected_summary ".*${CPACK_RPM_PACKAGE_SUMMARY}.*" )
set ( check_file_match_expected_description ".*DESCRIPTION.*" )
set ( check_file_match_expected_relocation_path "Relocations : ${CPACK_PACKAGING_INSTALL_PREFIX} ${CPACK_PACKAGING_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR}" )
set ( spec_regex "*Unspecified*" )
set ( check_content_list " ^/usr/foo/bar
/ u s r / f o o / b a r / b i n
/ u s r / f o o / b a r / b i n / m y l i b a p p 2 $ " )
else ( )
message ( FATAL_ERROR "error: unexpected rpm package '${check_file}'" )
endif ( )
#######################
# test package info
#######################
string ( REGEX MATCH ${ check_file_match_expected_summary } check_file_match_summary ${ check_file_content } )
if ( NOT check_file_match_summary )
message ( FATAL_ERROR "error: '${check_file}' rpm package summary does not match expected value - regex '${check_file_match_expected_summary}'; RPM output: '${check_file_content}'" )
endif ( )
string ( REGEX MATCH ${ check_file_match_expected_description } check_file_match_description ${ check_file_content } )
if ( NOT check_file_match_description )
message ( FATAL_ERROR "error: '${check_file}' rpm package description does not match expected value - regex '${check_file_match_expected_description}'; RPM output: '${check_file_content}'" )
endif ( )
string ( REGEX MATCH ${ check_file_match_expected_relocation_path } check_file_match_relocation_path ${ check_file_content } )
if ( NOT check_file_match_relocation_path )
file ( GLOB_RECURSE spec_file "${CPackComponentsForAll_BINARY_DIR}/${spec_regex}.spec" )
if ( spec_file )
file ( READ ${ spec_file } spec_file_content )
endif ( )
message ( FATAL_ERROR "error: '${check_file}' rpm package relocation path does not match expected value - regex '${check_file_match_expected_relocation_path}'; RPM output: '${check_file_content}'; generated spec file: '${spec_file_content}'" )
endif ( )
#######################
# test package content
#######################
string ( REGEX MATCH "${check_content_list}" expected_content_list "${check_package_content}" )
if ( NOT expected_content_list )
file ( GLOB_RECURSE spec_file "${CPackComponentsForAll_BINARY_DIR}/${spec_regex}.spec" )
if ( spec_file )
file ( READ ${ spec_file } spec_file_content )
endif ( )
message ( FATAL_ERROR "error: '${check_file}' rpm package content does not match expected value - regex '${check_content_list}'; RPM output: '${check_package_content}'; generated spec file: '${spec_file_content}'" )
endif ( )
endforeach ( )
elseif ( ${ CPackComponentWay } STREQUAL "IgnoreGroup" )
endif ( )
endif ( )