# this test creates a static library and an executable
# the source to the library is then changed
# and the build is done on the executable and if things
# are working the executable should relink with the new
# value. The subdir Project contains the CMakelists.txt
# and source files for the test project.
cmake_minimum_required ( VERSION 2.6 )
project ( BuildDepends )
# This entire test takes place during the initial
# configure step. It should not run again when the
# project is built.
set ( CMAKE_SUPPRESS_REGENERATION 1 )
# Xcode needs some help with the fancy dependencies in this test.
if ( XCODE AND XCODE_VERSION VERSION_LESS 5 )
set ( HELP_XCODE 1 )
endif ( )
function ( help_xcode_depends )
if ( HELP_XCODE )
file ( GLOB_RECURSE MACRO_OBJS
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / z o t _ m a c r o _ * . o *
)
if ( MACRO_OBJS )
message ( "Helping Xcode by removing objects [${MACRO_OBJS}]" )
file ( REMOVE ${ MACRO_OBJS } )
endif ( )
endif ( )
endfunction ( )
if ( "${CMAKE_GENERATOR}" MATCHES "Ninja" )
set ( HELP_NINJA 1 ) # TODO Why is this needed?
endif ( )
# The Intel compiler causes the MSVC linker to crash during
# incremental linking, so avoid the /INCREMENTAL:YES flag.
if ( WIN32 AND "${CMAKE_CXX_COMPILER_ID}" MATCHES "Intel" )
set ( _cmake_options "-DCMAKE_EXE_LINKER_FLAGS=" )
endif ( )
if ( "${CMAKE_GENERATOR}" MATCHES "Make" )
set ( TEST_LINK_DEPENDS ${ BuildDepends_BINARY_DIR } /Project/linkdep.txt )
file ( WRITE ${ TEST_LINK_DEPENDS } "1" )
endif ( )
list ( APPEND _cmake_options "-DTEST_LINK_DEPENDS=${TEST_LINK_DEPENDS}" )
list ( APPEND _cmake_options "-DCMAKE_FORCE_DEPFILES=1" )
file ( MAKE_DIRECTORY ${ BuildDepends_BINARY_DIR } /Project )
message ( "Creating Project/foo.cxx" )
write_file ( ${ BuildDepends_BINARY_DIR } /Project/foo.cxx
" c o n s t c h a r * foo ( ) { r e t u r n \ " f o o \ " ; } " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot.hxx.in
" s t a t i c c o n s t c h a r * z o t = \ " z o t \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/dir/header.txt
" #define HEADER_STRING \"ninja\"\n" )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_custom.hxx.in
" s t a t i c c o n s t c h a r * z o t _ c u s t o m = \ " z o t _ c u s t o m \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_macro_dir.hxx
" s t a t i c c o n s t c h a r * z o t _ m a c r o _ d i r = \ " z o t _ m a c r o _ d i r \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_macro_tgt.hxx
" s t a t i c c o n s t c h a r * z o t _ m a c r o _ t g t = \ " z o t _ m a c r o _ t g t \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/link_depends_no_shared_lib.h
" #define link_depends_no_shared_lib_value 1\n")
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/link_depends_no_shared_exe.h
" #define link_depends_no_shared_exe_value 0\n")
set ( link_depends_no_shared_check_txt ${ BuildDepends_BINARY_DIR } /Project/link_depends_no_shared_check.txt )
help_xcode_depends ( )
message ( "Building project first time" )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
C M A K E _ F L A G S $ { _ c m a k e _ o p t i o n s }
O U T P U T _ V A R I A B L E O U T P U T )
if ( HELP_XCODE )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
O U T P U T _ V A R I A B L E O U T P U T )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
O U T P U T _ V A R I A B L E O U T P U T )
endif ( )
message ( "Output from first build:\n${OUTPUT}" )
if ( NOT RESULT )
message ( SEND_ERROR "Could not build test project (1)!" )
endif ( )
# find and save the ninjadep executable
set ( ninjadep ${ BuildDepends_BINARY_DIR } /Project/ninjadep ${ CMAKE_EXECUTABLE_SUFFIX } )
if ( EXISTS
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / n i n j a d e p $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
message ( "found debug" )
set ( ninjadep
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / n i n j a d e p $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
endif ( )
message ( "Running ${ninjadep} " )
execute_process ( COMMAND ${ ninjadep } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
if ( "${out}" STREQUAL "HEADER_STRING: ninja " )
message ( "Worked!" )
else ( )
message ( SEND_ERROR "Project did not rebuild properly. Output[${out}]\n"
" e x p e c t e d [ H E A D E R _ S T R I N G : n i n j a ] " )
endif ( )
set ( bar ${ BuildDepends_BINARY_DIR } /Project/bar ${ CMAKE_EXECUTABLE_SUFFIX } )
if ( EXISTS
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / b a r $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
message ( "found debug" )
set ( bar
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / b a r $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
endif ( )
set ( zot ${ BuildDepends_BINARY_DIR } /Project/zot ${ CMAKE_EXECUTABLE_SUFFIX } )
if ( EXISTS
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / z o t $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
message ( "found debug" )
set ( zot
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / z o t $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
endif ( )
message ( "Running ${bar} " )
execute_process ( COMMAND ${ bar } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
if ( "${out}" STREQUAL "foo " )
message ( "Worked!" )
else ( )
message ( SEND_ERROR "Project did not initially build properly: ${out}" )
endif ( )
message ( "Running ${zot} " )
execute_process ( COMMAND ${ zot } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
set ( VALUE_UNCHANGED "[zot] [zot_custom] [zot_macro_dir] [zot_macro_tgt] " )
if ( "${out}" STREQUAL "${VALUE_UNCHANGED}" )
message ( "Worked!" )
else ( )
message ( SEND_ERROR "Project did not initially build properly: ${out}" )
endif ( )
if ( EXISTS "${link_depends_no_shared_check_txt}" )
file ( STRINGS "${link_depends_no_shared_check_txt}" link_depends_no_shared_check LIMIT_COUNT 1 )
if ( "${link_depends_no_shared_check}" STREQUAL "1" )
message ( STATUS "link_depends_no_shared_exe is newer than link_depends_no_shared_lib as expected." )
else ( )
message ( SEND_ERROR "Project did not initially build properly: "
" l i n k _ d e p e n d s _ n o _ s h a r e d _ e x e i s o l d e r t h a n l i n k _ d e p e n d s _ n o _ s h a r e d _ l i b . " )
endif ( )
else ( )
message ( SEND_ERROR "Project did not initially build properly: "
" T a r g e t s l i n k _ d e p e n d s _ n o _ s h a r e d _ l i b a n d l i n k _ d e p e n d s _ n o _ s h a r e d _ e x e n o t b o t h b u i l t . " )
endif ( )
message ( "Waiting 3 seconds..." )
# any additional argument will cause ${bar} to wait forever
execute_process ( COMMAND ${ bar } -infinite TIMEOUT 3 OUTPUT_VARIABLE out )
message ( "Modifying Project/foo.cxx" )
write_file ( ${ BuildDepends_BINARY_DIR } /Project/foo.cxx
" c o n s t c h a r * foo ( ) { r e t u r n \ " f o o c h a n g e d \ " ; } " )
file ( WRITE "${BuildDepends_BINARY_DIR}/Project/dir/header.txt"
" #define HEADER_STRING \"ninja changed\"\n" )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot.hxx.in
" s t a t i c c o n s t c h a r * z o t = \ " z o t c h a n g e d \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_custom.hxx.in
" s t a t i c c o n s t c h a r * z o t _ c u s t o m = \ " z o t _ c u s t o m c h a n g e d \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_macro_dir.hxx
" s t a t i c c o n s t c h a r * z o t _ m a c r o _ d i r = \ " z o t _ m a c r o _ d i r c h a n g e d \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/zot_macro_tgt.hxx
" s t a t i c c o n s t c h a r * z o t _ m a c r o _ t g t = \ " z o t _ m a c r o _ t g t c h a n g e d \ " ; \ n " )
file ( WRITE ${ BuildDepends_BINARY_DIR } /Project/link_depends_no_shared_lib.h
" #define link_depends_no_shared_lib_value 0\n")
if ( TEST_LINK_DEPENDS )
file ( WRITE ${ TEST_LINK_DEPENDS } "2" )
endif ( )
help_xcode_depends ( )
message ( "Building project second time" )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
C M A K E _ F L A G S $ { _ c m a k e _ o p t i o n s }
O U T P U T _ V A R I A B L E O U T P U T )
# Xcode is in serious need of help here
if ( HELP_XCODE OR HELP_NINJA )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
O U T P U T _ V A R I A B L E O U T P U T )
try_compile ( RESULT
$ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t
$ { B u i l d D e p e n d s _ S O U R C E _ D I R } / P r o j e c t
t e s t R e b u i l d
O U T P U T _ V A R I A B L E O U T P U T )
endif ( )
message ( "Output from second build:\n${OUTPUT}" )
if ( NOT RESULT )
message ( SEND_ERROR "Could not build test project (2)!" )
endif ( )
if ( EXISTS
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / b a r $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
message ( "found debug" )
endif ( )
if ( EXISTS
" $ { B u i l d D e p e n d s _ B I N A R Y _ D I R } / P r o j e c t / D e b u g / z o t $ { C M A K E _ E X E C U T A B L E _ S U F F I X } " )
message ( "found debug" )
endif ( )
message ( "Running ${ninjadep} " )
execute_process ( COMMAND ${ ninjadep } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
if ( "${out}" STREQUAL "HEADER_STRING: ninja changed " )
message ( "Worked!" )
elseif ( CMAKE_GENERATOR STREQUAL "Visual Studio 6" )
# Tolerate failure because VS 6 does not seem to recompile ninjadep.cpp
# when the "dir/header.h" it includes changes.
else ( )
message ( SEND_ERROR "Project did not rebuild properly. Output[${out}]\n"
" e x p e c t e d [ H E A D E R _ S T R I N G : n i n j a c h a n g e d ] " )
endif ( )
message ( "Running ${bar} " )
execute_process ( COMMAND ${ bar } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
if ( "${out}" STREQUAL "foo changed " )
message ( "Worked!" )
else ( )
message ( SEND_ERROR "Project did not rebuild properly!" )
endif ( )
message ( "Running ${zot} " )
execute_process ( COMMAND ${ zot } OUTPUT_VARIABLE out RESULT_VARIABLE runResult )
string ( REGEX REPLACE "[\r\n]" " " out "${out}" )
message ( "Run result: ${runResult} Output: \" ${ out } \"")
set ( VALUE_CHANGED
" [ z o t c h a n g e d ] [ z o t _ c u s t o m c h a n g e d ] [ z o t _ m a c r o _ d i r c h a n g e d ] [ z o t _ m a c r o _ t g t c h a n g e d ] "
)
if ( "${out}" STREQUAL "${VALUE_CHANGED}" )
message ( "Worked!" )
else ( )
message ( SEND_ERROR "Project did not rebuild properly!" )
endif ( )
if ( TEST_LINK_DEPENDS )
set ( linkdep ${ BuildDepends_BINARY_DIR } /Project/linkdep ${ CMAKE_EXECUTABLE_SUFFIX } )
if ( ${ linkdep } IS_NEWER_THAN ${ TEST_LINK_DEPENDS } )
message ( "LINK_DEPENDS worked" )
else ( )
message ( SEND_ERROR " LINK_DEPENDS failed. Executable
$ { l i n k d e p }
i s n o t n e w e r t h a n d e p e n d e n c y
$ { T E S T _ L I N K _ D E P E N D S }
" )
endif ( )
endif ( )
if ( EXISTS "${link_depends_no_shared_check_txt}" )
file ( STRINGS "${link_depends_no_shared_check_txt}" link_depends_no_shared_check LIMIT_COUNT 1 )
if ( "${link_depends_no_shared_check}" STREQUAL "0" )
message ( STATUS "link_depends_no_shared_exe is older than link_depends_no_shared_lib as expected." )
elseif ( XCODE AND NOT XCODE_VERSION VERSION_LESS 5 )
message ( STATUS "Known limitation: link_depends_no_shared_exe is newer than link_depends_no_shared_lib but we cannot stop Xcode ${XCODE_VERSION} from enforcing this dependency." )
else ( )
message ( SEND_ERROR "Project did not rebuild properly: link_depends_no_shared_exe is newer than link_depends_no_shared_lib." )
endif ( )
else ( )
message ( SEND_ERROR "Project did not rebuild properly. "
" T a r g e t s l i n k _ d e p e n d s _ n o _ s h a r e d _ l i b a n d l i n k _ d e p e n d s _ n o _ s h a r e d _ e x e n o t b o t h b u i l t . " )
endif ( )