141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								#!/usr/bin/python
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Copyright 2003 Vladimir Prus
							 | 
						||
| 
								 | 
							
								# Distributed under the Boost Software License, Version 1.0.
							 | 
						||
| 
								 | 
							
								# (See accompanying file LICENSE.txt or https://www.bfgroup.xyz/b2/LICENSE.txt)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import BoostBuild
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t = BoostBuild.Tester(arguments=["--config="], pass_toolset=0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.write("source.input", "")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.write("test-properties.jam", """
							 | 
						||
| 
								 | 
							
								import feature : feature ;
							 | 
						||
| 
								 | 
							
								import generators ;
							 | 
						||
| 
								 | 
							
								import toolset ;
							 | 
						||
| 
								 | 
							
								import type ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# We're not using the toolset at all, and we want to
							 | 
						||
| 
								 | 
							
								# suppress toolset initialization to avoid surprises.
							 | 
						||
| 
								 | 
							
								feature.extend toolset : null ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type.register CHECK : check ;
							 | 
						||
| 
								 | 
							
								type.register INPUT : input ;
							 | 
						||
| 
								 | 
							
								feature expected-define : : free ;
							 | 
						||
| 
								 | 
							
								feature unexpected-define : : free ;
							 | 
						||
| 
								 | 
							
								toolset.flags test-properties DEFINES : <define> ;
							 | 
						||
| 
								 | 
							
								toolset.flags test-properties EXPECTED : <expected-define> ;
							 | 
						||
| 
								 | 
							
								toolset.flags test-properties UNEXPECTED : <unexpected-define> ;
							 | 
						||
| 
								 | 
							
								generators.register-standard test-properties.check : INPUT : CHECK ;
							 | 
						||
| 
								 | 
							
								rule check ( target : source : properties * )
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    local defines = [ on $(target) return $(DEFINES) ] ;
							 | 
						||
| 
								 | 
							
								    for local macro in [ on $(target) return $(EXPECTED) ]
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if ! ( $(macro) in $(defines) )
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            EXIT expected $(macro) for $(target) in $(properties) : 1 ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    for local macro in [ on $(target) return $(UNEXPECTED) ]
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if $(macro) in $(defines)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            EXIT unexpected $(macro) for $(target) in $(properties) : 1 ;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								actions check
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    echo okay > $(<)
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								""")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.write("jamfile.jam", """
							 | 
						||
| 
								 | 
							
								import test-properties ;
							 | 
						||
| 
								 | 
							
								# See if default value of composite feature 'cf' will be expanded to
							 | 
						||
| 
								 | 
							
								# <define>CF_IS_OFF.
							 | 
						||
| 
								 | 
							
								check a : source.input : <expected-define>CF_IS_OFF ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# See if subfeature in requirements in expanded.
							 | 
						||
| 
								 | 
							
								check b : source.input : <cf>on-1
							 | 
						||
| 
								 | 
							
								    <expected-define>CF_1 <unexpected-define>CF_IS_OFF ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# See if conditional requirements are recursively expanded.
							 | 
						||
| 
								 | 
							
								check c : source.input : <toolset>null:<variant>release
							 | 
						||
| 
								 | 
							
								    <variant>release:<define>FOO <expected-define>FOO
							 | 
						||
| 
								 | 
							
								    ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Composites specified in the default build should not
							 | 
						||
| 
								 | 
							
								# be expanded if they are overridden in the the requirements.
							 | 
						||
| 
								 | 
							
								check d : source.input : <cf>on <unexpected-define>CF_IS_OFF : <cf>off ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Overriding a feature should clear subfeatures and
							 | 
						||
| 
								 | 
							
								# apply default values of subfeatures.
							 | 
						||
| 
								 | 
							
								check e : source.input : <cf>always
							 | 
						||
| 
								 | 
							
								    <unexpected-define>CF_IS_OFF <expected-define>CF_2 <unexpected-define>CF_1
							 | 
						||
| 
								 | 
							
								  : <cf>on-1  ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Subfeatures should not be changed if the parent feature doesn't change
							 | 
						||
| 
								 | 
							
								check f : source.input : <cf>on <expected-define>CF_1 : <cf>on-1 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# If a subfeature is not specific to the value of the parent feature,
							 | 
						||
| 
								 | 
							
								# then changing the parent value should not clear the subfeature.
							 | 
						||
| 
								 | 
							
								check g : source.input : <fopt>off <expected-define>FOPT_2 : <fopt>on-2 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# If the default value of a composite feature adds an optional
							 | 
						||
| 
								 | 
							
								# feature which has a subfeature with a default, then that
							 | 
						||
| 
								 | 
							
								# default should be added.
							 | 
						||
| 
								 | 
							
								check h : source.input : <expected-define>CX_2 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# If the default value of a feature is used, then the
							 | 
						||
| 
								 | 
							
								# default value of its subfeatures should also be used.
							 | 
						||
| 
								 | 
							
								check i : source.input : <expected-define>SF_1 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# Subfeatures should be expanded when listed in a
							 | 
						||
| 
								 | 
							
								# target reference.
							 | 
						||
| 
								 | 
							
								check j-impl : source.input : <expected-define>CF_1 ;
							 | 
						||
| 
								 | 
							
								explicit j-impl ;
							 | 
						||
| 
								 | 
							
								alias j : j-impl/<cf>on-1 ;
							 | 
						||
| 
								 | 
							
								""")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.write("jamroot.jam", """
							 | 
						||
| 
								 | 
							
								import feature ;
							 | 
						||
| 
								 | 
							
								feature.feature cf : off on always : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <cf>off : <define>CF_IS_OFF ;
							 | 
						||
| 
								 | 
							
								feature.subfeature cf on : version : 1 2 : composite optional incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <cf-on:version>1 : <define>CF_1 ;
							 | 
						||
| 
								 | 
							
								feature.subfeature cf always : version : 1 2 : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <cf-always:version>1 : <define>CF_2 ;
							 | 
						||
| 
								 | 
							
								feature.feature fopt : on off : optional incidental ;
							 | 
						||
| 
								 | 
							
								feature.subfeature fopt : version : 1 2 : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <fopt-version>2 : <define>FOPT_2 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								feature.feature cx1 : on : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.feature cx2 : on : optional incidental ;
							 | 
						||
| 
								 | 
							
								feature.subfeature cx2 on : sub : 1 : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <cx1>on : <cx2>on ;
							 | 
						||
| 
								 | 
							
								feature.compose <cx2-on:sub>1 : <define>CX_2 ;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								feature.feature sf : a : incidental ;
							 | 
						||
| 
								 | 
							
								feature.subfeature sf a : sub : 1 : composite incidental ;
							 | 
						||
| 
								 | 
							
								feature.compose <sf-a:sub>1 : <define>SF_1 ;
							 | 
						||
| 
								 | 
							
								""")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.expand_toolset("jamfile.jam")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.run_build_system()
							 | 
						||
| 
								 | 
							
								t.expect_addition(["bin/debug/a.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/b.check",
							 | 
						||
| 
								 | 
							
								                   "bin/null/release/c.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/d.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/e.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/f.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/g.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/h.check",
							 | 
						||
| 
								 | 
							
								                   "bin/debug/i.check"])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								t.cleanup()
							 |