blob: 5dc0694b54241ba9225b1dacdcccd003e9680710 [file] [log] [blame]
# Copyright 2025 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
# A wrapper around add_custom_command and a minimal subset of Bazel genrule.
#
# Parameters:
# NAME: Name of the target.
# SRCS: Source files, including any script run in the command.
# Unlike Bazel's genrule, we do not try to distinguish between the
# two. The distinction is needed when tools need to be compiled for
# host, but that doesn't concern us if we only need to run python
# scripts.
# OUTS: Files generated by the command.
# CMD: The command to be executed. The only supported special Bazel genrule
# syntax is:
# * "$(rootpath x)", only supported for source files. In conversion
# to CMake, this expands to the path of x relatively to the current
# source dir.
# * "$(execpath x)", only supported for generated files. In
# conversion to CMake, this expands to just x, as the binary dir is
# the default working dir for custom commands anyway.
function(iree_genrule)
cmake_parse_arguments(
_RULE
""
"NAME"
"SRCS;OUTS;CMD"
${ARGN}
)
set(_CMD "${_RULE_CMD}")
# Replace Bazel syntax $(rootpath x) with the path into the source dir.
string(REGEX REPLACE "\\$\\(rootpath ([^)]+)\\)" "${CMAKE_CURRENT_SOURCE_DIR}/\\1" _CMD "${_CMD}")
# Simply drop Bazel syntax $(execpath x) as Bazel custom commands are executed
# by default in the build directory.
string(REGEX REPLACE "\\$\\(execpath ([^)]+)\\)" "\\1" _CMD "${_CMD}")
# Convert CMake/Unix-style paths with forward slashes to Windows-style with
# backslashes. It is a bit incorrect to do it as a single cmake_path command
# on the whole command string, which isn't technically a path, but this should
# not matter if all what this does is this character substitution.
# It is not worth implementing a cumbersome fix here, when CMake 4.0 brings
# the $<PATH:NATIVE_PATH,...> generator expression which is a simpler, better
# fix here. TODO(bjacob): use that generator expression in the above string
# replace command directly, whenever we can rely on CMake 4.0.
cmake_path(NATIVE_PATH _CMD _CMD)
# CMake add_custom_command expects a list as the command, so we replace spaces
# by semicolon here. Careful to avoid replacing backslash-escaped spaces.
string(REGEX REPLACE "([^\\]) " "\\1;" _CMD "${_CMD}")
add_custom_command(
OUTPUT
"${_RULE_OUTS}"
COMMAND
${_CMD}
DEPENDS
"${_RULE_SRCS}"
COMMENT
"Generating ${_RULE_OUTS}"
VERBATIM
)
add_custom_target("${_RULE_NAME}"
DEPENDS "${_RULE_OUTS}"
)
endfunction()