Files
clang-p2996/lldb/scripts/Xcode/lldbbuild.py
Todd Fiala 2c0802c559 modify Xcode build to use cmake/ninja for internal llvm/clang
This change restores the Xcode build to working after Makefile support
was stripped from LLVM and clang recently.

With this change, the Xcode build now requires cmake (2.8.12.2+).
The cmake must either be on the path that Xcode sees, or it must
exist in one of the following locations:

* /usr/local/bin/cmake
* /opt/local/bin/cmake
* $HOME/bin/cmake

If the ninja build tool is present on the path, it will be used.
If not, ninja will be cloned (via git), bootstrap-built, and
used for the llvm/clang build.

LLDB now requires a minimum deployment target of OS X 10.9.  Prior
to this, it was 10.8.  The llvm/clang cmake build will not run
with Xcode 7.2 or Xcode 7.3 beta's compiler with the minimum
deployment target set to anything lower than 10.9.  This is
related to #include <atomic>.

When llvm or clang source code does not exist in the lldb tree,
it will be cloned via git using http://llvm.org/git/{project}.git.
Previously it used SVN.  If this causes any heartache, we can
make this smarter, autodetect an embedded svn and use svn instead.
(And/or use SVN if a git command is not available).

This change also fixes an lldb-mi linkage failure (needed
libncurses) as exposed by one of the LLVM libs.

llvm-svn: 259027
2016-01-28 07:36:44 +00:00

136 lines
3.9 KiB
Python

import os
import subprocess
#### UTILITIES ####
def enum (*sequential, **named):
enums = dict(zip(sequential, range(len(sequential))), **named)
return type('Enum', (), enums)
#### SETTINGS ####
#### INTERFACE TO THE XCODEPROJ ####
def lldb_source_path ():
return os.environ.get('SRCROOT')
def expected_llvm_build_path ():
if build_type() == BuildType.Xcode:
return package_build_path()
else:
return os.path.join(os.environ.get('LLDB_PATH_TO_LLVM_BUILD'), package_build_dir_name("llvm"))
def archives_txt ():
return os.path.join(expected_package_build_path(), "archives.txt")
def expected_package_build_path ():
return os.path.abspath(os.path.join(expected_llvm_build_path(), ".."))
def architecture ():
platform_name = os.environ.get('RC_PLATFORM_NAME')
if not platform_name:
platform_name = os.environ.get('PLATFORM_NAME')
platform_arch = os.environ.get('ARCHS').split()[-1]
return platform_name + "-" + platform_arch
def lldb_configuration ():
return os.environ.get('CONFIGURATION')
def llvm_configuration ():
return os.environ.get('LLVM_CONFIGURATION')
def llvm_build_dirtree ():
return os.environ.get('LLVM_BUILD_DIRTREE')
# Edit the code below when adding build styles.
BuildType = enum('Xcode') # (Debug,DebugClang,Release)
def build_type ():
return BuildType.Xcode
#### VCS UTILITIES ####
VCS = enum('git',
'svn')
def run_in_directory(args, path):
return subprocess.check_output(args, cwd=path)
class Git:
def __init__ (self, spec):
self.spec = spec
def status (self):
return run_in_directory(["git", "branch", "-v"], self.spec['root'])
def diff (self):
return run_in_directory(["git", "diff"], self.spec['root'])
def check_out (self):
run_in_directory(["git", "clone", self.spec['url'], self.spec['root']], lldb_source_path())
run_in_directory(["git", "fetch", "--all"], self.spec['root'])
run_in_directory(["git", "checkout", self.spec['ref']], self.spec['root'])
class SVN:
def __init__ (self, spec):
self.spec = spec
def status (self):
return run_in_directory(["svn", "info"], self.spec['root'])
def diff (self):
return run_in_directory(["svn", "diff"], self.spec['root'])
# TODO implement check_out
def vcs (spec):
if spec['vcs'] == VCS.git:
return Git(spec)
elif spec['vcs'] == VCS.svn:
return SVN(spec)
else:
return None
#### SOURCE PATHS ####
def llvm_source_path ():
if build_type() == BuildType.Xcode:
return os.path.join(lldb_source_path(), "llvm")
def clang_source_path ():
if build_type() == BuildType.Xcode:
return os.path.join(llvm_source_path(), "tools", "clang")
def ninja_source_path ():
if build_type() == BuildType.Xcode:
return os.path.join(lldb_source_path(), "ninja")
#### BUILD PATHS ####
def packages ():
return ["llvm"]
def package_build_dir_name (package):
return package + "-" + architecture()
def expected_package_build_path_for (package):
if build_type() == BuildType.Xcode:
if package != "llvm":
raise("On Xcode build, we only support the llvm package: requested {}".format(package))
return package_build_path()
return os.path.join(expected_package_build_path(), package_build_dir_name(package))
def expected_package_build_paths ():
return [expected_package_build_path_for(package) for package in packages()]
def library_path (build_path):
return build_path + "/lib"
def library_paths ():
if build_type() == BuildType.Xcode:
package_build_paths = [package_build_path()]
else:
package_build_paths = expected_package_build_paths()
return [library_path(build_path) for build_path in package_build_paths]
def package_build_path ():
return os.path.join(
llvm_build_dirtree(),
os.environ["LLVM_CONFIGURATION"],
os.environ["CURRENT_ARCH"])