github.com/coreos/rocket@v1.30.1-0.20200224141603-171c416fac02/tools/depsgen/mkfile.go (about) 1 // Copyright 2015 The rkt Authors 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package main 16 17 import ( 18 "strings" 19 ) 20 21 const ( 22 // fileDepMkTemplate holds a template for file-based 23 // dependency tracking make file. 24 fileDepMkTemplate = `# generated by !!!DEPS_GEN_APP_NAME!!! 25 26 define _DEPS_GEN_GET_ALL_FILES_ 27 !!!DEPS_GEN_FILES_GENERATOR!!! 28 endef 29 30 _DEPS_GEN_ALL_FILES_STORED_ := !!!DEPS_GEN_ALL_FILES_STORED!!! 31 32 _DEPS_GEN_SPACE_ := 33 _DEPS_GEN_SPACE_ += 34 35 _DEPS_GEN_F1_ := $(sort $(strip $(_DEPS_GEN_ALL_FILES_STORED_))) 36 _DEPS_GEN_F2_ := $(sort $(strip $(call _DEPS_GEN_GET_ALL_FILES_))) 37 38 ifeq ($(_DEPS_GEN_F1_),$(_DEPS_GEN_F2_)) 39 40 !!!DEPS_GEN_TARGET!!!: $(_DEPS_GEN_ALL_FILES_STORED_) 41 42 else 43 44 $(foreach t,!!!DEPS_GEN_TARGET!!!, \ 45 $(eval _DEPS_GEN_RL_INVALIDATE_ := _DEPS_GEN_RL_$(call escape-for-file,$t)_INVALIDATE_) \ 46 $(call add-dependency,$t,$(_DEPS_GEN_RL_INVALIDATE_)) \ 47 $(call generate-strict-rule,$(_DEPS_GEN_RL_INVALIDATE_),,, \ 48 $(call vb,v2,INVALIDATE,$(call vsp,$t)) \ 49 $(call v3,echo Invalidating $t;) \ 50 $(call v3,echo Prerequisites stored in deps file that are not in currently on disk: $(filter-out $(_DEPS_GEN_F2_),$(_DEPS_GEN_F1_));) \ 51 $(call v3,echo Prerequisites currently on disk that are not stored in deps file: $(filter-out $(_DEPS_GEN_F1_),$(_DEPS_GEN_F2_));)) \ 52 $(call add-dependency,.PHONY,$(_DEPS_GEN_RL_INVALIDATE_)) \ 53 $(call undefine-namespaces,_DEPS_GEN_RL)) 54 55 endif 56 57 $(call undefine-namespaces,_DEPS_GEN) 58 ` 59 60 // kvStoredPrefix is used to prefix the variable name we want 61 // to store (so actual variable checked at runtime is FOO and 62 // its stored value from previous run is $(kvStoredPrefix)FOO. 63 kvStoredPrefix = "_DEPS_GEN_STORED_" 64 // kvDepMkTemplate holds a template for key-value-based 65 // dependency tracking make file. 66 kvDepMkTemplate = `# generated by !!!DEPS_GEN_APP_NAME!!! 67 _DEPS_GEN_VARIABLES_ := !!!DEPS_GEN_VARIABLES!!! 68 !!!DEPS_GEN_STORED_VALUES!!! 69 _DEPS_GEN_DO_INVALIDATE_ := no 70 71 $(foreach v,$(_DEPS_GEN_VARIABLES_), \ 72 $(if $(call equal,$($v),$(!!!DEPS_GEN_STORED_PREFIX!!!$v)), \ 73 , \ 74 $(eval _DEPS_GEN_DO_INVALIDATE_ := yes) \ 75 $(eval _DEPS_GEN_DIFFS_ += $v))) 76 77 ifeq ($(_DEPS_GEN_DO_INVALIDATE_),yes) 78 79 $(foreach t,!!!DEPS_GEN_TARGET!!!, \ 80 $(eval _DEPS_GEN_RL_INVALIDATE_ := _DEPS_GEN_RL_$(call escape-for-file,$t)_INVALIDATE_KV_) \ 81 $(call add-dependency,$t,$(_DEPS_GEN_RL_INVALIDATE_)) \ 82 $(call generate-strict-rule,$(_DEPS_GEN_RL_INVALIDATE_),,, \ 83 $(call vb,v2,INVALIDATE,$(call vsp,$t)) \ 84 $(call v3,echo Invalidating $t;) \ 85 $(call v3,$(foreach k,$(_DEPS_GEN_DIFFS_), \ 86 echo Differing key: $k; \ 87 echo Value stored in deps file: $(!!!DEPS_GEN_STORED_PREFIX!!!$k); \ 88 echo Value currently used: $($k);))) \ 89 $(call add-dependency,.PHONY,$(_DEPS_GEN_RL_INVALIDATE_)) \ 90 $(call undefine-namespaces,_DEPS_GEN_RL)) 91 92 endif 93 94 $(call undefine-namespaces,_DEPS_GEN) 95 ` 96 ) 97 98 // GenerateFileDeps returns contents of make file describing 99 // dependencies of given target on given files and checking if files 100 // weren't added or removed in directories where given files are. 101 func GenerateFileDeps(target, filesGenerator string, files []string) string { 102 return replacePlaceholders(fileDepMkTemplate, 103 "DEPS_GEN_APP_NAME", appName(), 104 "DEPS_GEN_FILES_GENERATOR", filesGenerator, 105 "DEPS_GEN_ALL_FILES_STORED", strings.Join(files, " "), 106 "DEPS_GEN_TARGET", target, 107 ) 108 } 109 110 func GenerateKvDeps(target string, keysValues map[string]string) string { 111 variables := make([]string, 0, len(keysValues)) 112 storedValues := make([]string, 0, len(keysValues)) 113 for k, v := range keysValues { 114 variables = append(variables, k) 115 storedValues = append(storedValues, kvStoredPrefix+k+" := "+v) 116 } 117 118 return replacePlaceholders(kvDepMkTemplate, 119 "DEPS_GEN_APP_NAME", appName(), 120 "DEPS_GEN_VARIABLES", strings.Join(variables, " "), 121 "DEPS_GEN_STORED_VALUES", strings.Join(storedValues, "\n"), 122 "DEPS_GEN_STORED_PREFIX", kvStoredPrefix, 123 "DEPS_GEN_TARGET", target, 124 ) 125 }