cgal/Scripts/developer_scripts/mirror_all_packages.rb

120 lines
3.4 KiB
Ruby

#! /usr/bin/ruby
# == Synopsis
#
# "Mirrors" package files into a build folder for compilation.
#
# The package files are taken from a source package directory
# (typically a folder under an svn working copy)
#
# The directory structure under the package folder is replicated under
# a target build directory (creating subdirs as neccesary)
#
# "Mirroring" a package file consist on creating within the build directory a "view"
# to the file located into the package directory.
# This allows compilation within a "CGAL build directory structure" while
# keeping the source files in its original location within an svn working copy.
#
# In true POSIX platforms this is done via a symlink.
#
# In Windows platforms hardlinks are used instead. To ensure that broken hardlinks
# are properly syncronized, these are re-created whenever the source file is newer.
#
# The mirroring operation is automatically selected according to the platform,
# but can be overrided if needed via the '--mirror_operation' option.
#
# Unless specified otherwise using the '-all' option, internal "dont_submit" files
# are excluded.
#
# == Usage
#
# mirror_all_packages [OPTIONS] PACKAGES_ROOT BUILD_ROOT
#
# PACKAGE_DIR the source package directory
#
# BUILD_DIR the destination build directory
#
# OPTIONS:
#
# -h, --help:
# show help
#
# -o, -mirror_operation [symlink|hardlink]
# Mirroring operation
# symlink is the default in platforms supporting it (*nix)
# hardlink is the default in platforms not supporting symlinks (windows)
#
# -i, --include_internal
# Include internal files (excluded by default).
#
require 'getoptlong'
require 'rdoc/usage'
require 'list_package_files_impl.rb'
require 'mirror_package_impl.rb'
# -- TEST --
ARGV = [TEST_PKG_ROOT, TEST_BUILD_ROOT]
# ARGV = ['-i',TEST_PKG_DIR, TEST_BUILD_ROOT]
# -- TEST --
opts = GetoptLong.new( [ '--help' , '-h', GetoptLong::NO_ARGUMENT ],
[ '--mirror_operation', '-o', GetoptLong::REQUIRED_ARGUMENT ],
[ '--include_internal', '-i', GetoptLong::NO_ARGUMENT ]
)
include_internal = false
mirror_operation = default_mirror_op
opts.each do |opt, arg|
case opt
when '--help'
RDoc::usage
when '--mirror_operation'
case arg
when 'symlink'
mirror_operation = :symlink
when 'hardlink'
mirror_operation = :hardlink
else
$stderr << "Invalid mirror operation: " << arg
end
when '--include_internal'
include_internal = true
end
end
src_package_root = ARGV.length >= 1 ? ARGV.shift : ''
tgt_build_root = ARGV.length >= 1 ? ARGV.shift : ''
unless src_package_root.empty? || tgt_build_root.empty? then
assert_exist!(src_package_root, 'packages root directory' )
assert_exist!(tgt_build_root , 'build root directory' )
include_in_release_file = src_package_root + '/Maintenance/release_building/include_in_release'
assert_exist!(include_in_release_file, 'include_in_release file')
packages = IO.readlines(include_in_release_file)
packages.each do |package|
package.chomp!
src_package_subdir = src_package_root + '/' + package
package_files = list_package_files(src_package_subdir,include_internal)
mirror_package(package_files,src_package_subdir,tgt_build_root,mirror_operation)
end
else
RDoc::usage
end