# 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 "$") 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()