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