blob: 0f1715170cf8d877cb640885e15c213f1358a94d [file] [log] [blame]
# Copyright 2023 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
include(CMakeParseArguments)
# iree_bitcode_library()
#
# Builds an LLVM bitcode library from an input file via clang
#
# Parameters:
# NAME: Name of target (see Note).
# SRCS: Source files to pass to clang.
# HDRS: Additional headers included by the source files.
# COPTS: additional flags to pass to clang.
# DEFINES: Preprocessor definitions to pass to clang.
# DATA: Additional data required during compilation.
# OUT: Output file name (defaults to NAME.bc).
# PUBLIC: Add this so that this library will be exported under ${PACKAGE}::
# Also in IDE, target will appear in ${PACKAGE} folder while non PUBLIC
# will be in ${PACKAGE}/internal.
# TESTONLY: When added, this target will only be built if IREE_BUILD_TESTS=ON.
function(iree_bitcode_library)
cmake_parse_arguments(
_RULE
"PUBLIC;TESTONLY"
"NAME;OUT"
"SRCS;HDRS;COPTS;DEFINES;DATA"
${ARGN}
)
set(_CLANG_TOOL "$<TARGET_FILE:${IREE_CLANG_TARGET}>")
set(_LINK_TOOL "$<TARGET_FILE:${IREE_LLVM_LINK_TARGET}>")
# These are copied as part of the clang build; we could allow the user to
# override this but it should be harmless.
set(_BUILTIN_HEADERS_PATH "${IREE_BINARY_DIR}/third_party/llvm-project/llvm/lib/clang/${CLANG_VERSION_MAJOR}/include/")
if(_RULE_TESTONLY AND NOT IREE_BUILD_TESTS)
return()
endif()
if(DEFINED _RULE_OUT)
set(_OUT "${_RULE_OUT}")
else()
set(_OUT "${_RULE_NAME}.bc")
endif()
set(_ARGS "-isystem ${_BUILTIN_HEADERS_PATH}")
list(APPEND _ARGS "${_RULE_COPTS}")
foreach(_DEFINE ${_RULE_DEFINES})
list(APPEND _ARGS "-D${_DEFINE}")
endforeach()
set(_BITCODE_FILES)
foreach(_BITCODE_SRC ${_RULE_SRCS})
get_filename_component(_BITCODE_SRC_PATH "${_BITCODE_SRC}" REALPATH)
set(_BITCODE_FILE "${_RULE_NAME}_${_BITCODE_SRC}.bc")
list(APPEND _BITCODE_FILES ${_BITCODE_FILE})
add_custom_command(
OUTPUT
${_BITCODE_FILE}
COMMAND
${_CLANG_TOOL}
${_ARGS}
"${_BITCODE_SRC_PATH}"
"-o"
"${_BITCODE_FILE}"
DEPENDS
${_CLANG_TOOL}
${_BITCODE_SRC}
COMMENT
"Compiling ${_BITCODE_SRC} to ${_BITCODE_FILE}"
VERBATIM
)
endforeach()
add_custom_command(
OUTPUT
${_OUT}
COMMAND
${_LINK_TOOL}
${_BITCODE_FILES}
"-o"
"${_OUT}"
DEPENDS
${_LINK_TOOL}
${_RULE_SRCS}
${_BITCODE_FILES}
COMMENT
"Linking bitcode to ${_OUT}"
VERBATIM
)
# Only add iree_${NAME} as custom target doesn't support aliasing to
# iree::${NAME}.
iree_package_name(_PACKAGE_NAME)
add_custom_target("${_PACKAGE_NAME}_${_RULE_NAME}"
DEPENDS "${_OUT}"
)
endfunction()