Commit 905c80603aac02a88247491977ed2c0677061e4c

Thomas de Grivel 2023-02-21T13:33:37

package, clean-package

diff --git a/bin/rbpkg b/bin/rbpkg
index 9ec8cfd..be82065 100755
--- a/bin/rbpkg
+++ b/bin/rbpkg
@@ -27,9 +27,10 @@ Build commands :
  test             run tests
 
 Package commands : 
- fake            -install into fake installation directory
- clean-fake      -remove fake installation directory
- package         -build package file for the checked out version
+ fake             install into fake installation directory
+ clean-fake       remove fake installation directory
+ package         .build package
+ clean-package    remove package file
  install         -install package
  uninstall       -uninstall package
 
@@ -75,6 +76,14 @@ def rbpkg
     Rbpkg.clean_build($ARGS)
   when "test"
     Rbpkg.test($ARGS)
+  when "fake"
+    Rbpkg.fake($ARGS)
+  when "clean-fake"
+    Rbpkg.clean_fake($ARGS)
+  when "package"
+    Rbpkg.package($ARGS)
+  when "clean-package"
+    Rbpkg.clean_package($ARGS)
   when "info"
     Rbpkg.info($ARGS)
   else
diff --git a/lib/rbpkg.rb b/lib/rbpkg.rb
index 8f2a82e..875c9e5 100644
--- a/lib/rbpkg.rb
+++ b/lib/rbpkg.rb
@@ -43,6 +43,18 @@ module Rbpkg
     end
   end
 
+  def self.clean_fake(repos)
+    repos.each do |name|
+      Repos.repo(name).clean_fake()
+    end
+  end
+
+  def self.clean_package(repos)
+    repos.each do |name|
+      Repos.repo(name).clean_package()
+    end
+  end
+
   def self.clean_sources(repos)
     repos.each do |name|
       Repos.repo(name).clean_sources()
@@ -71,6 +83,16 @@ module Rbpkg
     end
   end
 
+  def self.fake(repos)
+    repos.each do |name|
+      Repos.repo(name).fake()
+    end
+  end
+
+  def self.fake_dir
+    "#{target_dir}/fake"
+  end
+
   def self.fetch(repos)
     repos.each do |name|
       Repos.repo(name).fetch()
@@ -151,12 +173,34 @@ module Rbpkg
     "#{target_dir}/obj"
   end
 
+  def self.package(repos)
+    repos.each do |name|
+      Repos.repo(name).package()
+    end
+  end
+
+  def self.package_dir
+    "#{target_dir}/package"
+  end
+
+  def self.prefix
+    dir
+  end
+
   def self.pull(repos)
     repos.each do |name|
       Repos.repo(name).pull()
     end
   end
 
+  def self.sha256(path)
+    c = "sha256 #{sh_quote(path)}"
+    verbose(1, c)
+    r = `#{c}`
+    raise "sha256(#{path.inspect}) failed" unless $?.success?
+    r
+  end
+
   def self.src_dir
     "#{dir}/src"
   end
diff --git a/lib/rbpkg/repo.rb b/lib/rbpkg/repo.rb
index 426ee81..5491aca 100644
--- a/lib/rbpkg/repo.rb
+++ b/lib/rbpkg/repo.rb
@@ -48,6 +48,30 @@ class Rbpkg::Repo
     tag_remove("configure-done")
   end
 
+  def clean_fake
+    if File.directory?(fake_dir)
+      cmd! "rm -rf #{sh_quote(fake_dir)}"
+    end
+  end
+
+  def clean_package
+    if File.file?(package_checksum)
+      cmd! "rm #{sh_quote(package_checksum)}"
+    end
+    if File.file?(package_tar)
+      cmd! "rm #{sh_quote(package_tar)}"
+    end
+    if File.file?(package_tar_bz2)
+      cmd! "rm #{sh_quote(package_tar_bz2)}"
+    end
+    if File.file?(package_tar_gz)
+      cmd! "rm #{sh_quote(package_tar_gz)}"
+    end
+    if File.file?(package_tar_xz)
+      cmd! "rm #{sh_quote(package_tar_xz)}"
+    end
+  end
+
   def clean_sources
     tag_remove("build-done") if tag_present?("build-done")
     tag_remove("configure-done") if tag_present?("configure-done")
