1# Copyright 2012 Steven Watanabe 2# Distributed under the Boost Software License, Version 1.0. 3# (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 4 5import modules ; 6import errors ; 7import regex ; 8import path ; 9import project ; 10import os ; 11 12rule get ( name ) 13{ 14 return $(.vars.$(name)) ; 15} 16 17rule set ( name : value * ) 18{ 19 .all-vars += $(name) ; 20 .vars.$(name) = $(value) ; 21} 22 23rule save ( ) 24{ 25 if $(.cache-file) 26 { 27 local cache-file-native = [ path.native $(.cache-file) ] ; 28 local target = <new-cache-file>$(cache-file-native) ; 29 local contents = "# Automatically generated by B2.\n# Do not edit.\n\nmodule config-cache {\n" ; 30 for local var in $(.all-vars) 31 { 32 local transformed ; 33 for local value in $(.vars.$(var)) 34 { 35 transformed += [ regex.escape $(value) : \"\\ : \\ ] ; 36 } 37 local quoted = \"$(transformed)\" ; 38 contents += " set \"$(var)\" : $(quoted:J= ) ;\n" ; 39 } 40 contents += "}\n" ; 41 FILE_CONTENTS on $(target) = $(contents) ; 42 ALWAYS $(target) ; 43 config-cache.write $(target) ; 44 UPDATE_NOW $(target) : [ modules.peek configure : .log-fd ] : ignore-minus-n ; 45 import common ; 46 common.Clean clean-all : $(target) ; 47 } 48} 49 50actions write 51{ 52 @($(STDOUT):E=$(FILE_CONTENTS:J=)) > "$(<)" 53} 54 55if [ os.name ] = VMS 56{ 57 actions write 58 { 59 @($(STDOUT):E=$(FILE_CONTENTS:J=)) | TYPE SYS$INPUT /OUT=$(<:W) 60 } 61} 62 63rule load ( cache-file ) 64{ 65 if $(.cache-file) 66 { 67 errors.error duplicate load of cache file ; 68 } 69 cache-file = [ path.native $(cache-file) ] ; 70 if [ path.exists $(cache-file) ] && ! ( --reconfigure in [ modules.peek : ARGV ] ) 71 { 72 FILE_CONTENTS on <old-cache-file>$(cache-file) = "" ; 73 config-cache.write <old-cache-file>$(cache-file) ; 74 UPDATE_NOW <old-cache-file>$(cache-file) : [ modules.peek configure : .log-fd ] ; 75 include <old-cache-file>$(cache-file) ; 76 } 77 .cache-file = $(cache-file) ; 78} 79