| # Copyright 2020 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) |
| |
| ############################################################################### |
| # Main user rules |
| ############################################################################### |
| |
| # iree_pyext_module() |
| # |
| # Builds a native python module (.so/.dylib/.pyd). |
| # |
| # Parameters: |
| # NAME: name of target |
| # MODULE_NAME: Base-name of the module. |
| # SRCS: List of source files for the library |
| # DEPS: List of other targets the test python libraries require |
| function(iree_pyext_module) |
| cmake_parse_arguments(ARG |
| "" |
| "NAME;MODULE_NAME;UNIX_LINKER_SCRIPT" |
| "SRCS;DEPS;COPTS;INCLUDES" |
| ${ARGN}) |
| |
| iree_package_ns(_PACKAGE_NS) |
| # Replace dependencies passed by ::name with ::iree::package::name |
| list(TRANSFORM ARG_DEPS REPLACE "^::" "${_PACKAGE_NS}::") |
| list(TRANSFORM ARG_PYEXT_DEPS REPLACE "^::" "${_PACKAGE_NS}::") |
| # Prefix the library with the package name, so we get: iree_package_name. |
| iree_package_name(_PACKAGE_NAME) |
| set(_NAME "${_PACKAGE_NAME}_${ARG_NAME}") |
| |
| pybind11_add_module( |
| ${_NAME} |
| ${ARG_SRCS} |
| ) |
| |
| target_link_libraries( |
| ${_NAME} |
| PRIVATE ${ARG_DEPS} |
| ) |
| |
| set_target_properties( |
| ${_NAME} PROPERTIES |
| OUTPUT_NAME "${ARG_MODULE_NAME}" |
| ) |
| |
| target_include_directories(${_NAME} |
| PUBLIC |
| "$<BUILD_INTERFACE:${ARG_INCLUDES}>" |
| ) |
| |
| target_compile_options( |
| ${_NAME} PRIVATE |
| ${ARG_COPTS} |
| ${IREE_DEFAULT_COPTS} |
| ) |
| |
| |
| # Link flags. |
| if(UNIX AND NOT APPLE) # Apple does not support linker scripts. |
| if(ARG_UNIX_LINKER_SCRIPT) |
| set_target_properties(${_NAME} PROPERTIES LINK_FLAGS |
| "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/${ARG_UNIX_LINKER_SCRIPT}") |
| endif() |
| endif() |
| endfunction() |
| |
| # iree_py_library() |
| # |
| # CMake function to imitate Bazel's iree_py_library rule. |
| # |
| # Parameters: |
| # NAME: name of target |
| # SRCS: List of source files for the library |
| # DEPS: List of other targets the test python libraries require |
| # PYEXT_DEPS: List of deps of extensions built with iree_pyext_module |
| function(iree_py_library) |
| cmake_parse_arguments( |
| ARG |
| "" |
| "NAME" |
| "SRCS;DEPS;PYEXT_DEPS" |
| ${ARGN} |
| ) |
| |
| iree_package_ns(_PACKAGE_NS) |
| # Replace dependencies passed by ::name with ::iree::package::name |
| list(TRANSFORM ARG_DEPS REPLACE "^::" "${_PACKAGE_NS}::") |
| |
| iree_package_name(_PACKAGE_NAME) |
| set(_NAME "${_PACKAGE_NAME}_${ARG_NAME}") |
| |
| add_custom_target(${_NAME} ALL |
| DEPENDS ${ARG_DEPS} |
| ) |
| |
| # Symlink each file as its own target. |
| foreach(SRC_FILE ${ARG_SRCS}) |
| add_custom_command( |
| TARGET ${_NAME} |
| COMMAND ${CMAKE_COMMAND} -E create_symlink |
| "${CMAKE_CURRENT_SOURCE_DIR}/${SRC_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE}" |
| BYPRODUCTS "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILE}" |
| ) |
| endforeach() |
| |
| # Add PYEXT_DEPS. |
| if(${ARG_PYEXT_DEPS}) |
| foreach(V ${IREE_MULTIPY_VERSIONS_EFFECTIVE}) |
| add_dependencies(${_NAME} ${ARG_PYEXT_DEPS}) |
| endforeach() |
| endif() |
| endfunction() |
| |
| # iree_py_test() |
| # |
| # CMake function to imitate Bazel's iree_py_test rule. |
| # |
| # Parameters: |
| # NAME: name of test |
| # SRCS: List of source file |
| # DEPS: List of deps the test requires |
| # LABELS: Additional labels to apply to the test. The package path is added |
| # automatically. |
| function(iree_py_test) |
| if(NOT IREE_BUILD_TESTS) |
| return() |
| endif() |
| |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "NAME" |
| "SRCS;DEPS;LABELS" |
| ${ARGN} |
| ) |
| |
| iree_package_name(_PACKAGE_NAME) |
| set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}") |
| |
| iree_package_ns(_PACKAGE_NS) |
| string(REPLACE "::" "/" _PACKAGE_PATH ${_PACKAGE_NS}) |
| set(_NAME_PATH "${_PACKAGE_PATH}/${_RULE_NAME}") |
| list(APPEND _RULE_LABELS "${_PACKAGE_PATH}") |
| |
| add_test( |
| NAME ${_NAME} |
| COMMAND |
| "${CMAKE_SOURCE_DIR}/build_tools/cmake/run_test.${IREE_HOST_SCRIPT_EXT}" |
| "${Python3_EXECUTABLE}" |
| "${CMAKE_CURRENT_SOURCE_DIR}/${_RULE_SRCS}" |
| WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} |
| ) |
| |
| set_property(TEST ${_NAME} PROPERTY LABELS "${_RULE_LABELS}") |
| set_property(TEST ${_NAME} PROPERTY ENVIRONMENT "PYTHONPATH=${CMAKE_BINARY_DIR}/bindings/python:$ENV{PYTHONPATH};TEST_TMPDIR=${_NAME}_${V}_test_tmpdir") |
| # TODO(marbre): Find out how to add deps to tests. |
| # Similar to _RULE_DATA in iree_lit_test(). |
| endfunction() |