@@ -66,9 +90,11 @@ class Rbpkg::Repo
     if ! tag_present?("configure-done")
       autogen()
       r = if File.executable?("#{src_dir}/configure")
-            cmd! "cd #{sh_quote(src_dir)} && ./configure"
+            cmd! "cd #{sh_quote(src_dir)} && ./configure --prefix #{sh_quote(Rbpkg.prefix)}"
           elsif File.exists?("#{src_dir}/configure.sh")
-            cmd! "cd #{sh_quote(src_dir)} && sh configure.sh"
+            cmd! "cd #{sh_quote(src_dir)} && sh configure.sh --prefix #{sh_quote(Rbpkg.prefix)}"
+          elsif File.exists?("#{src_dir}/CMakeLists.txt")
+            cmd! "cmake -S #{sh_quote(src_dir)} -B #{sh_quote(obj_dir)} -D CMAKE_INSTALL_PREFIX:PATH=#{sh_quote(Rbpkg.prefix)} -D BUILD_SHARED_LIBS=ON"
           end      
       tag_set("configure-done") if r
       r
@@ -79,6 +105,23 @@ class Rbpkg::Repo
     "#{File.basename(File.dirname(git_url))}/#{name}"
   end
 
+  def fake
+    build()
+    if File.directory?(fake_dir)
+      cmd! "rm -rf #{sh_quote(fake_dir)}"
+    end
+    cmd! "mkdir -p #{sh_quote(fake_dir)}"
+    if File.file?("#{src_dir}/Makefile")
+      cmd! "cd #{sh_quote(src_dir)} && make prefix=#{sh_quote(fake_dir)} install"
+    elsif File.file?("#{src_dir}/CMakeLists.txt")
+      cmd! "cmake --install #{sh_quote(obj_dir)} --prefix #{sh_quote(fake_dir)}"
+    end
+  end
+
+  def fake_dir
+    "#{Rbpkg.fake_dir}/#{dir}#{Rbpkg.prefix}"
+  end
+
   def fetch
     cmd! "cd #{sh_quote(src_dir!)} && git fetch"
   end
@@ -143,6 +186,64 @@ class Rbpkg::Repo
     "#{Rbpkg.obj_dir}/#{dir}"
   end
 
+  def package
+    return if File.file?(package_tar_bz2) &&
+              File.file?(package_tar_gz) &&
+              File.file?(package_tar_xz)
+    fake()
+    cmd! "mkdir -p #{sh_quote(package_dir)}" unless File.directory?(package_dir)
+    package_checksum_compute
+    sh_package_tar = sh_quote(package_tar)
+    cmd! "cd #{sh_quote(fake_dir)} && pax -w . > #{sh_package_tar} && bzip2 -9 < #{sh_package_tar} > #{sh_quote(package_tar_bz2)} && gzip -9 < #{sh_package_tar} > #{sh_quote(package_tar_gz)} && xz -9 < #{sh_package_tar} > #{sh_quote(package_tar_xz)}"
+  end
+
+  def package_checksum_compute
+    File.open(package_checksum, "w") do |output|
+      Dir.chdir(fake_dir) do
+        package_checksum_rec(nil, Dir.new(".").children, output)
+      end
+    end
+  end
+
+  def package_checksum_rec(path, files, output)
+    files.sort.each do |f|
+      path_f = path ? "#{path}/#{f}" : f
+      if File.directory?(path_f)
+        package_checksum_rec(path_f, Dir.new(path_f).children, output)
+      else
+        output.write(Rbpkg.sha256(path_f))
+      end
+    end
+  end
+
+  def package_checksum
+    package_path(".SHA256")
+  end
+
+  def package_dir
+    File.dirname(package_path)
+  end
+
+  def package_path(suffix = "")
+    "#{Rbpkg.package_dir}/#{dir}-#{version}#{suffix}"
+  end
+
+  def package_tar
+    package_path(".tar")
+  end
+
+  def package_tar_bz2
+    package_path(".tar.bz2")
+  end
+
+  def package_tar_gz
+    package_path(".tar.gz")
+  end
+
+  def package_tar_xz
+    package_path(".tar.xz")
+  end
+
   def pull
     cmd! "cd #{sh_quote(src_dir!)} && git pull && git submodule update"
   end