# swift_build_support/workspace.py ------------------------------*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# ----------------------------------------------------------------------------
"""
Represent whole source tree and the build directory
"""
# ----------------------------------------------------------------------------

import os.path


class Workspace(object):
    def __init__(self, source_root, build_root):
        self.source_root = source_root
        self.build_root = build_root

    def source_dir(self, path):
        return os.path.join(self.source_root, path)

    def build_dir(self, deployment_target, product):
        return os.path.join(self.build_root,
                            '%s-%s' % (product, deployment_target))


def compute_build_subdir(args):
    # Create a name for the build directory.
    build_subdir = args.cmake_generator.replace(" ", "_")

    cmark_build_dir_label = args.cmark_build_variant
    if args.cmark_assertions:
        cmark_build_dir_label += "Assert"

    llvm_build_dir_label = args.llvm_build_variant
    if args.llvm_assertions:
        llvm_build_dir_label += "Assert"

    swift_build_dir_label = args.swift_build_variant
    if args.swift_assertions:
        swift_build_dir_label += "Assert"
    if args.swift_analyze_code_coverage != "false":
        swift_build_dir_label += "Coverage"

    swift_stdlib_build_dir_label = args.swift_stdlib_build_variant
    if args.swift_stdlib_assertions:
        swift_stdlib_build_dir_label += "Assert"

    # FIXME: mangle LLDB build configuration into the directory name.
    if (llvm_build_dir_label == swift_build_dir_label and
            llvm_build_dir_label == swift_stdlib_build_dir_label and
            swift_build_dir_label == cmark_build_dir_label):
        # Use a simple directory name if all projects use the same build
        # type.
        build_subdir += "-" + llvm_build_dir_label
    elif (llvm_build_dir_label != swift_build_dir_label and
            llvm_build_dir_label == swift_stdlib_build_dir_label and
            swift_build_dir_label == cmark_build_dir_label):
        # Swift build type differs.
        build_subdir += "-" + llvm_build_dir_label
        build_subdir += "+swift-" + swift_build_dir_label
    elif (llvm_build_dir_label == swift_build_dir_label and
            llvm_build_dir_label != swift_stdlib_build_dir_label and
            swift_build_dir_label == cmark_build_dir_label):
        # Swift stdlib build type differs.
        build_subdir += "-" + llvm_build_dir_label
        build_subdir += "+stdlib-" + swift_stdlib_build_dir_label
    elif (llvm_build_dir_label == swift_build_dir_label and
            llvm_build_dir_label == swift_stdlib_build_dir_label and
            swift_build_dir_label != cmark_build_dir_label):
        # cmark build type differs.
        build_subdir += "-" + llvm_build_dir_label
        build_subdir += "+cmark-" + cmark_build_dir_label
    else:
        # We don't know how to create a short name, so just mangle in all
        # the information.
        build_subdir += "+cmark-" + cmark_build_dir_label
        build_subdir += "+llvm-" + llvm_build_dir_label
        build_subdir += "+swift-" + swift_build_dir_label
        build_subdir += "+stdlib-" + swift_stdlib_build_dir_label

    # If we have a sanitizer enabled, mangle it into the subdir.
    if args.enable_asan:
        build_subdir += "+asan"
    if args.enable_ubsan:
        build_subdir += "+ubsan"
    if args.enable_tsan:
        build_subdir += "+tsan"
    return build_subdir
