rakelib/dist-jv.rake
author Jan Vrany <jan.vrany@fit.cvut.cz>
Sun, 22 May 2016 00:32:07 +0100
changeset 0 f46260ba26b1
child 4 48ec8a59ced4
permissions -rw-r--r--
Initial shot of "new" rake-based builder Based on SVN https://swing.fit.cvut.cz/svn/stx/goodies/builder/trunk/rake@592

task :'checkout:post' => BUILD_DIR / 'misc' / 'distutils'

file BUILD_DIR / 'misc' / 'distutils'  => BUILD_DIR  do
  checkout :'swing', 'misc/distutils', :branch => ''
end

task :'dist:jv' => [ :'dist:jv:pre' , :'dist:jv:main', :'dist:jv:post' ]

  du = BUILD_DIR / 'misc' / 'distutils'

  app_version = nil
  version = nil

  install_dir = nil
  bin_dir = nil
  pkg_dir = nil
  lib_dir = nil
  include_dir = nil
  libexec_dir = nil
  rc_dir = win32? ? bin_dir : lib_dir

  install_dir_doc = nil
  doc_dir = nil


namespace :'dist:jv' do
  task :'variables' do


    app_name    = project.app_name      || (raise Exception.new("No app_name property specified"))
    app_version = project.app_version   || (raise Exception.new("No app_version property specified"))
    version = app_version.split('_').first

    install_dir = DIST_DIR / 'dist' / "#{app_name}-#{app_version}_#{ARCH}-#{PLATFORM}"
    bin_dir = install_dir / 'bin'
    pkg_dir = install_dir / 'lib' / 'smalltalkx' / version / 'packages'
    lib_dir = install_dir / 'lib' / 'smalltalkx' / version / 'lib'
    include_dir = install_dir / 'lib' / 'smalltalkx' / version / 'include'
    rc_dir  = win32? ? bin_dir : lib_dir
    libexec_dir = install_dir / 'lib' / 'smalltalkx' / version / 'bin'

    # install_dir_doc = DIST_DIR / 'docs' / "#{app_name}-#{app_version}_docs"
    # doc_dir = install_dir_doc / 'share' / 'doc' / 'smalltalkx' / version

    install_dir_doc = install_dir
    doc_dir = install_dir / 'lib' / 'smalltalkx' / version



    # HACK to make dirs globally available in 'post' rules...
    $install_jv_dirs = {
      :install_dir => install_dir,
      :bin_dir => bin_dir,
      :doc_dir => doc_dir,
      :pkg_dir => pkg_dir,
      :lib_dir => lib_dir,
      :include_dir => include_dir,
      :rc_dir  => rc_dir,
      :libexec_dir => libexec_dir
    }

  end



  desc "Installs jv-branch SDK into #{DIST_DIR}"
  task :'all' => [:'pre', :'main',:'post', :'archive' ]

  task :'pre'
  task :'post'

  task :'main' => [ :'setup', :'binaries', :'scripts', :'librun', :'packages', :'resources' , :'doc']

  task :'binaries' => :'variables' do
    mkdir_p bin_dir
    mkdir_p libexec_dir

    install STC , bin_dir
    install STC , libexec_dir
    case
    when win32?
      install BUILD_DIR / 'stx' / 'projects' / 'smalltalk' / 'stx.exe', libexec_dir
      install BUILD_DIR / 'stx' / 'projects' / 'smalltalk' / 'stx.com', libexec_dir
    when unix?
      install BUILD_DIR / 'stx' / 'projects' / 'smalltalk' / 'stx', libexec_dir
      mv libexec_dir / 'stx' , libexec_dir / 'stx-bin'
    else
      error_unsupported_platform
    end
  end

  task :'resources' => :'variables' do
    [
      'stx/goodies/bitmaps' ,
      'stx/doc/online/english/credits.html'
    ].each do | resource |
      mkdir_p pkg_dir / File.dirname(resource)
      cp_r   BUILD_DIR / resource , pkg_dir / File.dirname(resource)
    end

    rm_rf  pkg_dir / 'stx' / 'include'
    cp_r_dereference  BUILD_DIR / 'stx' / 'include' , include_dir
  end

  task :'scripts' => :'variables'  do
    mkdir_p bin_dir
    mkdir_p lib_dir
    mkdir_p lib_dir / 'rc.d'

    rc_files = %W{display.rc host.rc keyboard.rc smalltalk_r.rc smalltalk.rc private.rc patches}
    if win32?
      rc_files << 'd_win32.rc'
    else
      #rc_files << 'd_xfree.rc'
      #rc_files << 'd_xorg.rc'
    end

    rc_files.each do | rc_file |
      install BUILD_DIR / 'stx' / 'projects' / 'smalltalk' / rc_file, rc_dir
    end
    install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ '*.wsp' , lib_dir


    install du / 'src' / 'lib' / 'rc.d' / '*' , lib_dir / 'rc.d'
    install du / 'src' / 'lib' / '*.rc' , rc_dir
    if unix?
      install du / 'src' / 'lib' / "splash-smalltalkx-#{version}.gif", lib_dir / 'splash-smalltalkx.gif'
    end

    case
    when win32?
      install du / 'src-win32' / 'bin' / 'stx.bat' , bin_dir
    when unix?
      install du / 'src-unix' / 'bin' / 'stx' , bin_dir
    else
      error_unsupported_platform
    end

  end

  task :'librun' => :'variables'  do
    case
    when unix?
      mkdir_p lib_dir / 'lib'
      install BUILD_DIR / 'stx' / 'librun' / 'librun.so' , lib_dir / 'lib'
    when win32?
      install BUILD_DIR / 'stx' / 'librun' / OBJ_DIR / 'librun.dll', bin_dir
    else
      error_unsupported_platform
    end
  end

  task :'packages' => :'variables' do
    mkdir_p lib_dir / 'lib'
    pkgs = project.packages.clone
    pkgs.push(project.application)
    # Sort here by size of package. This forces nested packaged
    # to be installed after their 'super' package. Fixes
    # libjava#25
    pkgs.sort! { | a, b | a.name.size <=> b.name.size }

    pkgs.each do | pkg |
      rm_rf pkg_dir / pkg.directory if File.exist? pkg_dir / pkg.directory
      mkdir_p pkg_dir / pkg.directory
      #cp_rx BUILD_DIR / pkg.directory / '.' , pkg_dir / pkg.directory do | fname |
      #  /\.svn|CVS|\.cvsignore|objbc|\.H$|\.STH$|\.SC$|\.sc$|\.o/.match(fname) == nil
      #end
      install   BUILD_DIR / pkg.directory / '*.st' ,         pkg_dir / pkg.directory
      install   BUILD_DIR / pkg.directory / 'abbrev.stc' ,   pkg_dir / pkg.directory if File.exist? BUILD_DIR / pkg.directory / 'abbrev.stc'
      install   BUILD_DIR / pkg.directory / '*.so' ,         pkg_dir / pkg.directory
      ['resources' , 'bitmaps' , 'styles', 'java' ].each do | subdir |
        if File.exist? BUILD_DIR / pkg.directory / subdir
          cp_rx BUILD_DIR / pkg.directory / subdir ,    pkg_dir / pkg.directory do | fname |
            # fname is full path!!!
            /\.svn|CVS|\.cvsignore|tests/.match(fname) == nil
          end
        end
      end
      #Put SVN identification...
      if File.exist? BUILD_DIR / pkg.directory / '.svn'
        chdir BUILD_DIR / pkg.directory do
          sh "svn info > \"#{pkg_dir / pkg.directory / '.svn.info'}\""
        end
      end

      if unix?
        ( pkg_dir / pkg.directory / '**' ).each do | file |
          chmod 0644, file if File.file? file
          chmod 0755, file if File.directory? file
        end

        if not pkg.application?
          (pkg_dir / pkg.directory / '*.so').each do | dll_name |
            # make the DLL executable
            chmod 0777, dll_name
            # symlink the dll
            chdir lib_dir / 'lib' do
              rm File.basename(dll_name) if File.exist? File.basename(dll_name)
              ln_s File.join('..', '..' , 'packages' , pkg.directory , File.basename(dll_name)) , File.basename(dll_name)
            end
          end
        end
      end

      if win32?
        if pkg.application?
          install BUILD_DIR / pkg.directory / '*.dll', bin_dir
          install BUILD_DIR / pkg.directory / '*.exe', bin_dir
          install BUILD_DIR / pkg.directory / '*.com', bin_dir
          install BUILD_DIR / pkg.directory / 'symbols.stc', bin_dir
          install BUILD_DIR / pkg.directory / 'modules.stx', bin_dir
          mv bin_dir / 'stx.exe' , bin_dir / 'stx-bin.exe'
          mv bin_dir / 'stx.com' , bin_dir / 'stx-bin.com'
        else
          rm pkg_dir / pkg.directory / '*.dll'
        end
      end
    end
  end

  task :'archive' => :'variables' do
    chdir File.dirname install_dir do
      if win32?
  sh *%W{zip -q -r  ..\\#{File.basename(install_dir)}.zip #{File.basename(install_dir)}}
      else
  sh *%W{tar cjf ../#{File.basename(install_dir)}.tar.bz2 #{File.basename(install_dir)}}
      end
    end
  end


  task :'archive-doc' => :'variables' do
    if install_dir_doc != pkg_dir then
      chdir File.dirname install_dir_doc do
        if win32?
          sh *%W{zip -q -r  ..\\#{File.basename(install_dir_doc)}.zip #{File.basename(install_dir_doc)}}
        else
          sh *%W{tar cjf ../#{File.basename(install_dir_doc)}.tar.bz2 #{File.basename(install_dir_doc)}}
        end
      end
    end
  end


  task :'doc' => :'variables' do
    mkdir_p doc_dir
    puts BUILD_DIR / 'stx' / 'doc'
    cp_rx BUILD_DIR / 'stx' / 'doc' , doc_dir do | fname |
      # fname is full path!!!
      /\.svn|CVS|\.cvsignore|books|not_delivered/.match(fname) == nil
    end
  end
end # namespace :'dist:jv'

task :'dist:jv:docs' => [ :'dist:jv:docs:pre' , :'dist:jv:docs:main', :'dist:jv:docs:post' ]

namespace :'dist:jv:docs' do
  task :'pre'
  task :'post'
  task :'main' => [ :'setup', :'files' ]

  task :'setup' => [ :'dist:jv:variables' ]

  task :'files' => :'setup' do
    raise Exception.new("Not yet implemented");
  end

end # namespace :'dist:jv:docs'