module RbSys::Mkmf

def base_makefile(cargo_dir)

def base_makefile(cargo_dir)
  base_makefile = dummy_makefile(cargo_dir).join("\n")
  base_makefile.gsub!("all install static install-so install-rb", "all static install-so install-rb")
  base_makefile.gsub!("clean-so::", "clean-so:\n\t-$(Q)$(RM) $(DLLIB)\n")
  base_makefile
end

def cargo_command(cargo_dir, target)

def cargo_command(cargo_dir, target)
  spec = Struct.new(:name, :metadata).new(target, {})
  builder = Gem::Ext::CargoBuilder.new(spec)
  dest_path = File.join(cargo_dir, "target")
  args = []
  cargo_cmd = builder.cargo_command(cargo_dir, dest_path, args)
  cargo_cmd.join(" ")
end

def create_rust_makefile(target, cargo_dir = Dir.pwd)

def create_rust_makefile(target, cargo_dir = Dir.pwd)
  # rubocop:disable Style/GlobalVars
  make_install = <<~MAKE
    target_prefix = /#{target}
    CARGO_PROFILE = release
    CLEANLIBS = target/ $(RUSTLIB) $(DLLIB)
    DLLIB = $(TARGET).#{RbConfig::CONFIG["DLEXT"]}
    RUBYARCHDIR   = $(sitearchdir)$(target_prefix)
    RUSTLIB = target/$(CARGO_PROFILE)/lib$(TARGET).#{RbConfig::CONFIG["SOEXT"]}
    TARGET = #{target}
    #{base_makefile(cargo_dir)}
    #{env_vars(cargo_dir, target)}
    FORCE: ;
    $(DLLIB): FORCE
    \t#{cargo_command(cargo_dir, target)}
    \tcp $(RUSTLIB) $@
    install: $(DLLIB)
    \t$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
    all: #{$extout ? "install" : "$(DLLIB)"}
  MAKE
  File.write(File.join(cargo_dir, "Makefile"), make_install)
end

def env_vars(cargo_dir, target)

def env_vars(cargo_dir, target)
  spec = Struct.new(:name, :metadata).new(target, {})
  builder = Gem::Ext::CargoBuilder.new(spec)
  builder.build_env.map { |k, v| %($(DLLIB): export #{k} = #{v.gsub("\n", '\n')}) }.join("\n")
end