module RbSys::Mkmf
def create_rust_makefile(target, &blk)
- Example: Configure a custom build profile -
Example: Basic -
def create_rust_makefile(target, &blk) if target.include?("/") target_prefix, target = File.split(target) target_prefix[0, 0] = "/" else target_prefix = "" end spec = Struct.new(:name, :metadata).new(target, {}) builder = CargoBuilder.new(spec) yield builder if blk srcprefix = "$(srcdir)/#{builder.ext_dir}".chomp("/") RbConfig.expand(srcdir = srcprefix.dup) full_cargo_command = cargo_command(srcdir, builder) # rubocop:disable Style/GlobalVars make_install = +<<~MAKE RB_SYS_CARGO_PROFILE ?= #{builder.profile} RB_SYS_CARGO_FEATURES ?= #{builder.features.join(",")} CARGO ?= cargo ifeq ($(RB_SYS_CARGO_PROFILE),dev) RB_SYS_TARGET_DIR ?= debug else RB_SYS_TARGET_DIR ?= $(RB_SYS_CARGO_PROFILE) endif target_prefix = #{target_prefix} TARGET_NAME = #{target[/\A\w+/]} TARGET_ENTRY = #{RbConfig::CONFIG["EXPORT_PREFIX"]}Init_$(TARGET_NAME) CLEANLIBS = $(RUSTLIB) $(DLLIB) $(DEFFILE) DISTCLEANDIRS = target/ RUBYARCHDIR = $(sitearchdir)$(target_prefix) RUSTLIB = #{dllib_path(builder)} TARGET = #{target} DLLIB = $(TARGET).#{RbConfig::CONFIG["DLEXT"]} TARGET_DIR = #{Dir.pwd}/target/$(RB_SYS_TARGET_DIR) DEFFILE = $(TARGET_DIR)/$(TARGET)-$(arch).def #{base_makefile(srcdir)} #{env_vars(builder)} FORCE: ; $(TARGET_DIR): \t$(ECHO) creating target directory \\($(@)\\) \t$(Q) $(MAKEDIRS) $(TARGET_DIR) $(DEFFILE): $(TARGET_DIR) \t$(ECHO) generating $(@) \t$(Q) ($(COPY) $(srcdir)/$(TARGET).def $@ 2> /dev/null) || (echo EXPORTS && echo $(TARGET_ENTRY)) > $@ $(DLLIB): $(DEFFILE) FORCE \t$(ECHO) generating $(@) \\("$(RB_SYS_CARGO_PROFILE)"\\) \t$(Q) #{full_cargo_command} \t$(Q) $(COPY) "$(RUSTLIB)" $@ install: $(DLLIB) Makefile \t$(ECHO) installing $(DLLIB) \t$(Q) $(MAKEDIRS) $(RUBYARCHDIR) \t$(Q) $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) all: #{$extout ? "install" : "$(DLLIB)"} MAKE gsub_cargo_command!(make_install, builder: builder) File.write("Makefile", make_install) end