<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[741] trunk/alexandria: Fixed deb-file generation, debian:deb, several files were left out</title>
</head>
<body>
<div id="msg">
<dl>
<dt>Revision</dt> <dd>741</dd>
<dt>Author</dt> <dd>cathalmagus</dd>
<dt>Date</dt> <dd>2007-10-02 12:51:58 -0400 (Tue, 02 Oct 2007)</dd>
</dl>
<h3>Log Message</h3>
<pre>Fixed deb-file generation, debian:deb, several files were left out
before. The task now cleans up the temporary build directory, you can
run debian:build_deb to leave it there. There is also a hack to
include autogenerated ruby files, there should be a nicer way of doing
this.
Deb file installation was tested on gNewSense 1.1 (a fully Free
Software GNU/Linux distribution based on Ubuntu). Following tips from
the CLUG Wiki (wiki.clug.org.za), I set up a simple local repository:
# mkdir /home/debs
# cd /home/debs
# cp ~/alexandria/*.deb .
# dpkg-scanpackages . /dev/null | gzip -c -9 > Packages.gz
Then add this line to the top of /etc/apt/sources.list
deb file:///home/debs /
And run
# apt-get update
# apt-get install alexandria</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkalexandriaRakefile">trunk/alexandria/Rakefile</a></li>
<li><a href="#trunkalexandriatasksrb">trunk/alexandria/tasks.rb</a></li>
</ul>
<h3>Property Changed</h3>
<ul>
<li><a href="#trunkalexandria">trunk/alexandria/</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkalexandria"></a>
<div class="propset"><h4>Property changes: trunk/alexandria</h4>
<pre class="diff"><span>
<span class="cx">Name: svn:ignore
</span><span class="cx"> - InstalledFiles
</span><span class="cx">config.save
</span><span class="cx">alexandria.desktop
</span><span class="cx">alexandria.desktop.in.h
</span><span class="cx"> + InstalledFiles
</span><span class="cx">config.save
</span><span class="cx">alexandria.desktop
</span><span class="cx">alexandria.desktop.in.h
</span><span class="cx">*.deb
</span></span></pre></div>
<a id="trunkalexandriaRakefile"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/Rakefile (740 => 741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/Rakefile        2007-10-02 00:22:41 UTC (rev 740)
+++ trunk/alexandria/Rakefile        2007-10-02 16:51:58 UTC (rev 741)
</span><span class="lines">@@ -56,7 +56,7 @@
</span><span class="cx"> 'TODO']
</span><span class="cx"> b.rdoc.main = 'doc/README'
</span><span class="cx">
</span><del>- b.install.fake_prefix='tmp-alexandria-deb'
</del><ins>+ b.debinstall.staging_dir = 'tmp-alexandria-deb'
</ins><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> ##
</span><span class="lines">@@ -173,56 +173,7 @@
</span><span class="cx">
</span><span class="cx"> task :default => [:build]
</span><span class="cx">
</span><del>-## # # # debian # # # ##
</del><span class="cx">
</span><del>-
-
-def template_copy(src, dest, data)
- src_text = File.open(src).read()
- dest_text = src_text.gsub(/#(\w+)#/) { |match| data[$1.intern] }
- puts dest_text
- FileUtils.mkdir_p(File.dirname(dest))
- File.open(dest, 'w') { |f| f.write(dest_text) }
-end
-namespace "debian" do
- task :deb_control do
- inst = `du -sk #{build.install.fake_prefix}`.split()[0]
- tmpl_data = { :name => build.name,
- :version => build.version,
- :inst => inst,
- :author => build.author,
- :email => build.email}
-
- debian_dir = File.join(build.install.fake_prefix, "DEBIAN")
-
- template_copy("debian/control.tmpl", File.join(debian_dir, "control"), tmpl_data)
- end
-
- task :deb_files do
- debian_dir = File.join(build.install.fake_prefix, "DEBIAN")
- files = %w{postinst postrm prerm}
- files.each do |file|
- FileUtils.cp("debian/#{file}", File.join(debian_dir, file))
- end
- end
-
- ## obviously this task needs 'fakeroot' and 'dpkg' to be installed
- desc "Create a deb file"
- task :deb => [:fake_install, :deb_control, :deb_files] do
- msg = `fakeroot dpkg-deb --build #{build.install.fake_prefix} #{build.name}-#{build.version}.deb`
- puts msg
- end
-
-
- task :deb_clobber do |t|
- FileUtils.rm_rf(build.install.fake_prefix)
- FileUtils.rm_f("#{build.name}-#{build.version}.deb")
- end
-
-end
-task :clobber => ["debian:deb_clobber"]
-
-
</del><span class="cx"> ## # # # installation # # # ##
</span><span class="cx">
</span><span class="cx"> task :pre_install => [:build]
</span></span></pre></div>
<a id="trunkalexandriatasksrb"></a>
<div class="modfile"><h4>Modified: trunk/alexandria/tasks.rb (740 => 741)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/alexandria/tasks.rb        2007-10-02 00:22:41 UTC (rev 740)
+++ trunk/alexandria/tasks.rb        2007-10-02 16:51:58 UTC (rev 741)
</span><span class="lines">@@ -69,6 +69,7 @@
</span><span class="cx"> attr_accessor :files
</span><span class="cx"> attr_accessor :rdoc
</span><span class="cx"> attr_accessor :install
</span><ins>+ attr_accessor :debinstall
</ins><span class="cx"> attr_accessor :omf
</span><span class="cx"> attr_accessor :gettext
</span><span class="cx">
</span><span class="lines">@@ -81,6 +82,7 @@
</span><span class="cx"> @files = FileConfig.new(self)
</span><span class="cx"> @rdoc = RDocConfig.new(self)
</span><span class="cx"> @install = InstallConfig.new(self)
</span><ins>+ @debinstall = DebianInstallConfig.new(self)
</ins><span class="cx"> @omf = OMFConfig.new(self)
</span><span class="cx"> @gettext = GettextConfig.new(self)
</span><span class="cx">
</span><span class="lines">@@ -140,6 +142,7 @@
</span><span class="cx"> define_rdoc_tasks
</span><span class="cx"> define_rspec_tasks
</span><span class="cx"> define_install_tasks
</span><ins>+ define_debinstall_tasks
</ins><span class="cx"> define_omf_tasks
</span><span class="cx"> define_gettext_tasks
</span><span class="cx"> end
</span><span class="lines">@@ -203,23 +206,18 @@
</span><span class="cx"> ## # # # install tasks # # # ##
</span><span class="cx">
</span><span class="cx"> def install_file(src_dir, file, dest_dir, mode)
</span><del>- source_basedir = Pathname(src_dir)
- source_file = Pathname(file)
- dest_basedir = Pathname(dest_dir)
</del><ins>+ source_basedir = Pathname.new(src_dir)
+ source_file = Pathname.new(file)
+ dest_basedir = Pathname.new(dest_dir)
</ins><span class="cx"> if source_file.file?
</span><span class="cx"> source_path = source_file.dirname.relative_path_from(source_basedir)
</span><span class="cx"> end
</span><span class="cx"> dest = source_path ? dest_basedir + source_path : dest_basedir
</span><span class="cx"> FileUtils.mkdir_p dest unless test ?d, dest
</span><span class="cx"> puts "Installing #{file} to #{dest}"
</span><del>- File.install(file, dest, mode)
</del><ins>+ File.install(file.to_s, dest.to_s, mode)
</ins><span class="cx"> end
</span><span class="cx">
</span><del>- def fake_install_file(src_dir, file, dest_dir, mode)
- fake_dest = File.join(@install.fake_prefix, dest_dir)
- install_file(src_dir, file, fake_dest, mode)
- end
-
</del><span class="cx"> def define_install_tasks
</span><span class="cx"> task :pre_install # just an empty hook
</span><span class="cx">
</span><span class="lines">@@ -236,24 +234,12 @@
</span><span class="cx"> desc "Install the package. Override destination with $PREFIX"
</span><span class="cx"> task :install => [:pre_install, :install_files, :post_install]
</span><span class="cx">
</span><del>- task :fake_install_files do # HACK cut-n-paste blues!
- @install.groups.each do |src, files, dest, mode|
- files.each do |file|
- fake_install_file(src, file, dest, mode)
- end
- end
- end
-
- task :fake_install => [:pre_install, :fake_install_files] do
- puts "Also remember to copy across postinst files and such..."
- end
-
</del><span class="cx"> end
</span><span class="cx">
</span><span class="cx">
</span><span class="cx"> class InstallConfig < BuildConfig
</span><span class="cx">
</span><del>- attr_accessor :prefix, :rubylib, :fake_prefix
</del><ins>+ attr_accessor :prefix, :rubylib
</ins><span class="cx">
</span><span class="cx"> def initialize(build)
</span><span class="cx"> super(build)
</span><span class="lines">@@ -267,7 +253,6 @@
</span><span class="cx"> @rubylib = File.join(@prefix, libpart)
</span><span class="cx"> end
</span><span class="cx"> @groups = []
</span><del>- @fake_prefix = nil
</del><span class="cx"> end
</span><span class="cx">
</span><span class="cx"> def groups
</span><span class="lines">@@ -320,7 +305,123 @@
</span><span class="cx"> end
</span><span class="cx"> end
</span><span class="cx">
</span><ins>+ ## # # # debian # # # ##
</ins><span class="cx">
</span><ins>+ def stage_install_file(src_dir, file, dest_dir, mode)
+ stage_dest = File.join(@debinstall.staging_dir, dest_dir)
+ install_file(src_dir, file, stage_dest, mode)
+ end
+
+ def template_copy(src, dest, data)
+ src_text = File.open(src).read()
+ dest_text = src_text.gsub(/#(\w+)#/) { |match| data[$1.intern] }
+ FileUtils.mkdir_p(File.dirname(dest))
+ File.open(dest, 'w') { |f| f.write(dest_text) }
+ end
+
+ def define_debinstall_tasks
+ namespace "debian" do
+
+ task :stage_install_files do # HACK cut-n-paste blues!
+ @debinstall.groups.each do |src, files, dest, mode|
+ files.each do |file|
+ stage_install_file(src, file, dest, mode)
+ end
+ end
+ end
+
+ task :stage_install => [:pre_install, :stage_install_files]
+
+ task :deb_control do
+ inst = `du -sk #{@debinstall.staging_dir}`.split()[0]
+ tmpl_data = { :name => @name,
+ :version => @version,
+ :inst => inst,
+ :author => @author,
+ :email => @email}
+
+ debian_dir = File.join(@debinstall.staging_dir, "DEBIAN")
+
+ template_copy("debian/control.tmpl",
+ File.join(debian_dir, "control"), tmpl_data)
+ end
+
+ task :deb_files do
+ debian_dir = File.join(@debinstall.staging_dir, "DEBIAN")
+ files = %w{postinst postrm prerm}
+ files.each do |file|
+ FileUtils.cp("debian/#{file}", File.join(debian_dir, file))
+ end
+ end
+
+ ## obviously this task needs 'fakeroot' and 'dpkg' to be installed
+ task :build_deb => [:build, :stage_install, :deb_control, :deb_files] do
+ # HACK
+ gconf_dir = File.join(@debinstall.staging_dir, "/usr/share/gconf/schemas")
+ FileUtils.mkdir_p(gconf_dir)
+ File.install("schemas/alexandria.schemas", gconf_dir, 0444)
+
+ autogen_files = ["lib/alexandria/config.rb",
+ "lib/alexandria/version.rb",
+ "lib/alexandria/default_preferences.rb"]
+ autogen_files.each do |file|
+ stage_install_file('lib', file, @debinstall.rubylib, 0444)
+ puts "HACK:: installing -> 'lib', #{file}, #{@debinstall.rubylib}"
+ end
+
+ puts "Creating deb file #{@debinstall.deb}"
+ msg = `fakeroot dpkg-deb --build #{@debinstall.staging_dir} #{@debinstall.deb}`
+ puts msg
+ end
+
+ task :deb_clean do |t|
+ FileUtils.rm_rf(@debinstall.staging_dir)
+ end
+
+ task :deb_clobber do |t|
+ FileUtils.rm_f(@debinstall.deb)
+ end
+
+ desc "Create a deb file"
+ task :deb => [:build_deb, :deb_clean]
+
+ end
+ task :clean => ["debian:deb_clean"]
+ task :clobber => ["debian:deb_clobber"]
+
+
+ end
+
+
+
+ class DebianInstallConfig < InstallConfig
+
+ attr_accessor :staging_dir, :deb
+
+ # Debian is peculiar about where it installs ruby libraries.
+ # Its 'sitelibdir' (for ruby 1.8) is /usr/local/lib/site_ruby/1.8
+ # According to the Linux Standards Base (LSB) a package manager
+ # should not install anything to /usr/local
+ # So, to install to /usr/lib/ruby, deb files will install to
+ # 'rubylibdir' instead (this is /usr/lib/ruby/1.8)
+ def initialize(build)
+ super(build)
+ ruby_prefix = Config::CONFIG['prefix']
+ sitelibdir = Config::CONFIG['rubylibdir']
+ @prefix = ENV['PREFIX'] || ruby_prefix
+ if @prefix == ruby_prefix
+ @rubylib = sitelibdir
+ else
+ libpart = sitelibdir[ruby_prefix.size .. -1]
+ @rubylib = File.join(@prefix, libpart)
+ end
+ @groups = []
+ @staging_dir = nil
+ @deb = "#{build.name}-#{build.version}-1.deb"
+ end
+
+ end
+
</ins><span class="cx"> ## # # # omf tasks # # # ##
</span><span class="cx">
</span><span class="cx"> def define_omf_tasks
</span></span></pre>
</div>
</div>
</body>
</html>