diff --git a/src/context.cr b/src/context.cr index 188e15d..29e4b4b 100644 --- a/src/context.cr +++ b/src/context.cr @@ -27,6 +27,16 @@ class Package::Backend::Packaging end end +class Package::Backend::Splitter + def initialize(&block : Proc(Recipe, Package)) + @callback = block + end + + def create_split(recipe : Recipe) : Package + @callback.call recipe + end +end + class Package::Context property working_directory = "/tmp/package" property sources_directory = Dir.current @@ -34,6 +44,7 @@ class Package::Context getter packaging_backends = [] of Backend::Packaging getter building_backends = [] of Backend::Building + getter splitter_backends = [] of Backend::Splitter # Well, this will need configuration, auto-detection and conversion, # but it’ll be kind of enough for now. @@ -119,6 +130,20 @@ class Package::Context BuildStatus::Failed end end + + @splitter_backends << Backend::Splitter.new do |recipe| + Package.new(recipe, true).tap do |split| + split.name = "#{recipe.name}-man" + split.files = ["/usr/share/man", "/package/share/man"] + end + end + + @splitter_backends << Backend::Splitter.new do |recipe| + Package.new(recipe, true).tap do |split| + split.name = "#{recipe.name}-dev" + split.files = ["/usr/include", "/package/include"] + end + end end def packaging_backend=(name : String) diff --git a/src/main.cr b/src/main.cr index 636e5ff..fe55d00 100644 --- a/src/main.cr +++ b/src/main.cr @@ -25,10 +25,13 @@ Context.new().tap do |context| recipe.description = "The GNU Hello program produces a familiar, friendly greeting." recipe.dependencies << "gettext" - recipe.packages << Package::Package.new(recipe).tap do |package| - package.name = "#{recipe.name}-man" - package.files = ["/package/share/man"] - end + recipe.auto_split + + # Should be automatic now. + #recipe.packages << Package::Package.new(recipe).tap do |package| + # package.name = "#{recipe.name}-man" + # package.files = ["/package/share/man"] + #end recipe.download recipe.extract diff --git a/src/package.cr b/src/package.cr index 8a51337..263578b 100644 --- a/src/package.cr +++ b/src/package.cr @@ -1,8 +1,9 @@ class Package::Package getter recipe : Recipe + getter automatic : Bool - def initialize(@recipe) + def initialize(@recipe, @automatic = false) end macro inherit(attribute) diff --git a/src/recipe.cr b/src/recipe.cr index a5e29ff..3359b49 100644 --- a/src/recipe.cr +++ b/src/recipe.cr @@ -134,12 +134,14 @@ class Package::Recipe next if files.nil? # Should only happen to @packages[0]. # TODO: ↑ add public APIs that ensure it. - Dir.mkdir_p package.fake_root_directory - # FIXME: What do we do if those are not on the filesystem? files.each do |file| - puts "#{package.fake_root_directory}#{File.dirname file}" - Dir.mkdir_p "#{package.fake_root_directory}#{File.dirname file}" + origin = "#{fake_root_directory}#{file}" + destination ="#{package.fake_root_directory}#{file}" + + next unless File.exists? origin + + Dir.mkdir_p File.dirname destination FileUtils.mv( "#{fake_root_directory}#{file}", @@ -154,11 +156,22 @@ class Package::Recipe end end + def auto_split + @context.splitter_backends.each do |backend| + @packages << backend.create_split self + end + end + # TODO: # - Errors management. Stop at first failure? # - Splits. This should be done between #build and #package. def package + # FIXME: if package.automatic and no file, do not build. @packages.find do |package| + if package.automatic && ! File.exists? package.fake_root_directory + next + end + ! @context.package package end end