blob: 7032cfb1ef083259d35b2d7cdcd9e22bbe3725fe [file] [log] [blame]
Geoffrey Martin-Noble552d3f82021-05-25 17:56:09 -07001# Copyright 2020 The IREE Authors
Stella Laurenzo94363e22020-12-15 13:46:14 -08002#
Geoffrey Martin-Noble552d3f82021-05-25 17:56:09 -07003# Licensed under the Apache License v2.0 with LLVM Exceptions.
4# See https://llvm.org/LICENSE.txt for license information.
5# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Stella Laurenzo94363e22020-12-15 13:46:14 -08006
7include(CMakeParseArguments)
8
9###############################################################################
10# Main user rules
11###############################################################################
12
Stella Laurenzo94363e22020-12-15 13:46:14 -080013# iree_py_library()
14#
15# CMake function to imitate Bazel's iree_py_library rule.
16#
17# Parameters:
18# NAME: name of target
19# SRCS: List of source files for the library
20# DEPS: List of other targets the test python libraries require
21# PYEXT_DEPS: List of deps of extensions built with iree_pyext_module
22function(iree_py_library)
23 cmake_parse_arguments(
Scott Todd1a1aea62022-04-28 09:12:11 -070024 _RULE
Stella Laurenzo94363e22020-12-15 13:46:14 -080025 ""
26 "NAME"
27 "SRCS;DEPS;PYEXT_DEPS"
28 ${ARGN}
29 )
30
31 iree_package_ns(_PACKAGE_NS)
32 # Replace dependencies passed by ::name with ::iree::package::name
Scott Todd1a1aea62022-04-28 09:12:11 -070033 list(TRANSFORM _RULE_DEPS REPLACE "^::" "${_PACKAGE_NS}::")
Stella Laurenzo94363e22020-12-15 13:46:14 -080034
35 iree_package_name(_PACKAGE_NAME)
Scott Todd1a1aea62022-04-28 09:12:11 -070036 set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
Stella Laurenzo94363e22020-12-15 13:46:14 -080037
38 add_custom_target(${_NAME} ALL
Scott Todd1a1aea62022-04-28 09:12:11 -070039 DEPENDS ${_RULE_DEPS}
Stella Laurenzo94363e22020-12-15 13:46:14 -080040 )
41
42 # Symlink each file as its own target.
Scott Todd1a1aea62022-04-28 09:12:11 -070043 foreach(_SRC_FILE ${_RULE_SRCS})
44 # _SRC_FILE could have other path components in it, so we need to make a
Geoffrey Martin-Noblefd8a7692021-08-20 05:54:39 -070045 # directory for it. Ninja does this automatically, but make doesn't. See
Scott Todd3f51a552024-04-19 11:00:27 -070046 # https://github.com/iree-org/iree/issues/6801
Scott Todd1a1aea62022-04-28 09:12:11 -070047 set(_SRC_BIN_PATH "${CMAKE_CURRENT_BINARY_DIR}/${_SRC_FILE}")
Geoffrey Martin-Noblefd8a7692021-08-20 05:54:39 -070048 get_filename_component(_SRC_BIN_DIR "${_SRC_BIN_PATH}" DIRECTORY)
Stella Laurenzo94363e22020-12-15 13:46:14 -080049 add_custom_command(
50 TARGET ${_NAME}
Geoffrey Martin-Noblefd8a7692021-08-20 05:54:39 -070051 COMMAND
52 ${CMAKE_COMMAND} -E make_directory "${_SRC_BIN_DIR}"
Stella Laurenzo94363e22020-12-15 13:46:14 -080053 COMMAND ${CMAKE_COMMAND} -E create_symlink
Scott Todd1a1aea62022-04-28 09:12:11 -070054 "${CMAKE_CURRENT_SOURCE_DIR}/${_SRC_FILE}" "${_SRC_BIN_PATH}"
Geoffrey Martin-Noblefd8a7692021-08-20 05:54:39 -070055 BYPRODUCTS "${_SRC_BIN_PATH}"
Stella Laurenzo94363e22020-12-15 13:46:14 -080056 )
57 endforeach()
58
Lei Zhang739a5962021-05-17 15:12:58 -040059 # Add PYEXT_DEPS if any.
Scott Todd1a1aea62022-04-28 09:12:11 -070060 if(_RULE_PYEXT_DEPS)
61 list(TRANSFORM _RULE_PYEXT_DEPS REPLACE "^::" "${_PACKAGE_NS}::")
62 add_dependencies(${_NAME} ${_RULE_PYEXT_DEPS})
Stella Laurenzo94363e22020-12-15 13:46:14 -080063 endif()
64endfunction()
65
Jerry Wu5a8e7382022-04-20 20:20:40 +000066# iree_local_py_test()
Stella Laurenzo94363e22020-12-15 13:46:14 -080067#
Jerry Wu5a8e7382022-04-20 20:20:40 +000068# CMake function to run python test with provided python package paths.
Stella Laurenzo94363e22020-12-15 13:46:14 -080069#
70# Parameters:
71# NAME: name of test
Jerry Wu5a8e7382022-04-20 20:20:40 +000072# SRC: Test source file
Geoffrey Martin-Noblef9cda5a2021-03-16 22:18:01 -070073# ARGS: Command line arguments to the Python source file.
Stella Laurenzo94363e22020-12-15 13:46:14 -080074# LABELS: Additional labels to apply to the test. The package path is added
75# automatically.
Stella Laurenzo0a8a9442021-06-14 22:42:37 -070076# GENERATED_IN_BINARY_DIR: If present, indicates that the srcs have been
77# in the CMAKE_CURRENT_BINARY_DIR.
Jerry Wu5a8e7382022-04-20 20:20:40 +000078# PACKAGE_DIRS: Python package paths to be added to PYTHONPATH.
79function(iree_local_py_test)
Scott Todda6b96c12022-06-06 11:10:11 -070080 if(NOT IREE_BUILD_TESTS OR ANDROID OR EMSCRIPTEN)
Stella Laurenzo94363e22020-12-15 13:46:14 -080081 return()
82 endif()
83
84 cmake_parse_arguments(
85 _RULE
Stella Laurenzo0a8a9442021-06-14 22:42:37 -070086 "GENERATED_IN_BINARY_DIR"
Jerry Wu5a8e7382022-04-20 20:20:40 +000087 "NAME;SRC"
Rob Sudermanf900f502022-06-07 12:26:06 -070088 "ARGS;LABELS;PACKAGE_DIRS;TIMEOUT"
Stella Laurenzo94363e22020-12-15 13:46:14 -080089 ${ARGN}
90 )
91
Stella Laurenzo0a8a9442021-06-14 22:42:37 -070092 # Switch between source and generated tests.
93 set(_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
94 if(_RULE_GENERATED_IN_BINARY_DIR)
95 set(_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}")
96 endif()
97
Stella Laurenzo94363e22020-12-15 13:46:14 -080098 iree_package_name(_PACKAGE_NAME)
99 set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}")
100
101 iree_package_ns(_PACKAGE_NS)
102 string(REPLACE "::" "/" _PACKAGE_PATH ${_PACKAGE_NS})
103 set(_NAME_PATH "${_PACKAGE_PATH}/${_RULE_NAME}")
104 list(APPEND _RULE_LABELS "${_PACKAGE_PATH}")
105
Stella Laurenzo2d82fb72021-10-21 20:52:33 -0700106 add_test(
107 NAME ${_NAME_PATH}
Stella Laurenzo94363e22020-12-15 13:46:14 -0800108 COMMAND
Stella Laurenzo94363e22020-12-15 13:46:14 -0800109 "${Python3_EXECUTABLE}"
Jerry Wu5a8e7382022-04-20 20:20:40 +0000110 "${CMAKE_CURRENT_SOURCE_DIR}/${_RULE_SRC}"
Geoffrey Martin-Noble801c1082021-08-18 18:50:48 -0700111 ${_RULE_ARGS}
Stella Laurenzo94363e22020-12-15 13:46:14 -0800112 )
113
Scott Todda29e67a2022-11-07 17:00:33 -0800114 set_property(TEST ${_NAME_PATH} PROPERTY LABELS "${_RULE_LABELS}")
115 set_property(TEST ${_NAME_PATH} PROPERTY TIMEOUT ${_RULE_ARGS})
116
117 # Extend the PYTHONPATH environment variable with _RULE_PACKAGE_DIRS.
Jerry Wu5a8e7382022-04-20 20:20:40 +0000118 list(APPEND _RULE_PACKAGE_DIRS "$ENV{PYTHONPATH}")
Scott Todda29e67a2022-11-07 17:00:33 -0800119 if(${CMAKE_SYSTEM_NAME} STREQUAL "Windows")
120 # Windows uses semi-colon delimiters, but so does CMake, so escape them.
121 list(JOIN _RULE_PACKAGE_DIRS "\\;" _PYTHONPATH)
122 else()
123 list(JOIN _RULE_PACKAGE_DIRS ":" _PYTHONPATH)
124 endif()
125 set_property(TEST ${_NAME_PATH} PROPERTY ENVIRONMENT
126 "PYTHONPATH=${_PYTHONPATH}"
127 )
Jerry Wu5a8e7382022-04-20 20:20:40 +0000128
Rob Sudermanf900f502022-06-07 12:26:06 -0700129 if (NOT DEFINED _RULE_TIMEOUT)
130 set(_RULE_TIMEOUT 60)
131 endif()
132
Geoffrey Martin-Noble10f18222022-06-09 16:00:13 -0700133 iree_configure_test(${_NAME_PATH})
Geoffrey Martin-Noble801c1082021-08-18 18:50:48 -0700134
Stella Laurenzo94363e22020-12-15 13:46:14 -0800135 # TODO(marbre): Find out how to add deps to tests.
136 # Similar to _RULE_DATA in iree_lit_test().
137endfunction()
Jerry Wu5a8e7382022-04-20 20:20:40 +0000138
139# iree_py_test()
140#
141# CMake function to imitate Bazel's iree_py_test rule.
142#
143# Parameters:
144# NAME: name of test
145# SRCS: Test source file (single file only, despite name)
146# ARGS: Command line arguments to the Python source file.
147# LABELS: Additional labels to apply to the test. The package path is added
148# automatically.
149# GENERATED_IN_BINARY_DIR: If present, indicates that the srcs have been
150# in the CMAKE_CURRENT_BINARY_DIR.
151function(iree_py_test)
152 cmake_parse_arguments(
153 _RULE
154 "GENERATED_IN_BINARY_DIR"
155 "NAME;SRCS"
Rob Sudermanf900f502022-06-07 12:26:06 -0700156 "ARGS;LABELS;TIMEOUT"
Jerry Wu5a8e7382022-04-20 20:20:40 +0000157 ${ARGN}
158 )
Geoffrey Martin-Noble69c35cb2023-03-07 12:05:07 -0800159 if(NOT IREE_BUILD_PYTHON_BINDINGS)
160 return()
161 endif()
Jerry Wu5a8e7382022-04-20 20:20:40 +0000162
163 iree_local_py_test(
164 NAME
165 "${_RULE_NAME}"
166 SRC
167 "${_RULE_SRCS}"
168 ARGS
169 ${_RULE_ARGS}
170 LABELS
171 ${_RULE_LABELS}
172 PACKAGE_DIRS
Stella Laurenzo41a2ceb2022-04-29 12:49:36 -0700173 "${IREE_BINARY_DIR}/compiler/bindings/python"
Jerry Wu5a8e7382022-04-20 20:20:40 +0000174 "${IREE_BINARY_DIR}/runtime/bindings/python"
175 GENERATED_IN_BINARY_DIR
176 "${_RULE_GENERATED_IN_BINARY_DIR}"
Rob Sudermanf900f502022-06-07 12:26:06 -0700177 TIMEOUT
178 ${_RULE_TIMEOUT}
Jerry Wu5a8e7382022-04-20 20:20:40 +0000179 )
180endfunction()