#! /usr/bin/env python

# package-clang-headers.py
#
# The Clang module loader depends on built-in headers for the Clang compiler.
# We grab these from the Clang build and move them into the LLDB module.

# TARGET_DIR is where the lldb framework/shared library gets put.
# LLVM_BUILD_DIR is where LLVM and Clang got built
# LLVM_BUILD_DIR/lib/clang should exist and contain headers

import os
import re
import shutil
import sys

if len(sys.argv) != 3:
     print "usage: " + sys.argv[0] + " TARGET_DIR LLVM_BUILD_DIR"
     sys.exit(1)

target_dir = sys.argv[1]
llvm_build_dir = sys.argv[2]

if not os.path.isdir(target_dir):
    print target_dir + " doesn't exist"
    sys.exit(1) 

if not os.path.isdir(llvm_build_dir):
    llvm_build_dir = re.sub ("-macosx-", "-iphoneos-", llvm_build_dir)

if not os.path.isdir(llvm_build_dir):
    print llvm_build_dir + " doesn't exist"
    sys.exit(1)

resources = os.path.join(target_dir, "LLDB.framework", "Resources")

if not os.path.isdir(resources):
    print resources + " must exist"
    sys.exit(1)

clang_dir = os.path.join(llvm_build_dir, "lib", "clang")

if not os.path.isdir(clang_dir):
    print clang_dir + " must exist"
    sys.exit(1)

version_dir = None

for subdir in os.listdir(clang_dir):
    if (re.match("^[0-9]+(\.[0-9]+)*$", subdir)):
        version_dir = os.path.join(clang_dir, subdir)
        break

if version_dir == None:
    print "Couldn't find a subdirectory of the form #(.#)... in " + clang_dir
    sys.exit(1)

if not os.path.isdir(version_dir):
    print version_dir + " is not a directory"
    sys.exit(1)

# Just checking... we're actually going to copy all of version_dir
include_dir = os.path.join(version_dir, "include")

if not os.path.isdir(include_dir):
    print version_dir + " is not a directory"
    sys.exit(1)

clang_resources = os.path.join(resources, "Clang")

if os.path.isdir(clang_resources):
    shutil.rmtree(clang_resources)

shutil.copytree(version_dir, clang_resources)
