| # 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 |
| |
| function(iree_add_alias_library to_target from_target) |
| add_library(${to_target} ALIAS ${from_target}) |
| # Yes: Leading-lowercase property names are load bearing and the recommended |
| # way to do this: https://gitlab.kitware.com/cmake/cmake/-/issues/19261 |
| # We have to export the aliases on the target, and the when we generate |
| # IREEConfig.cmake, generate code to re-establish the alias on import. |
| # Yeah, this is completely sane. |
| set_property(TARGET ${from_target} APPEND PROPERTY iree_ALIAS_TO ${to_target}) |
| endfunction() |
| |
| function(iree_install_targets) |
| cmake_parse_arguments( |
| _RULE |
| "FIX_INCLUDE_DIRS" |
| "COMPONENT;EXPORT_SET" |
| "HDRS;TARGETS" |
| ${ARGN} |
| ) |
| |
| # Determine install component. It can be explicit on the target or implicit |
| # from the CMake variable IREE_INSTALL_LIBRARY_TARGETS_DEFAULT_COMPONENT |
| # (usually set at the directory level). Note that truthy evaluation is |
| # intended: Installation can be suppressed by setting "COMPONENT OFF". |
| set(_INSTALL_COMPONENT "${_RULE_COMPONENT}") |
| if(NOT _INSTALL_COMPONENT AND IREE_INSTALL_LIBRARY_TARGETS_DEFAULT_COMPONENT) |
| set(_INSTALL_COMPONENT "${IREE_INSTALL_LIBRARY_TARGETS_DEFAULT_COMPONENT}") |
| endif() |
| if(NOT _INSTALL_COMPONENT) |
| return() |
| endif() |
| |
| # Ditto for export set name. |
| set(_EXPORT_SET "${_RULE_EXPORT_SET}") |
| if(NOT _EXPORT_SET AND IREE_INSTALL_LIBRARY_TARGETS_DEFAULT_EXPORT_SET) |
| set(_EXPORT_SET "${IREE_INSTALL_LIBRARY_TARGETS_DEFAULT_EXPORT_SET}") |
| endif() |
| if(NOT _EXPORT_SET) |
| message(SEND_ERROR "Installing ${_RULE_TARGETS}: An install COMPONENT was set but EXPORT_SET was not") |
| endif() |
| |
| # Process targets. |
| set_property(TARGET ${_RULE_TARGETS} APPEND PROPERTY EXPORT_PROPERTIES iree_ALIAS_TO) |
| foreach(_target ${_RULE_TARGETS}) |
| if(_RULE_FIX_INCLUDE_DIRS) |
| get_target_property(_include_dirs ${_target} INTERFACE_INCLUDE_DIRECTORIES) |
| list(TRANSFORM _include_dirs PREPEND "$<BUILD_INTERFACE:") |
| list(TRANSFORM _include_dirs APPEND ">") |
| set_target_properties(${_target} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${_include_dirs}") |
| endif() |
| endforeach() |
| |
| # Add it to the global property that will be processed at the end of the build. |
| set_property(GLOBAL APPEND PROPERTY "IREE_EXPORT_TARGETS_${_EXPORT_SET}" ${_RULE_TARGETS}) |
| |
| # The export name is set at a directory level to control export. |
| install( |
| TARGETS ${_RULE_TARGETS} |
| EXPORT IREEExported-${_EXPORT_SET} |
| COMPONENT "${_INSTALL_COMPONENT}" |
| EXCLUDE_FROM_ALL |
| LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} |
| RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} |
| INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} |
| ) |
| |
| # Install headers if the rule declares them and the directory level |
| # root path is truthy. |
| if(_RULE_HDRS AND IREE_HDRS_ROOT_PATH) |
| foreach(_hdr_file ${_RULE_HDRS}) |
| set(_hdr_abs_path "${CMAKE_CURRENT_SOURCE_DIR}/${_hdr_file}") |
| if(NOT EXISTS "${_hdr_abs_path}") |
| # Assume it is generated in the binary dir. |
| set(_hdr_abs_path "${CMAKE_CURRENT_BINARY_DIR}/${_hdr_file}") |
| endif() |
| set(_hdr_base_relative "${CMAKE_CURRENT_SOURCE_DIR}/${_hdr_file}") |
| cmake_path( |
| RELATIVE_PATH _hdr_base_relative |
| BASE_DIRECTORY "${IREE_HDRS_ROOT_PATH}") |
| cmake_path( |
| GET _hdr_base_relative |
| PARENT_PATH _rel_path |
| ) |
| install( |
| FILES "${_hdr_abs_path}" |
| DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/${_rel_path}" |
| COMPONENT "${_INSTALL_COMPONENT}" |
| EXCLUDE_FROM_ALL |
| ) |
| endforeach() |
| endif() |
| endfunction() |
| |
| # Generates build and install tree export CMake files for a given named |
| # export set. |
| # This will export any targets added to iree_install_targets above with the |
| # same export set name (either explicit or at the directory level). |
| # |
| # This function must be called at a location after which all targets that are |
| # part of the export set have been added (typically at the top-level). |
| # Exports will not be generated if no targets were added for that export set |
| # name. |
| # |
| # If a COMPONENT is specified, the exports will be installed with that |
| # component. Defaults to IREECMakeExports. |
| function(iree_generate_export_targets) |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "COMPONENT;EXPORT_SET;INSTALL_DESTINATION" |
| "" |
| ${ARGN} |
| ) |
| |
| if(NOT _RULE_EXPORT_SET) |
| message(FATAL_ERROR "EXPORT_SET is required") |
| return() |
| endif() |
| |
| get_property(_export_targets GLOBAL PROPERTY "IREE_EXPORT_TARGETS_${_RULE_EXPORT_SET}") |
| if(NOT _export_targets) |
| message(STATUS "Skipping generation of export set ${_RULE_EXPORT_SET} (no targets matched)") |
| endif() |
| |
| set(_component "${_RULE_COMPONENT}") |
| if(NOT _component) |
| set(_component "IREECMakeExports") |
| endif() |
| |
| export(TARGETS ${_export_targets} |
| FILE "${CMAKE_CURRENT_BINARY_DIR}/IREETargets-${_RULE_EXPORT_SET}.cmake") |
| |
| install( |
| EXPORT "IREEExported-${_RULE_EXPORT_SET}" |
| COMPONENT "${_component}" |
| FILE "IREETargets-${_RULE_EXPORT_SET}.cmake" |
| DESTINATION "${_RULE_INSTALL_DESTINATION}" |
| ) |
| |
| # Clear the export targets so that innocent aggregating projects don't |
| # get in trouble if they use our setup. |
| set_property(GLOBAL PROPERTY "IREE_EXPORT_TARGETS_${_RULE_EXPORT_SET}") |
| endfunction() |
| |
| # Adds a convenience install target for a component. |
| function(iree_add_install_target) |
| cmake_parse_arguments( |
| _RULE |
| "" |
| "NAME;COMPONENT" |
| "DEPENDS;ADD_TO" |
| ${ARGN} |
| ) |
| set(_depends ${_RULE_DEPENDS}) |
| |
| if(NOT _RULE_COMPONENT) |
| # Just create stub targets. |
| add_custom_target(${_RULE_NAME}) |
| add_custom_target(${_RULE_NAME}-stripped) |
| else() |
| # Create targets to install a component. |
| set(_options -DCMAKE_INSTALL_COMPONENT="${_RULE_COMPONENT}") |
| |
| # Non-stripped. |
| add_custom_target( |
| ${_RULE_NAME} |
| COMMAND "${CMAKE_COMMAND}" |
| ${_options} |
| -P "${IREE_BINARY_DIR}/cmake_install.cmake" |
| USES_TERMINAL) |
| set_target_properties(${_RULE_NAME} PROPERTIES FOLDER "Component Install Targets") |
| |
| # Stripped. |
| add_custom_target( |
| ${_RULE_NAME}-stripped |
| COMMAND "${CMAKE_COMMAND}" |
| ${_options} |
| -DCMAKE_INSTALL_DO_STRIP=1 |
| -P "${IREE_BINARY_DIR}/cmake_install.cmake" |
| USES_TERMINAL) |
| set_target_properties(${_RULE_NAME} PROPERTIES FOLDER "Component Install Targets") |
| endif() |
| |
| if(_depends) |
| add_dependencies(${_RULE_NAME} ${_depends}) |
| add_dependencies(${_RULE_NAME}-stripped ${_depends}) |
| endif() |
| |
| if(_RULE_ADD_TO) |
| foreach(_add_to ${_RULE_ADD_TO}) |
| add_dependencies(${_add_to} ${_RULE_NAME}) |
| add_dependencies(${_add_to}-stripped ${_RULE_NAME}-stripped) |
| endforeach() |
| endif() |
| endfunction() |