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  }