mirror of
				https://github.com/saitohirga/WSJT-X.git
				synced 2025-10-30 20:40:28 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/python
 | |
| 
 | |
| # Copyright 2012 Jurko Gospodnetic
 | |
| # Distributed under the Boost Software License, Version 1.0.
 | |
| # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
 | |
| 
 | |
| #   Tests for a bug causing Boost Build's scanner targets to be rebuilt.
 | |
| # unnecessarily in the following scenario:
 | |
| #  * We want to build target X requiring target A.
 | |
| #  * We have a multi-file action generating targets A & B.
 | |
| #  * Out action generates target B with a more recent timestamp than target A.
 | |
| #  * Target A includes target B.
 | |
| #  * Target A has a registered include scanner.
 | |
| # Now even if our targets A & B have already been built and are up-to-date
 | |
| # (e.g. in a state left by a previous successful build run), our scanner target
 | |
| # tasked with scanning target A will be marked for updating, thus causing any
 | |
| # targets depending on it to be updated/rebuilt as well.
 | |
| 
 | |
| import BoostBuild
 | |
| 
 | |
| t = BoostBuild.Tester(use_test_config=False)
 | |
| 
 | |
| t.write("foo.jam", r"""
 | |
| import common ;
 | |
| import generators ;
 | |
| import modules ;
 | |
| import type ;
 | |
| import types/cpp ;
 | |
| 
 | |
| type.register FOO : foo ;
 | |
| type.register BAR : bar ;
 | |
| generators.register-standard foo.foo : FOO : CPP BAR ;
 | |
| 
 | |
| local rule sleep-cmd ( delay )
 | |
| {
 | |
|     if [ modules.peek : NT ]
 | |
|     {
 | |
|         return ping 127.0.0.1 -n $(delay) -w 1000 >NUL ;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         return sleep $(delay) ;
 | |
|     }
 | |
| }
 | |
| 
 | |
| .touch = [ common.file-creation-command ] ;
 | |
| .sleep = [ sleep-cmd 2 ] ;
 | |
| 
 | |
| rule foo ( cpp bar : foo : properties * )
 | |
| {
 | |
|     # We add the INCLUDE relationship between our generated CPP & BAR targets
 | |
|     # explicitly instead of relying on Boost Jam's internal implementation
 | |
|     # detail - automatically adding such relationships between all files
 | |
|     # generated by the same action. This way our test will continue to function
 | |
|     # correctly even if the related Boost Jam implementation detail changes.
 | |
|     # Note that adding this relationship by adding an #include directive in our
 | |
|     # generated CPP file is not good enough as such a relationship would get
 | |
|     # added only after the scanner target's relationships have already been
 | |
|     # established and they (as affected by our initial INCLUDE relationship) are
 | |
|     # the original reason for this test failing.
 | |
|     INCLUDES $(cpp) : $(bar) ;
 | |
| }
 | |
| 
 | |
| actions foo
 | |
| {
 | |
|     $(.touch) "$(<[1])"
 | |
|     $(.sleep)
 | |
|     $(.touch) "$(<[2])"
 | |
| }
 | |
| """)
 | |
| 
 | |
| t.write(
 | |
|     'foo.py',
 | |
| """
 | |
| import os
 | |
| 
 | |
| from b2.build import type as type_, generators
 | |
| from b2.tools import common
 | |
| from b2.manager import get_manager
 | |
| 
 | |
| MANAGER = get_manager()
 | |
| ENGINE = MANAGER.engine()
 | |
| 
 | |
| type_.register('FOO', ['foo'])
 | |
| type_.register('BAR', ['bar'])
 | |
| generators.register_standard('foo.foo', ['FOO'], ['CPP', 'BAR'])
 | |
| 
 | |
| def sleep_cmd(delay):
 | |
|     if os.name == 'nt':
 | |
|         return 'ping 127.0.0.1 -n {} -w 1000 >NUL'.format(delay)
 | |
|     return 'sleep {}'.format(delay)
 | |
| 
 | |
| def foo(targets, sources, properties):
 | |
|     cpp, bar = targets
 | |
|     foo = sources[0]
 | |
|     # We add the INCLUDE relationship between our generated CPP & BAR targets
 | |
|     # explicitly instead of relying on Boost Jam's internal implementation
 | |
|     # detail - automatically adding such relationships between all files
 | |
|     # generated by the same action. This way our test will continue to function
 | |
|     # correctly even if the related Boost Jam implementation detail changes.
 | |
|     # Note that adding this relationship by adding an #include directive in our
 | |
|     # generated CPP file is not good enough as such a relationship would get
 | |
|     # added only after the scanner target's relationships have already been
 | |
|     # established and they (as affected by our initial INCLUDE relationship) are
 | |
|     # the original reason for this test failing.
 | |
|     bjam.call('INCLUDES', cpp, bar)
 | |
| 
 | |
| ENGINE.register_action(
 | |
|     'foo.foo',
 | |
|     '''
 | |
|     {touch} "$(<[1])"
 | |
|     {sleep}
 | |
|     {touch} "$(<[2])"
 | |
|     '''.format(touch=common.file_creation_command(), sleep=sleep_cmd(2))
 | |
| )
 | |
| """
 | |
| )
 | |
| 
 | |
| t.write("x.foo", "")
 | |
| t.write("jamroot.jam", """\
 | |
| import foo ;
 | |
| lib x : x.foo : <link>static ;
 | |
| """)
 | |
| 
 | |
| 
 | |
| # Get everything built once.
 | |
| t.run_build_system()
 | |
| 
 | |
| # Simply rerunning the build without touching any of its source target files
 | |
| # should not cause any files to be affected.
 | |
| t.run_build_system()
 | |
| t.expect_nothing_more()
 |