| #!/usr/bin/env ruby |
| |
| # Copyright (C) 2013, 2014 Apple Inc. All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions |
| # are met: |
| # |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # |
| # THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
| # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| # DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
| # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
| # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
| # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
| # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| require 'getoptlong' |
| require 'pathname' |
| require 'shellwords' |
| require 'tmpdir' |
| |
| def mychdir(path) |
| puts "-> #{path.to_s}" |
| Dir.chdir(path) { |
| yield |
| } |
| puts "<- #{path.to_s}" |
| end |
| |
| def mysys(*cmd) |
| cmd = cmd.map{|value| value.to_s} |
| commandArray = cmd.map{|value| Shellwords.shellescape(value)}.join(' ') |
| $stderr.puts " $ #{commandArray}" |
| raise unless system(*cmd) |
| end |
| |
| $libraryPackage = Pathname.new("LLVMLibraries.tar.bz2") |
| $includePackage = Pathname.new("LLVMIncludes.tar.bz2") |
| $llvmBuild = Pathname.new("./llvm") |
| $llvmBinary = Pathname.new("./llvm/Release") |
| $llvmSource = Pathname.new("./llvm") |
| $prefix = nil |
| $compression = "bzip2" |
| |
| def usage |
| puts "export-llvm-build" |
| puts |
| puts "--library-package (-l) Change where to put the compressed library package." |
| puts " Default is #{$libraryPackage}." |
| puts "--include-package (-i) Change wehre to put the compressed header package." |
| puts " Default is #{$includePackage}." |
| puts "--llvm-build (-b) Change which LLVM build directory to use." |
| puts " Default is #{$llvmBuild}." |
| puts "--llvm-binary (-B) Change which LLVM binary directory to use." |
| puts " Default is #{$llvmBinary}." |
| puts "--llvm-source (-s) Change which LLVM source directory to use." |
| puts " Default is #{$llvmSource}." |
| puts "--prefix (-p) Use an \"installed\" LLVM with the given prefix." |
| puts "--compression Change what compression to do. Can be one of gzip," |
| puts " bzip2, or none." |
| puts " Default is #{$compression}." |
| exit 1 |
| end |
| |
| GetoptLong.new(['--help', '-h', GetoptLong::NO_ARGUMENT], |
| ['--library-package', '-l', GetoptLong::REQUIRED_ARGUMENT], |
| ['--include-package', '-i', GetoptLong::REQUIRED_ARGUMENT], |
| ['--llvm-build', '-b', GetoptLong::REQUIRED_ARGUMENT], |
| ['--llvm-binary', '-B', GetoptLong::REQUIRED_ARGUMENT], |
| ['--llvm-source', '-s', GetoptLong::REQUIRED_ARGUMENT], |
| ['--prefix', '-p', GetoptLong::REQUIRED_ARGUMENT], |
| ['--compression', GetoptLong::REQUIRED_ARGUMENT]).each { |
| | opt, arg | |
| case opt |
| when '--help' |
| usage |
| when '--library-package' |
| $libraryPackage = Pathname.new(arg) |
| when '--include-package' |
| $includePackage = Pathname.new(arg) |
| when '--llvm-build' |
| $llvmBuild = Pathname.new(arg) |
| when '--llvm-binary' |
| $llvmBinary = Pathname.new(arg) |
| when '--llvm-source' |
| $llvmSource = Pathname.new(arg) |
| when '--prefix' |
| $prefix = Pathname.new(arg) |
| when '--compression' |
| $compression = arg |
| else |
| raise |
| end |
| } |
| |
| $currentPath = Pathname.pwd |
| |
| def compressionChar |
| case $compression |
| when "gzip" |
| "z" |
| when "bzip2" |
| "y" |
| when "none" |
| "" |
| else |
| raise "Bad choice of compression." |
| end |
| end |
| |
| if $prefix |
| $llvmBinary = $prefix |
| $llvmBuild = $prefix |
| $llvmSource = $prefix |
| end |
| |
| mychdir($llvmBinary + "lib") { |
| mysys("tar", "-c#{compressionChar}vf", ($currentPath + $libraryPackage).to_s, |
| *Dir.entries('.').select { |
| | value | |
| value =~ /\.a$/ and value !~ /libgtest/ |
| }) |
| } |
| |
| Dir.mktmpdir { |
| | directory | |
| directory = Pathname.new(directory).realpath |
| mychdir($llvmSource) { |
| begin |
| mysys("svn", "export", "include", directory + "include") |
| rescue |
| mysys("ditto", "include", directory + "include") |
| end |
| } |
| ["include/llvm/Config"].each { |
| | genDirName | |
| configSrcPath = $llvmBuild + genDirName |
| raise unless configSrcPath.directory? |
| configDstPath = directory + genDirName |
| Dir.foreach(configSrcPath) { |
| | filename | |
| next unless filename =~ /\.def$/ or filename =~ /\.h$/ |
| mysys("cp", configSrcPath + filename, configDstPath + filename) |
| } |
| } |
| ["include/llvm/Support/DataTypes.h"].each { |
| | genFileName | |
| mysys("cp", $llvmBuild + genFileName, directory + genFileName) |
| } |
| mychdir(directory + "include") { |
| mysys("tar", "-cyvf", $currentPath + $includePackage, ".") |
| } |
| } |
| |
| puts |
| puts "LLVM has been packaged for use by WebKit." |
| puts |
| puts "You can use it right now by setting these environment variables:" |
| puts |
| puts "export LLVM_LIBRARY_PACKAGE=#{Shellwords.shellescape($libraryPackage.realpath.to_s)}" |
| puts "export LLVM_INCLUDE_PACKAGE=#{Shellwords.shellescape($includePackage.realpath.to_s)}" |
| puts |