From a7fd70fa2154c31211e2a4759cc3a45db65ceb49 Mon Sep 17 00:00:00 2001 From: Dmitry Babokin Date: Thu, 1 Dec 2016 18:10:57 +0300 Subject: [PATCH] Adding support for using git repository instead of svn. This is experimental for now, but going forward this will become primary way of working with LLVM, as they are going to switch to git in not too distant future. --- alloy.py | 133 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 87 insertions(+), 46 deletions(-) diff --git a/alloy.py b/alloy.py index 24840661..a57a5def 100755 --- a/alloy.py +++ b/alloy.py @@ -33,6 +33,8 @@ # // Author: Filippov Ilia +import re + def tail_and_save(file_in, file_out, tail = 100): with open(file_in, 'r') as f_in: lines = f_in.readlines()[-tail:] @@ -91,6 +93,7 @@ def check_LLVM(which_LLVM): return answer def try_do_LLVM(text, command, from_validation): + print_debug("Command line: "+command+"\n", True, alloy_build) if from_validation == True: text = text + "\n" print_debug("Trying to " + text, from_validation, alloy_build) @@ -108,7 +111,74 @@ def try_do_LLVM(text, command, from_validation): error("can't " + text, 1) print_debug("DONE.\n", from_validation, alloy_build) -def build_LLVM(version_LLVM, revision, folder, tarball, debug, selfbuild, extra, from_validation, force, make, gcc_toolchain_path): +def checkout_LLVM(component, use_git, version_LLVM, revision, target_dir, from_validation): + # Identify the component + GIT_REPO_BASE="http://llvm.org/git/" + #GIT_REPO_BASE="https://github.com/llvm-mirror/" + if component == "llvm": + SVN_REPO="http://llvm.org/svn/llvm-project/llvm/" + GIT_REPO=GIT_REPO_BASE+"llvm.git" + elif component == "clang": + SVN_REPO="http://llvm.org/svn/llvm-project/cfe/" + GIT_REPO=GIT_REPO_BASE+"clang.git" + elif component == "libcxx": + SVN_REPO="http://llvm.org/svn/llvm-project/libcxx/" + GIT_REPO=GIT_REPO_BASE+"libcxx.git" + elif component == "clang-tools-extra": + SVN_REPO="http://llvm.org/svn/llvm-project/clang-tools-extra/" + GIT_REPO=GIT_REPO_BASE+"clang-tools-extra.git" + elif component == "compiler-rt": + SVN_REPO="http://llvm.org/svn/llvm-project/compiler-rt/" + GIT_REPO=GIT_REPO_BASE+"compiler-rt.git" + else: + error("Trying to checkout unidentified component: " + component, 1) + + # Identify the version + if version_LLVM == "trunk": + SVN_PATH="trunk" + GIT_BRANCH="master" + elif version_LLVM == "3_9": + SVN_PATH="tags/RELEASE_390/final" + GIT_BRANCH="release_39" + elif version_LLVM == "3_8": + SVN_PATH="tags/RELEASE_381/final" + GIT_BRANCH="release_38" + elif version_LLVM == "3_7": + SVN_PATH="tags/RELEASE_370/final" + GIT_BRANCH="release_37" + elif version_LLVM == "3_6": + SVN_PATH="tags/RELEASE_362/final" + GIT_BRANCH="release_36" + elif version_LLVM == "3_5": + SVN_PATH="tags/RELEASE_351/final" + GIT_BRANCH="release_35" + elif version_LLVM == "3_4": + SVN_PATH="tags/RELEASE_34/dot2-final" + GIT_BRANCH="release_34" + elif version_LLVM == "3_3": + SVN_PATH="tags/RELEASE_33/final" + GIT_BRANCH="release_33" + elif version_LLVM == "3_2": + SVN_PATH="tags/RELEASE_32/final" + GIT_BRANCH="release_32" + else: + error("Unsupported llvm version: " + version_LLVM, 1) + + if use_git: + try_do_LLVM("clone "+component+" from "+GIT_REPO+" to "+target_dir+" ", + "git clone "+GIT_REPO+" "+target_dir, + from_validation) + if GIT_BRANCH != "master": + os.chdir(target_dir) + try_do_LLVM("switch to "+GIT_BRANCH+" branch ", + "git checkout -b "+GIT_BRANCH+" remotes/origin/"+GIT_BRANCH, from_validation) + os.chdir("..") + else: + try_do_LLVM("load "+component+" from "+SVN_REPO+SVN_PATH+" ", + "svn co "+revision+" "+SVN_REPO+SVN_PATH+" "+target_dir, + from_validation) + +def build_LLVM(version_LLVM, revision, folder, tarball, debug, selfbuild, extra, from_validation, force, make, gcc_toolchain_path, use_git): print_debug("Building LLVM. Version: " + version_LLVM + ". ", from_validation, alloy_build) if revision != "": print_debug("Revision: " + revision + ".\n", from_validation, alloy_build) @@ -119,35 +189,11 @@ def build_LLVM(version_LLVM, revision, folder, tarball, debug, selfbuild, extra, llvm_home = os.environ["LLVM_HOME"] make_sure_dir_exists(llvm_home) + + version_LLVM = re.sub('\.', '_', version_LLVM) os.chdir(llvm_home) FOLDER_NAME=version_LLVM - if version_LLVM == "trunk": - SVN_PATH="trunk" - if version_LLVM == "3.9": - SVN_PATH="tags/RELEASE_390/final" - version_LLVM = "3_9" - if version_LLVM == "3.8": - SVN_PATH="tags/RELEASE_381/final" - version_LLVM = "3_8" - if version_LLVM == "3.7": - SVN_PATH="tags/RELEASE_370/final" - version_LLVM = "3_7" - if version_LLVM == "3.6": - SVN_PATH="tags/RELEASE_362/final" - version_LLVM = "3_6" - if version_LLVM == "3.5": - SVN_PATH="tags/RELEASE_351/final" - version_LLVM = "3_5" - if version_LLVM == "3.4": - SVN_PATH="tags/RELEASE_34/dot2-final" - version_LLVM = "3_4" - if version_LLVM == "3.3": - SVN_PATH="tags/RELEASE_33/final" - version_LLVM = "3_3" - if version_LLVM == "3.2": - SVN_PATH="tags/RELEASE_32/final" - version_LLVM = "3_2" if revision != "": FOLDER_NAME = FOLDER_NAME + "_" + revision revision = "-" + revision @@ -187,13 +233,9 @@ def build_LLVM(version_LLVM, revision, folder, tarball, debug, selfbuild, extra, llvm_home + "\n", from_validation, alloy_build) # load llvm if tarball == "": - try_do_LLVM("load LLVM from http://llvm.org/svn/llvm-project/llvm/" + SVN_PATH + " ", - "svn co " + revision + " http://llvm.org/svn/llvm-project/llvm/" + SVN_PATH + " " + LLVM_SRC, - from_validation) + checkout_LLVM("llvm", options.use_git, version_LLVM, revision, LLVM_SRC, from_validation) os.chdir(LLVM_SRC + "/tools") - try_do_LLVM("load clang from http://llvm.org/svn/llvm-project/cfe/" + SVN_PATH + " ", - "svn co " + revision + " http://llvm.org/svn/llvm-project/cfe/" + SVN_PATH + " clang", - from_validation) + checkout_LLVM("clang", options.use_git, version_LLVM, revision, "clang", from_validation) os.chdir("..") if current_OS == "MacOS" and int(current_OS_version.split(".")[0]) >= 13: # Starting with MacOS 10.9 Maverics, the system doesn't contain headers for standard C++ library and @@ -205,19 +247,13 @@ def build_LLVM(version_LLVM, revision, folder, tarball, debug, selfbuild, extra, # to the linker explicitly (either through command line or environment variables). So we are not doing it # currently to make the build process easier. os.chdir("projects") - try_do_LLVM("load libcxx http://llvm.org/svn/llvm-project/libcxx/" + SVN_PATH + " ", - "svn co " + revision + " http://llvm.org/svn/llvm-project/libcxx/" + SVN_PATH + " libcxx", - from_validation) + checkout_LLVM("libcxx", options.use_git, version_LLVM, revision, "libcxx", from_validation) os.chdir("..") if extra == True: os.chdir("tools/clang/tools") - try_do_LLVM("load extra clang extra tools ", - "svn co " + revision + " http://llvm.org/svn/llvm-project/clang-tools-extra/" + SVN_PATH + " extra", - from_validation) + checkout_LLVM("clang-tools-extra", options.use_git, version_LLVM, revision, "extra", from_validation) os.chdir("../../../projects") - try_do_LLVM("load extra clang compiler-rt ", - "svn co " + revision + " http://llvm.org/svn/llvm-project/compiler-rt/" + SVN_PATH + " compiler-rt", - from_validation) + checkout_LLVM("compiler-rt", options.use_git, version_LLVM, revision, "compiler-rt", from_validation) os.chdir("..") else: tar = tarball.split(" ") @@ -681,7 +717,7 @@ def validation_run(only, only_targets, reference_branch, number, notify, update, gen_archs = ["x86-64"] need_LLVM = check_LLVM(LLVM) for i in range(0,len(need_LLVM)): - build_LLVM(need_LLVM[i], "", "", "", False, False, False, True, False, make, options.gcc_toolchain_path) + build_LLVM(need_LLVM[i], "", "", "", False, False, False, True, False, make, options.gcc_toolchain_path, False) # begin validation run for stabitily common.remove_if_exists(stability.in_file) R = [[[],[]],[[],[]],[[],[]],[[],[]]] @@ -795,7 +831,7 @@ def validation_run(only, only_targets, reference_branch, number, notify, update, # prepare newest LLVM need_LLVM = check_LLVM([newest_LLVM]) if len(need_LLVM) != 0: - build_LLVM(need_LLVM[0], "", "", "", False, False, False, True, False, make, options.gcc_toolchain_path) + build_LLVM(need_LLVM[0], "", "", "", False, False, False, True, False, make, options.gcc_toolchain_path, options.use_git) if perf_llvm == False: # prepare reference point. build both test and reference compilers try_do_LLVM("apply git", "git branch", True) @@ -935,11 +971,14 @@ def Main(): if options.perf_llvm == True: if options.branch == "master": options.branch = "trunk" + if options.use_git and options.revision != "": + error("--revision is not supported with --git", 1) + try: start_time = time.time() if options.build_llvm: build_LLVM(options.version, options.revision, options.folder, options.tarball, - options.debug, options.selfbuild, options.extra, False, options.force, make, options.gcc_toolchain_path) + options.debug, options.selfbuild, options.extra, False, options.force, make, options.gcc_toolchain_path, options.use_git) if options.validation_run: validation_run(options.only, options.only_targets, options.branch, options.number_for_performance, options.notify, options.update, int(options.speed), @@ -1025,7 +1064,7 @@ if __name__ == '__main__': 'you have alternative gcc installation. Note that otherwise gcc from standard ' + 'location will be used, not from your PATH', default="") llvm_group.add_option('--revision', dest='revision', - help='revision of llvm to build in format r172870', default="") + help='revision of llvm to build in format r172870 (not supported with --git)', default="") llvm_group.add_option('--debug', dest='debug', help='debug build of LLVM?', default=False, action="store_true") llvm_group.add_option('--folder', dest='folder', @@ -1038,6 +1077,8 @@ if __name__ == '__main__': help='rebuild LLVM', default=False, action='store_true') llvm_group.add_option('--extra', dest='extra', help='load extra clang tools', default=False, action='store_true') + llvm_group.add_option('--git', dest='use_git', + help='use git llvm repository instead of svn', default=False, action='store_true') parser.add_option_group(llvm_group) # options for activity "validation run" run_group = OptionGroup(parser, "Options for validation run",