blob: 48baf67034248dcd74b3c160a022169d3058b815 [file] [log] [blame]
# Copyright 2019 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_bytecode_module()
#
# Builds an IREE bytecode module.
#
# Parameters:
# NAME: Name of target (see Note).
# SRC: Source file to compile into a bytecode module.
# FLAGS: Flags to pass to the compiler tool (list of strings).
# `--output-format=vm-bytecode` is included automatically.
# MODULE_FILE_NAME: Optional. When specified, sets the output bytecode module
# file name. When not specified, a default file name will be generated from
# ${NAME}.
# COMPILE_TOOL: Compiler tool to invoke (CMake target). The default tool is
# "iree-compile".
# C_IDENTIFIER: Identifier to use for generate c embed code.
# If omitted then no C embed code will be generated.
# STATIC_LIB_PATH: When added, the module is compiled into a LLVM static
# library with the specified library path.
# FRIENDLY_NAME: Optional. Name to use to display build progress info.
# 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.
# DEPENDS: Optional. Additional dependencies beyond SRC and the tools.
# DEPS: Library dependencies to add to the generated embed cc library.
#
# Note:
# By default, iree_bytecode_module will create a module target named ${NAME} and
# a library named ${NAME}_c. The library has an alias target iree::${NAME}_c.
# The module doesn't have an alias due to a lack of support on custom target.
# The iree:: form should always be used to reduce namespace pollution.
function(iree_bytecode_module)
cmake_parse_arguments(
_RULE
"PUBLIC;TESTONLY"
"NAME;SRC;MODULE_FILE_NAME;COMPILE_TOOL;C_IDENTIFIER;FRIENDLY_NAME;STATIC_LIB_PATH"
"FLAGS;DEPENDS;DEPS"
${ARGN}
)
if(_RULE_TESTONLY AND NOT IREE_BUILD_TESTS)
return()
endif()
if(_RULE_STATIC_LIB_PATH AND
NOT (IREE_TARGET_BACKEND_LLVM_CPU OR IREE_HOST_BIN_DIR))
message(SEND_ERROR "Static library only supports llvm-cpu backend")
endif()
# Set default for COMPILE_TOOL.
if(DEFINED _RULE_COMPILE_TOOL)
set(_COMPILE_TOOL ${_RULE_COMPILE_TOOL})
else()
set(_COMPILE_TOOL "iree-compile")
endif()
if(DEFINED _RULE_MODULE_FILE_NAME)
set(_MODULE_FILE_NAME "${_RULE_MODULE_FILE_NAME}")
else()
set(_MODULE_FILE_NAME "${_RULE_NAME}.vmfb")
endif()
set(_ARGS
"--output-format=vm-bytecode"
"--mlir-print-op-on-diagnostic=false"
)
list(APPEND _ARGS "${_RULE_FLAGS}")
get_filename_component(_SRC_PATH "${_RULE_SRC}" REALPATH)
list(APPEND _ARGS "${_SRC_PATH}")
list(APPEND _ARGS "-o")
list(APPEND _ARGS "${_MODULE_FILE_NAME}")
# Add the build directory to the compiler object file search path by default.
# Users can add their own additional directories as needed.
list(APPEND _ARGS "--iree-hal-executable-object-search-path=\"${IREE_BINARY_DIR}\"")
set(_OUTPUT_FILES "${_MODULE_FILE_NAME}")
# If the llvm-cpu backend is used, pass build-system-dependent flags.
#
# This crude check for target backend llvm-cpu is borrowed from
# iree_compile_flags_for_platform(). This should be made more robust and
# shared in a common helper.
if (_RULE_FLAGS MATCHES "iree-hal-target-backends=llvm-cpu")
if (IREE_LLD_BINARY)
# Pass build-system-dependent linker paths.
list(APPEND _ARGS "--iree-llvmcpu-embedded-linker-path=\"${IREE_LLD_BINARY}\"")
list(APPEND _ARGS "--iree-llvmcpu-wasm-linker-path=\"${IREE_LLD_BINARY}\"")
endif()
# Note: --iree-llvmcpu-system-linker-path is left unspecified.
# Check LLVM static library setting. If the static libary output path is set,
# retrieve the object path and the corresponding header file path.
if(_RULE_STATIC_LIB_PATH)
list(APPEND _ARGS "--iree-llvmcpu-link-embedded=false")
list(APPEND _ARGS "--iree-llvmcpu-link-static")
list(APPEND _ARGS "--iree-llvmcpu-static-library-output-path=${_RULE_STATIC_LIB_PATH}")
string(REPLACE ".o" ".h" _STATIC_HDR_PATH "${_RULE_STATIC_LIB_PATH}")
list(APPEND _OUTPUT_FILES "${_RULE_STATIC_LIB_PATH}" "${_STATIC_HDR_PATH}")
endif()
endif()
iree_compile_flags_for_platform(_PLATFORM_FLAGS "${_RULE_FLAGS}")
if(_PLATFORM_FLAGS)
list(APPEND _ARGS ${_PLATFORM_FLAGS})
endif()
if(_RULE_FRIENDLY_NAME)
set(_FRIENDLY_NAME "${_RULE_FRIENDLY_NAME}")
else()
get_filename_component(_FRIENDLY_NAME "${_RULE_SRC}" NAME)
endif()
set(_DEPENDS "")
iree_package_ns(_PACKAGE_NAME)
list(TRANSFORM _RULE_DEPENDS REPLACE "^::" "${_PACKAGE_NAME}::")
foreach(_DEPEND ${_RULE_DEPENDS})
string(REPLACE "::" "_" _DEPEND "${_DEPEND}")
list(APPEND _DEPENDS ${_DEPEND})
endforeach()
add_custom_command(
OUTPUT
${_OUTPUT_FILES}
COMMAND
${_COMPILE_TOOL}
${_ARGS}
DEPENDS
${_COMPILE_TOOL}
${_LINKER_TOOL_EXECUTABLE}
${_RULE_SRC}
${_DEPENDS}
COMMENT
"Generating ${_MODULE_FILE_NAME} from ${_FRIENDLY_NAME}"
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 "${_MODULE_FILE_NAME}"
)
if(_RULE_TESTONLY)
set(_TESTONLY_ARG "TESTONLY")
endif()
if(_RULE_PUBLIC)
set(_PUBLIC_ARG "PUBLIC")
endif()
if(_RULE_C_IDENTIFIER)
iree_c_embed_data(
NAME
"${_RULE_NAME}_c"
IDENTIFIER
"${_RULE_C_IDENTIFIER}"
SRCS
"${_RULE_NAME}.vmfb"
C_FILE_OUTPUT
"${_RULE_NAME}_c.c"
H_FILE_OUTPUT
"${_RULE_NAME}_c.h"
FLATTEN
"${_PUBLIC_ARG}"
"${_TESTONLY_ARG}"
DEPS
${_RULE_DEPS}
)
endif()
endfunction()