code: def recompile():
      
      pinned_packages = {}
      env_confs = discover(
          os.path.join(
              OPTIONS['base_dir'],
              '*.' + OPTIONS['in_ext'],
          ),
      )
      if OPTIONS['header_file']:
          with open(OPTIONS['header_file']) as fp:
              base_header_text = fp.read()
      else:
          base_header_text = DEFAULT_HEADER
      hashed_by_reference = set()
      for name in OPTIONS['add_hashes']:
          hashed_by_reference.update(
              reference_cluster(env_confs, name)
          )
      included_and_refs = set(OPTIONS['include_names'])
      for name in set(included_and_refs):
          included_and_refs.update(
              recursive_refs(env_confs, name)
          )
      for conf in env_confs:
          if included_and_refs:
              if conf['name'] not in included_and_refs:
                  # Skip envs that are not included or referenced by included:
                  continue
          rrefs = recursive_refs(env_confs, conf['name'])
          add_hashes = conf['name'] in hashed_by_reference
          env = Environment(
              name=conf['name'],
              ignore=merged_packages(pinned_packages, rrefs),
              forbid_post=conf['name'] in OPTIONS['forbid_post'],
              add_hashes=add_hashes,
          )
          logger.info("Locking %s to %s. References: %r",
                      env.infile, env.outfile, sorted(rrefs))
          env.create_lockfile()
          header_text = generate_hash_comment(env.infile) + base_header_text
          env.replace_header(header_text)
          env.add_references(conf['refs'])
          pinned_packages[conf['name']] = env.packages
docs: Compile requirements files for all environments.