class Package::Backend::Packaging getter name : String def initialize(@name, &block : Proc(Package, Bool)) @callback = block end def package(package : Package) @callback.call package end end class Package::Context property working_directory = "/tmp/package" property sources_directory = Dir.current property packages_directory = Dir.current getter packaging_backends = [] of Backend::Packaging getter building_backends = [] of Backend::Building def initialize @packaging_backends << Backend::Packaging.new "pkgutils" do |package| puts "#{package.fake_root_directory} -> #{packages_directory}/#{package.name}##{package.version}.pkg.tar.xz" pp! r = run package.fake_root_directory, "tar", ["cJf", "#{packages_directory}/#{package.name}##{package.version}.pkg.tar.xz", "."] r.exit_status == 0 end @selected_packaging_backend = @packaging_backends[0] @building_backends << Backend::Building.new "configure", "autotools" do |context, recipe| Dir.cd recipe.dirname unless File.exists? "configure" next BuildStatus::Pass end child = context.run "./configure", ["--prefix=/package"] if child.exit_status == 0 BuildStatus::Success else BuildStatus::Failed end end @building_backends << Backend::Building.new "build", "make" do |context, recipe| Dir.cd recipe.dirname unless File.exists? "Makefile" next BuildStatus::Pass end child = context.run "make" if child.exit_status == 0 BuildStatus::Success else BuildStatus::Failed end end end def packaging_backend=(name : String) @selected_packaging_backend = @packaging_backends.find(&.name.==(name)).not_nil! end def packaging_backend=(backend : Backend::Packaging) @selected_packaging_backend = backend end def run(chdir, command, args) Process.run command, args, chdir: chdir, output: Process::Redirect::Inherit, error: Process::Redirect::Inherit end def run(command, args) run nil, command, args end def run(command) run nil, command, nil end def package(package : Package) : Bool @selected_packaging_backend.package package end end