parameters: (self, manifest)
return_statement: return h
docstring: This recursive function computes a hash for a given manifest.
          The hash takes into account some environmental factors on the
          host machine and includes the hashes of its dependencies.
          No caching of the computation is performed, which is theoretically
          wasteful but the computation is fast enough that it is not required
          to cache across multiple invocations.
docstring_summary: This recursive function computes a hash for a given manifest.
          The hash takes into account some environmental factors on the
          host machine and includes the hashes of its dependencies.
          No caching of the computation is performed, which is theoretically
          wasteful but the computation is fast enough that it is not required
          to cache across multiple invocations.
docstring_tokens: This recursive function computes a hash for a given manifest . The hash takes into account some environmental factors on the host machine and includes the hashes of its dependencies . No caching of the computation is performed which is theoretically wasteful but the computation is fast enough that it is not required to cache across multiple invocations .
function: def _compute_project_hash(self, manifest):
          """This recursive function computes a hash for a given manifest.
          The hash takes into account some environmental factors on the
          host machine and includes the hashes of its dependencies.
          No caching of the computation is performed, which is theoretically
          wasteful but the computation is fast enough that it is not required
          to cache across multiple invocations."""
          ctx = self.ctx_gen.get_context(manifest.name)
  
          hasher = hashlib.sha256()
          # Some environmental and configuration things matter
          env = {}
          env["install_dir"] = self.build_opts.install_dir
          env["scratch_dir"] = self.build_opts.scratch_dir
          env["vcvars_path"] = self.build_opts.vcvars_path
          env["os"] = self.build_opts.host_type.ostype
          env["distro"] = self.build_opts.host_type.distro
          env["distro_vers"] = self.build_opts.host_type.distrovers
          env["shared_libs"] = str(self.build_opts.shared_libs)
          for name in [
              "CXXFLAGS",
              "CPPFLAGS",
              "LDFLAGS",
              "CXX",
              "CC",
              "GETDEPS_CMAKE_DEFINES",
          ]:
              env[name] = os.environ.get(name)
          for tool in ["cc", "c++", "gcc", "g++", "clang", "clang++"]:
              env["tool-%s" % tool] = path_search(os.environ, tool)
          for name in manifest.get_section_as_args("depends.environment", ctx):
              env[name] = os.environ.get(name)
  
          fetcher = self.create_fetcher(manifest)
          env["fetcher.hash"] = fetcher.hash()
  
          for name in sorted(env.keys()):
              hasher.update(name.encode("utf-8"))
              value = env.get(name)
              if value is not None:
                  try:
                      hasher.update(value.encode("utf-8"))
                  except AttributeError as exc:
                      raise AttributeError("name=%r, value=%r: %s" % (name, value, exc))
  
          manifest.update_hash(hasher, ctx)
  
          dep_list = manifest.get_dependencies(ctx)
          for dep in dep_list:
              dep_manifest = self.load_manifest(dep)
              dep_hash = self.get_project_hash(dep_manifest)
              hasher.update(dep_hash.encode("utf-8"))
  
          # Use base64 to represent the hash, rather than the simple hex digest,
          # so that the string is shorter.  Use the URL-safe encoding so that
          # the hash can also be safely used as a filename component.
          h = base64.urlsafe_b64encode(hasher.digest()).decode("ascii")
          # ... and because cmd.exe is troublesome with `=` signs, nerf those.
          # They tend to be padding characters at the end anyway, so we can
          # safely discard them.
          h = h.replace("=", "")
  
          return h
function_tokens: def _compute_project_hash ( self , manifest ) : ctx = self . ctx_gen . get_context ( manifest . name ) hasher = hashlib . sha256 ( ) # Some environmental and configuration things matter env = { } env [ "install_dir" ] = self . build_opts . install_dir env [ "scratch_dir" ] = self . build_opts . scratch_dir env [ "vcvars_path" ] = self . build_opts . vcvars_path env [ "os" ] = self . build_opts . host_type . ostype env [ "distro" ] = self . build_opts . host_type . distro env [ "distro_vers" ] = self . build_opts . host_type . distrovers env [ "shared_libs" ] = str ( self . build_opts . shared_libs ) for name in [ "CXXFLAGS" , "CPPFLAGS" , "LDFLAGS" , "CXX" , "CC" , "GETDEPS_CMAKE_DEFINES" , ] : env [ name ] = os . environ . get ( name ) for tool in [ "cc" , "c++" , "gcc" , "g++" , "clang" , "clang++" ] : env [ "tool-%s" % tool ] = path_search ( os . environ , tool ) for name in manifest . get_section_as_args ( "depends.environment" , ctx ) : env [ name ] = os . environ . get ( name ) fetcher = self . create_fetcher ( manifest ) env [ "fetcher.hash" ] = fetcher . hash ( ) for name in sorted ( env . keys ( ) ) : hasher . update ( name . encode ( "utf-8" ) ) value = env . get ( name ) if value is not None : try : hasher . update ( value . encode ( "utf-8" ) ) except AttributeError as exc : raise AttributeError ( "name=%r, value=%r: %s" % ( name , value , exc ) ) manifest . update_hash ( hasher , ctx ) dep_list = manifest . get_dependencies ( ctx ) for dep in dep_list : dep_manifest = self . load_manifest ( dep ) dep_hash = self . get_project_hash ( dep_manifest ) hasher . update ( dep_hash . encode ( "utf-8" ) ) # Use base64 to represent the hash, rather than the simple hex digest, # so that the string is shorter.  Use the URL-safe encoding so that # the hash can also be safely used as a filename component. h = base64 . urlsafe_b64encode ( hasher . digest ( ) ) . decode ( "ascii" ) # ... and because cmd.exe is troublesome with `=` signs, nerf those. # They tend to be padding characters at the end anyway, so we can # safely discard them. h = h . replace ( "=" , "" ) return h