# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

cmake_minimum_required(VERSION 3.13.4)

if(NOT FUCHSIA_SOURCE_DIR)
  get_filename_component(FUCHSIA_SOURCE_DIR "${CMAKE_CURRENT_LIST_DIR}/../.." ABSOLUTE)
endif()

string(TOLOWER ${CMAKE_HOST_SYSTEM_PROCESSOR} HOST_CPU)
if(HOST_CPU STREQUAL "x86_64")
  set(HOST_CPU "x64")
elseif(HOST_CPU STREQUAL "aarch64")
  set(HOST_CPU "arm64")
endif()
string(TOLOWER ${CMAKE_HOST_SYSTEM_NAME} HOST_OS)
if(HOST_OS STREQUAL "darwin")
  set(HOST_OS "mac")
endif()
set(HOST_PLATFORM "${HOST_OS}-${HOST_CPU}")

set(CLANG_PREFIX "${FUCHSIA_SOURCE_DIR}/prebuilt/third_party/clang/${HOST_PLATFORM}/bin")
set(GOMA_DIR "${FUCHSIA_SOURCE_DIR}/prebuilt/third_party/goma/${HOST_PLATFORM}")

if(NOT CLANG_TARGET)
  exec_program("${CLANG_PREFIX}/clang" ARGS --version OUTPUT_VARIABLE CLANG_VERSION)
  if("${CLANG_VERSION}" MATCHES "Target: ([A-Za-z0-9._-]+)")
    set(CLANG_TARGET "${CMAKE_MATCH_1}")
  else()
    message(FATAL_ERROR "Could not determine CLANG_TARGET")
  endif()
endif()

if(NOT CMAKE_SYSROOT)
  # NOTE: Match compiler target to our prebuilt sysroot/linux/usr/lib/<target>/ directories.
  if("${CLANG_TARGET}" MATCHES "(x86_64|aarch64|arm|i386)-(.*-)?linux(-gnu|-gnueabihf)?")
    set(CMAKE_SYSROOT "${FUCHSIA_SOURCE_DIR}/prebuilt/third_party/sysroot/linux")
  else()
    message(FATAL_ERROR "No sysroot available for ${CLANG_TARGET}")
  endif()
endif()

if(NOT CMAKE_SYSTEM_NAME)
  if("${CLANG_TARGET}" MATCHES ".*-linux(-gnu)?")
    set(SYSTEM_NAME "Linux")
  elseif("${CLANG_TARGET}" MATCHES ".*-darwin")
    set(SYSTEM_NAME "Darwin")
  elseif("${CLANG_TARGET}" MATCHES ".*-fuchsia")
    set(SYSTEM_NAME "Fuchsia")
  else()
    message(FATAL_ERROR "Could not determine system name")
  endif()
  # NOTE: We don't set this value if it matches host to avoid setting CMAKE_CROSSCOMPILING.
  if(NOT SYSTEM_NAME STREQUAL CMAKE_HOST_SYSTEM_NAME)
    set(CMAKE_SYSTEM_NAME ${SYSTEM_NAME})
  endif()
endif()

if(NOT CMAKE_SYSTEM_PROCESSOR)
  string(REGEX REPLACE "([A-Za-z0-9]*)-.*" "\\1" CMAKE_SYSTEM_PROCESSOR "${CLANG_TARGET}")
endif()

if(NOT CMAKE_SYSTEM_VERSION)
  if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
    # NOTE: This matches Debian jessie.
    set(CMAKE_SYSTEM_VERSION "3.16.0")
  elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin")
    # NOTE: This matches macOS High Sierra.
    set(CMAKE_SYSTEM_VERSION "17.0.0")
  elseif(CMAKE_SYSTEM_NAME STREQUAL "Fuchsia")
    set(CMAKE_SYSTEM_VERSION "1")
  endif()
endif()

set(CMAKE_C_COMPILER "${CLANG_PREFIX}/clang")
set(CMAKE_C_CLANG_TARGET ${CLANG_TARGET} CACHE STRING "")
set(CMAKE_CXX_COMPILER "${CLANG_PREFIX}/clang++")
set(CMAKE_CXX_CLANG_TARGET ${CLANG_TARGET} CACHE STRING "")
set(CMAKE_ASM_COMPILER "${CLANG_PREFIX}/clang")
set(CMAKE_ASM_CLANG_TARGET ${CLANG_TARGET} CACHE STRING "")

if(USE_GOMA)
  set(CMAKE_C_COMPILER_LAUNCHER "${GOMA_DIR}/gomacc" CACHE PATH "")
  set(CMAKE_CXX_COMPILER_LAUNCHER "${GOMA_DIR}/gomacc" CACHE PATH "")
  set(CMAKE_ASM_COMPILER_LAUNCHER "${GOMA_DIR}/gomacc" CACHE PATH "")
endif()

set(CMAKE_ADDR2LINE "${CLANG_PREFIX}/llvm-addr2line" CACHE PATH "")
set(CMAKE_AR "${CLANG_PREFIX}/llvm-ar" CACHE PATH "")
set(CMAKE_LINKER "${CLANG_PREFIX}/ld.lld" CACHE PATH "")
set(CMAKE_LIPO "${CLANG_PREFIX}/llvm-lipo" CACHE PATH "")
set(CMAKE_NM "${CLANG_PREFIX}/llvm-nm" CACHE PATH "")
set(CMAKE_OBJCOPY "${CLANG_PREFIX}/llvm-objcopy" CACHE PATH "")
set(CMAKE_OBJDUMP "${CLANG_PREFIX}/llvm-objdump" CACHE PATH "")
set(CMAKE_RANLIB "${CLANG_PREFIX}/llvm-ranlib" CACHE PATH "")
set(CMAKE_READELF "${CLANG_PREFIX}/llvm-readelf" CACHE PATH "")
set(CMAKE_STRIP "${CLANG_PREFIX}/llvm-strip" CACHE PATH "")

set(CMAKE_FIND_ROOT_PATH ${CMAKE_SYSROOT})

set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
