blob: 4929146acabecfe11fb8b59f2ce5ad785c3fd016 [file] [log] [blame]
# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(CMakeParseArguments)
#-------------------------------------------------------------------------------
# Missing CMake Variables
#-------------------------------------------------------------------------------
if(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows")
set(IREE_HOST_SCRIPT_EXT "bat")
else()
set(IREE_HOST_SCRIPT_EXT "sh")
endif()
#-------------------------------------------------------------------------------
# Packages and Paths
#-------------------------------------------------------------------------------
# Sets ${PACKAGE_NS} to the IREE-root relative package name in C++ namespace
# format (::).
#
# Example when called from iree/base/CMakeLists.txt:
# iree::base
function(iree_package_ns PACKAGE_NS)
string(REPLACE ${IREE_ROOT_DIR} "" _PACKAGE ${CMAKE_CURRENT_LIST_DIR})
string(SUBSTRING ${_PACKAGE} 1 -1 _PACKAGE)
string(REPLACE "/" "::" _PACKAGE_NS ${_PACKAGE})
set(${PACKAGE_NS} ${_PACKAGE_NS} PARENT_SCOPE)
endfunction()
# Sets ${PACKAGE_NAME} to the IREE-root relative package name.
#
# Example when called from iree/base/CMakeLists.txt:
# iree_base
function(iree_package_name PACKAGE_NAME)
iree_package_ns(_PACKAGE_NS)
string(REPLACE "::" "_" _PACKAGE_NAME ${_PACKAGE_NS})
set(${PACKAGE_NAME} ${_PACKAGE_NAME} PARENT_SCOPE)
endfunction()
# Sets ${PACKAGE_PATH} to the IREE-root relative package path.
#
# Example when called from iree/base/CMakeLists.txt:
# iree/base
function(iree_package_path PACKAGE_PATH)
iree_package_ns(_PACKAGE_NS)
string(REPLACE "::" "/" _PACKAGE_PATH ${_PACKAGE_NS})
set(${PACKAGE_PATH} ${_PACKAGE_PATH} PARENT_SCOPE)
endfunction()
# Sets ${PACKAGE_DIR} to the directory name of the current package.
#
# Example when called from iree/base/CMakeLists.txt:
# base
function(iree_package_dir PACKAGE_DIR)
iree_package_ns(_PACKAGE_NS)
string(FIND ${_PACKAGE_NS} "::" _END_OFFSET REVERSE)
math(EXPR _END_OFFSET "${_END_OFFSET} + 2")
string(SUBSTRING ${_PACKAGE_NS} ${_END_OFFSET} -1 _PACKAGE_DIR)
set(${PACKAGE_DIR} ${_PACKAGE_DIR} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------------
# select()-like Evaluation
#-------------------------------------------------------------------------------
# Appends ${OPTS} with a list of values based on the current compiler.
#
# Example:
# iree_select_compiler_opts(COPTS
# CLANG
# "-Wno-foo"
# "-Wno-bar"
# CLANG_CL
# "/W3"
# GCC
# "-Wsome-old-flag"
# MSVC
# "/W3"
# )
#
# Note that variables are allowed, making it possible to share options between
# different compiler targets.
function(iree_select_compiler_opts OPTS)
cmake_parse_arguments(
PARSE_ARGV 1
_IREE_SELECTS
""
""
"ALL;CLANG;CLANG_CL;MSVC;GCC;CLANG_OR_GCC;MSVC_OR_CLANG_CL"
)
set(_OPTS)
list(APPEND _OPTS "${_IREE_SELECTS_ALL}")
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
list(APPEND _OPTS "${_IREE_SELECTS_GCC}")
list(APPEND _OPTS "${_IREE_SELECTS_CLANG_OR_GCC}")
elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
if(MSVC)
list(APPEND _OPTS ${_IREE_SELECTS_CLANG_CL})
list(APPEND _OPTS ${_IREE_SELECTS_MSVC_OR_CLANG_CL})
else()
list(APPEND _OPTS ${_IREE_SELECTS_CLANG})
list(APPEND _OPTS ${_IREE_SELECTS_CLANG_OR_GCC})
endif()
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
list(APPEND _OPTS ${_IREE_SELECTS_MSVC})
list(APPEND _OPTS ${_IREE_SELECTS_MSVC_OR_CLANG_CL})
else()
message(ERROR "Unknown compiler: ${CMAKE_CXX_COMPILER}")
list(APPEND _OPTS "")
endif()
set(${OPTS} ${_OPTS} PARENT_SCOPE)
endfunction()
#-------------------------------------------------------------------------------
# Data dependencies
#-------------------------------------------------------------------------------
# Adds 'data' dependencies to a target.
#
# Parameters:
# NAME: name of the target to add data dependencies to
# DATA: List of targets and/or files in the source tree. Files should use the
# same format as targets (i.e. iree::package::subpackage::file.txt)
function(iree_add_data_dependencies)
cmake_parse_arguments(
_RULE
""
"NAME"
"DATA"
${ARGN}
)
if(NOT _RULE_DATA)
return()
endif()
foreach(_DATA_LABEL ${_RULE_DATA})
if(TARGET ${_DATA_LABEL})
add_dependencies(${_RULE_NAME} ${_DATA_LABEL})
else()
# Not a target, assume to be a file instead.
string(REPLACE "::" "/" _FILE_PATH ${_DATA_LABEL})
# Create a target which copies the data file into the build directory.
# If this file is included in multiple rules, only create the target once.
string(REPLACE "::" "_" _DATA_TARGET ${_DATA_LABEL})
if(NOT TARGET ${_DATA_TARGET})
set(_INPUT_PATH "${CMAKE_SOURCE_DIR}/${_FILE_PATH}")
set(_OUTPUT_PATH "${CMAKE_BINARY_DIR}/${_FILE_PATH}")
add_custom_target(${_DATA_TARGET}
COMMAND ${CMAKE_COMMAND} -E copy ${_INPUT_PATH} ${_OUTPUT_PATH}
)
endif()
add_dependencies(${_RULE_NAME} ${_DATA_TARGET})
endif()
endforeach()
endfunction()