#!/usr/bin/env ruby
raise 'Please, use ruby1.8.4 or later.' if RUBY_VERSION < '1.8.4'
=begin
Common Rakefile, Rantfile installer for SiSU
softlink Rakefile and Rantfile to this file
* Homepage: <http://www.jus.uio.no/sisu/SiSU>
<http://search.sisudoc.org>
* Download: <http://www.jus.uio.no/sisu/download>
Copyright (C) 2007 Ralph Amissah
* License: LGPL - GNU Lesser General Public License
[same license as Rant provided within the Rant package]
* Ralph Amissah <ralph@amissah.com>
Ralph Amissah <ralph.amissah@gmail.com>
Rake is a Ruby build program by Jim Weirich
* Rake may be downloaded and installed from:
<http://rake.rubyforge.org/>
Rant is a Ruby build program by Stefan Lang
* Rant may be downloaded and installed from:
<http://make.rubyforge.org/>
Notes on use:
[if rake is preferred and installed]
rake -T
[if rant is preferred and installed]
rant -T
[else [if sisu-install is present]]
ruby sisu-install -T
SiSU can also be Setup/Installation using:
* Minero Aoki's setup.rb, provided along with SiSU, or
=end
#%% produce a makefile suitable for the target platform
#require 'mkmf'
#create_makefile("sisu")
require 'find'
require 'fileutils'
#require 'ftools'
require 'rbconfig.rb'
require 'yaml'
include FileUtils
class Project_details
def name
'SiSU'
end
def rake_rant
"Rakefile/Rantfile for the installation/setup of #{name}"
end
def platform_notice
"[#{name} is for the Linux/Unix Platforms]"
end
def env
Config::CONFIG
end
def host
env['host']
end
def dir
def proj
'sisu'
end
def arch
env['archdir']
end
def sitearch
env['sitearchdir']
end
def bin
env['bindir']
end
def lib
env['sitelibdir']
end
def data
env['datadir']
end
def share
"#{env['datadir']}/sisu"
end
def conf
env['sysconfdir']
end
def man
env['mandir']
end
def vim
"#{env['datadir']}/sisu/vim"
end
def out
"#{env['localstatedir']}/#{proj}"
end
def rubylib
env['LIBRUBYARG_SHARED']
end
def pwd
Dir.pwd #ENV['PWD']
end
self
end
def version
stamp={}
v="#{dir.pwd}/conf/sisu/version.yml"
version=if File.exist?(v)
stamp=YAML::load(File::open(v))
stamp[:version]
else ''
end
end
end
@p=Project_details.new
def answer?(ask)
resp='redo'
print ask + " ['yes', 'no' or 'quit']: "
resp=File.new('/dev/tty').gets.strip
#resp=gets.strip
ans=if resp == 'yes'; true
elsif resp == 'no'; false
elsif resp =~/^quit|exit$/; exit
else puts "[please type: 'yes', 'no' or 'quit']"
answer?(ask)
end
end
def default_notice
ans= %{#{@p.rake_rant}
Information on alternative actions is available using:
[if rake is installed:]
"rake help" or "rake -T"
[if rant is installed:]
"rant help" or "rant -T"
[else [if sisu-install is present]:]
"sisu-install help" or "sisu-install -T"
Default action selected - "install and to setup #{@p.name}" proceed? }
resp=answer?(ans)
exit unless resp
end
def get_username
gets.strip
end
def chmod_file(place)
if place =~/\/bin/; File.chmod(0755,place)
else File.chmod(0644,place)
end
end
def chmod_util(place)
if place =~/\/bin/; chmod(0755,place)
else chmod(0644,place)
end
end
#%% using a directory and its mapping
def setup_find_create(dir_get,dir_put) #primary,
Find.find("#{@p.dir.pwd}/#{dir_get}") do |f|
stub=f.scan(/#{@p.dir.pwd}\/#{dir_get}\/(\S+)/).join
place="#{dir_put}/#{stub}"
action=case
when File.file?(f)
cp(f,place)
chmod_file(place)
"-> #{dir_put}/"
when File.directory?(f)
FileUtils.mkpath(place) unless FileTest.directory?(place)
"./#{dir_get}/"
else '?'
end
puts "#{action}#{stub}"
end
end
def setup_find_cp_r(dir_get,dir_put) #secondary, using recursive copy
Find.find("#{@p.dir.pwd}/#{dir_get}") do |f|
stub=f.scan(/#{@p.dir.pwd}\/#{dir_get}\/(\S+)/).join
place="#{dir_put}/#{stub}"
case
when File.file?(f)
cp_r(f,place)
chmod_util(place)
when File.directory?(f)
mkdir(place) unless FileTest.directory?(place)
end
end
end
def system_info
puts <<WOK
#{@p.platform_notice}
Host
host: #{@p.host}
arch: #{@p.dir.arch}
sitearch: #{@p.dir.sitearch}
Directories for installation
bin: #{@p.dir.bin}
lib (site-ruby): #{@p.dir.lib}/#{@p.dir.proj}/v*
conf [etc]: #{@p.dir.conf}/#{@p.dir.proj}
data (odf, shared images): #{@p.dir.share}
vim (vim syntax, highlighting, ftplugin): #{@p.dir.data}/sisu/vim
data (README, version_manifest): #{@p.dir.data}/doc/#{@p.dir.proj}
man (manual pages): #{@p.dir.man}
output: #{@p.dir.out}
processing: #{@p.dir.out}/processing
www: #{@p.dir.out}/www
rubylib: #{@p.dir.rubylib}
WOK
end
def project_help
puts <<WOK
#{@p.name}
#{@p.rake_rant}
#{@p.platform_notice}
Commands quick start list
#{@p.name} Rake/Rant Help: (This Rakefile or Rantfile uses the same directory structure as setup.rb)
rake -T or rant -T # a task list, (generated by Rake or Rant) for more complete and up to date help
rake system or rant system # system info used
Quick start install and remove project #{@p.name}
as root:
rake or rant # install #{@p.name}
rake setup or rant setup # install #{@p.name} (without additonal configuration and generating of test file)
rake install or rant reinstall # reinstall #{@p.name}
rake remove or rant remove # clobber/remove #{@p.name}, current version: #{@p.version}
rake remove_package or rant remove_package # clobber/remove #{@p.name}, all versions
For a more detailed and up to date list of command options use
rake -T
rant -T
WOK
end
def tasks
sys('rant -T')
end
#%% tasks
desc "rake/rant (as root type 'rake' or 'rant' for default action)"
task :default => [:default_notice,:project]
#task :default => [:help,:notice,:project]
desc "Setup/Install #{@p.name} and try generate a file"
task :project=> [:setup_bin,:setup_lib,:setup_conf,:setup_share,:setup_data,:setup_man,:setup_vim,:post_install_note]
desc "Setup/Install #{@p.name}"
task :setup=> [:setup_bin, :setup_lib,:setup_conf,:setup_share,:setup_data] #, :help]
desc "Setup/Install #{@p.name}: bin, lib and conf (no data)"
task :setup_base=> [:setup_bin,:setup_lib,:setup_conf,:setup_share,:setup_man,:setup_vim]
desc "Setup/Install #{@p.name} bin, lib and conf (no data and no attempt to do postinstall setup)"
task :base=> [:setup_base]
if File.directory?('bin') #bin
desc "Setup #{@p.name} bin only, synonym :bin"
task :bin => [:setup_bin]
end
if File.directory?('lib') #lib
desc "Setup #{@p.name} lib only, synonym :lib"
task :lib => [:setup_lib]
end
if File.directory?('conf') #conf or etc
desc "Setup #{@p.name} conf only, synonyms :conf & :etc"
task :conf => [:setup_conf]
task :setup_etc => [:setup_conf]
task :etc => [:setup_conf]
end
if File.directory?('data') #data
desc "Setup #{@p.name} data only, synonyms :data & :examples"
task :data => [:setup_data]
task :setup_examples => [:setup_data]
task :examples => [:setup_data]
end
if File.directory?('data/sisu') #share (odf shared-images)
desc "Setup #{@p.name} shared data only (odf & shared images)"
task :share => [:setup_share]
end
if File.directory?('man') #man pages
desc "Setup #{@p.name} man pages only, synonyms :man"
task :man => [:setup_man]
end
if File.directory?('data/vim') #man pages
desc "Setup #{@p.name} vim config files only, synonyms :vim"
task :setup_vim => [:setup_vim]
task :vim => [:setup_vim]
end
desc "Setup/Install #{@p.name}: bin, lib, conf and data (no attempt to do postinstall setup)"
task :setup_only=> [:setup_bin,:setup_lib,:setup_conf,:setup_share,:setup_data,:help]
desc "Remove #{@p.name} (all versions)" #remove project
task :remove_package => [:remove_bin, :remove_lib, :remove_conf]
if File.directory?('bin') #bin
desc "Remove #{@p.name} bin only" #remove bin
task :remove_bin => [:remove_bin]
end
if File.directory?('lib') #lib
desc "Remove #{@p.name} lib only" #remove lib
task :remove_lib => [:remove_lib]
end
if File.directory?('conf') #conf
desc "Remove #{@p.name} conf only" #remove conf
task :remove_conf => [:remove_conf]
end
#if File.directory?('data') #data
# desc "Remove #{@p.name} data only" #remove data
# task :remove_data => [:remove_data]
#end
desc "Re-setup #{@p.name}, synonym :reinstall" #resetup reinstall
task :resetup => [:remove, :setup]
task :reinstall => [:remove, :setup]
desc "Re-setup #{@p.name}: bin, lib, conf (ignore data), synonym :reinstall" #partial reinstall
task :resetup_base => [:remove, :setup_base]
task :reinstall_base => [:remove, :setup_base]
if File.directory?('bin') #bin
desc "Re-setup #{@p.name} bin, synonym :reinstall"
task :resetup_bin => [:remove_bin, :setup_bin]
task :reinstall_bin => [:remove_bin, :setup_bin]
end
if File.directory?('lib') #lib
desc "Re-setup #{@p.name} lib, synonym :reinstall_lib"
task :resetup_lib => [:remove_lib, :setup_lib]
task :reinstall_lib => [:remove_lib, :setup_lib]
end
if File.directory?('conf') #conf
desc "Re-setup #{@p.name} conf, synonyms :reinstall_conf & :resetup_etc"
task :resetup_conf => [:remove_conf, :setup_conf]
task :reinstall_conf => [:remove_conf, :setup_conf]
task :resetup_etc => [:remove_conf, :setup_conf]
task :reinstall_etc => [:remove_conf, :setup_conf]
end
if File.directory?('data/sisu') #share
desc "Re-setup #{@p.name} shared data, (odf & images)"
task :resetup_share => [:remove_share, :setup_share]
task :reinstall_share => [:remove_share, :setup_share]
end
if File.directory?('man') #man
desc "Re-setup #{@p.name} man, synonym :reinstall_man"
task :resetup_man => [:remove_man, :setup_man]
task :reinstall_man => [:remove_man, :setup_man]
end
desc 'Setup Note'
task :setup_note => [:help]
desc "System information used by #{@p.name}"
task :system => [:system_info,:project_help,:post_install_note]
desc "show all system info available - parameters found"
task :system_param => [:system_param]
desc 'Help'
task :help => [:project_help,:system_info,:tasks]
#desc "Setup/Install #{@p.name} (uses filelist)"
task :install => [:default_notice,:project]
task :install_bin => [:setup_bin]
desc '[make rant independent install file]'
task :create_rant_independent_task_file => [:rant_independence]
#%% setup/install tasks
task :rant_independence do #notice
resp=''
while resp.length < 4
resp='sisu-install' #default name install
print %{#{@p.rake_rant}
Create a rant dependency independent file
provide filename default name is "install"
[Warning, will overwrite file of name provided
provide name or "quit" to exit]: }
exit if resp =~/^(?:n|quit|exit)$/
end
remove='y' #remove='n'
if remove =~/y/
system("rant-import --force --auto #{resp};
chmod 755 #{resp}
")
else #puts "#{resp} not replaced"
end
end
task :default_notice do #notice
default_notice
end
task :default2 do #secondary
setup_find_cp_r('bin',@p.dir.bin) if File.directory?('bin')
setup_find_cp_r('lib',@p.dir.lib) if File.directory?('lib')
setup_find_cp_r('conf',@p.dir.conf) if File.directory?('conf')
setup_find_cp_r('data/sisu',@p.dir.share) if File.directory?('data/sisu') #
setup_find_cp_r('data',@p.dir.data) if File.directory?('data')
setup_find_cp_r('data/vim',"#{@p.dir.data}/vim") if File.directory?('data/vim')
setup_find_cp_r('man',@p.dir.man) if File.directory?('man')
end
task :setup_bin do #bin
setup_find_create('bin',@p.dir.bin) if File.directory?('bin')
end
task :setup_lib do #lib
setup_find_create('lib',@p.dir.lib) if File.directory?('lib')
end
task :setup_conf do #conf
setup_find_create('conf',@p.dir.conf) if File.directory?('conf')
end
task :setup_share do #share
setup_find_create('data/sisu',@p.dir.share) if File.directory?('data/sisu')
end
task :setup_data do #data
setup_find_create('data',@p.dir.data) if File.directory?('data')
end
task :setup_man do #man
setup_find_create('man',@p.dir.man) if File.directory?('man') #man pages
setup_find_create('man.deb/man',@p.dir.man) if File.directory?('man.deb/man') #man pages
end
task :setup_vim do #man
setup_find_create('data/vim',@p.dir.vim) if File.directory?('data/vim') #man pages
end
#%% post install
#%% clobber/remove tasks
task :remove_bin do
rm_r "#{@p.dir.bin}/#{@p.dir.proj}" if FileTest.file?("#{@p.dir.bin}/#{@p.dir.proj}")
end
task :remove_lib do
rm_r "#{@p.dir.lib}/#{@p.dir.proj}" if FileTest.directory?("#{@p.dir.lib}/#{@p.dir.proj}")
end
task :remove_conf do
rm_r "#{@p.dir.conf}/#{@p.dir.proj}" if FileTest.directory?("#{@p.dir.conf}/#{@p.dir.proj}")
end
task :remove_man do
rm_r "#{@p.dir.man}/**/#{@p.dir.proj}" if FileTest.directory?("#{@p.dir.man}/man1/#{@p.dir.proj}")
end
task :remove_version do
rm_r "#{@p.dir.bin}/#{@p.dir.proj}" if FileTest.file?("#{@p.dir.bin}/#{@p.dir.proj}")
rm_r "#{@p.dir.lib}/#{@p.dir.proj}/#{@p.version}" if FileTest.directory?("#{@p.dir.lib}/#{@p.dir.proj}/#{@p.version}")
rm_r "#{@p.dir.conf}/#{@p.dir.proj} if FileTest.directory?("#{@p.dir.conf}/#{@p.dir.proj}")
end
task :remove_package do
rm_r "#{@p.dir.bin}/#{@p.dir.proj}" if FileTest.file?("#{@p.dir.bin}/#{@p.dir.proj}")
rm_r "#{@p.dir.lib}/#{@p.dir.proj}" if FileTest.directory?("#{@p.dir.lib}/#{@p.dir.proj}")
rm_r "#{@p.dir.conf}/#{@p.dir.proj}" if FileTest.directory?("#{@p.dir.conf}/#{@p.dir.proj}")
end
task :post_install_note do
puts <<WOK
sisu markup samples are now packaged separately in sisu-markup-samples
visit:
<http://www.jus.uio.no/sisu>
<http://search.sisudoc.org>
and:
<http://www.jus.uio.no/sisu/SiSU/download>
WOK
end
task :system_info do #%% system info
system_info
end
task :system_param do
@env.each {|c| puts c.inspect }
end
task :project_help do #%% help
project_help
end
task :tasks do #%% help
tasks
end