rakelib/dist-jv.rake
author Patrik Svestka <patrik.svestka@gmail.com>
Fri, 24 Aug 2018 19:19:47 +0200
changeset 253 3747e4b3256b
parent 239 387a9f13f1aa
child 258 65caf0201157
permissions -rw-r--r--
Adding a total time for each test package in the OVERALL SUMMARY

task :'dist:jv' => %i(dist:jv:pre dist:jv:main dist:jv:post)

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 = ARTIFACTS_DIR / BUILD_NAME
    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 = ARTIFACTS_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

  task :all => %i(pre main post)

  task :pre
  task :post

  task :main => %i(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
    %w(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 {|rc_file| install BUILD_DIR / 'stx' / 'projects' / 'smalltalk' / rc_file, rc_dir}
    install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ '*.wsp', lib_dir
    install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'rc.d' / '*', lib_dir / 'rc.d'

    case
      when win32?
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalk.bat', bin_dir / 'stx.bat'
        sed "SET stx_version=\"!stx_version_default!\"", "SET stx_version=#{version}", bin_dir / 'stx.bat', true
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalk.ps1', bin_dir / 'smalltalk.ps1'
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalk.cfg', bin_dir / 'smalltalk.cfg'
      when unix?
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalkx.desktop', bin_dir / 'stx'
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalkx.svg', bin_dir / 'stx'
        install BUILD_DIR / 'stx' / 'projects' / 'smalltalk'/ 'smalltalk', bin_dir / 'stx'
        sed 'STX_VERSION=$STX_VERSION_DEFAULT', "STX_VERSION=#{version}", bin_dir / 'stx', true
      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'
      if File.exist? BUILD_DIR / pkg.directory / pkg.dll_name
        install BUILD_DIR / pkg.directory / '*.so', pkg_dir / pkg.directory
      end
      %w(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

        unless 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 :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' => %i(dist:jv:docs:pre dist:jv:docs:main dist:jv:docs:post)

namespace :'dist:jv:docs' do
  task :pre
  task :post
  task :main => %i(setup files)

  task :setup => %i(dist:jv:variables)

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

end # namespace :'dist:jv:docs'