Geoffrey Martin-Noble | 552d3f8 | 2021-05-25 17:56:09 -0700 | [diff] [blame] | 1 | # Copyright 2019 The IREE Authors |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 2 | # |
Geoffrey Martin-Noble | 552d3f8 | 2021-05-25 17:56:09 -0700 | [diff] [blame] | 3 | # 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 |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 6 | |
| 7 | include(CMakeParseArguments) |
| 8 | |
| 9 | # external_cc_library() |
| 10 | # |
| 11 | # CMake function to imitate Bazel's cc_library rule. |
| 12 | # This is used for external libraries (from third_party, etc) that don't live |
| 13 | # in the IREE namespace. |
| 14 | # |
| 15 | # Parameters: |
| 16 | # PACKAGE: Name of the package (overrides actual path) |
| 17 | # NAME: Name of target (see Note) |
| 18 | # ROOT: Path to the source root where files are found |
| 19 | # HDRS: List of public header files for the library |
| 20 | # SRCS: List of source files for the library |
Scott Todd | da2d239 | 2020-03-09 16:42:55 -0700 | [diff] [blame] | 21 | # DATA: List of other targets and files required for this binary |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 22 | # DEPS: List of other libraries to be linked in to the binary targets |
| 23 | # COPTS: List of private compile options |
| 24 | # DEFINES: List of public defines |
| 25 | # INCLUDES: Include directories to add to dependencies |
| 26 | # LINKOPTS: List of link options |
Ben Vanik | 6b112ef | 2019-10-03 10:45:14 -0700 | [diff] [blame] | 27 | # PUBLIC: Add this so that this library will be exported under ${PACKAGE}:: |
| 28 | # Also in IDE, target will appear in ${PACKAGE} folder while non PUBLIC will be |
| 29 | # in ${PACKAGE}/internal. |
| 30 | # TESTONLY: When added, this target will only be built if user passes |
| 31 | # -DIREE_BUILD_TESTS=ON to CMake. |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 32 | # |
| 33 | # Note: |
Ben Vanik | 6b112ef | 2019-10-03 10:45:14 -0700 | [diff] [blame] | 34 | # By default, external_cc_library will always create a library named |
| 35 | # ${PACKAGE}_${NAME}, and alias target ${PACKAGE}::${NAME}. The ${PACKAGE}:: |
| 36 | # form should always be used. This is to reduce namespace pollution. |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 37 | # |
| 38 | # external_cc_library( |
| 39 | # PACKAGE |
| 40 | # some_external_thing |
| 41 | # NAME |
| 42 | # awesome |
| 43 | # ROOT |
| 44 | # "third_party/foo" |
| 45 | # HDRS |
| 46 | # "a.h" |
| 47 | # SRCS |
| 48 | # "a.cc" |
| 49 | # ) |
| 50 | # external_cc_library( |
| 51 | # PACKAGE |
| 52 | # some_external_thing |
| 53 | # NAME |
| 54 | # fantastic_lib |
| 55 | # ROOT |
| 56 | # "third_party/foo" |
| 57 | # SRCS |
| 58 | # "b.cc" |
| 59 | # DEPS |
| 60 | # some_external_thing::awesome # not "awesome" ! |
| 61 | # PUBLIC |
| 62 | # ) |
| 63 | # |
| 64 | # iree_cc_library( |
| 65 | # NAME |
| 66 | # main_lib |
| 67 | # ... |
| 68 | # DEPS |
| 69 | # some_external_thing::fantastic_lib |
| 70 | # ) |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 71 | function(external_cc_library) |
Ben Vanik | 6b112ef | 2019-10-03 10:45:14 -0700 | [diff] [blame] | 72 | cmake_parse_arguments(_RULE |
Ben Vanik | bf091d3 | 2020-11-16 05:53:58 -0800 | [diff] [blame] | 73 | "PUBLIC;TESTONLY" |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 74 | "PACKAGE;NAME;ROOT" |
Scott Todd | da2d239 | 2020-03-09 16:42:55 -0700 | [diff] [blame] | 75 | "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DATA;DEPS;INCLUDES" |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 76 | ${ARGN} |
| 77 | ) |
| 78 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 79 | if(_RULE_TESTONLY AND NOT IREE_BUILD_TESTS) |
| 80 | return() |
| 81 | endif() |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 82 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 83 | # Prefix the library with the package name. |
| 84 | string(REPLACE "::" "_" _PACKAGE_NAME ${_RULE_PACKAGE}) |
| 85 | set(_NAME "${_PACKAGE_NAME}_${_RULE_NAME}") |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 86 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 87 | # Prefix paths with the root. |
| 88 | list(TRANSFORM _RULE_HDRS PREPEND ${_RULE_ROOT}) |
| 89 | list(TRANSFORM _RULE_SRCS PREPEND ${_RULE_ROOT}) |
| 90 | |
| 91 | # Check if this is a header-only library. |
| 92 | # Note that as of February 2019, many popular OS's (for example, Ubuntu |
| 93 | # 16.04 LTS) only come with cmake 3.5 by default. For this reason, we can't |
| 94 | # use list(FILTER...) |
| 95 | set(_CC_SRCS "${_RULE_SRCS}") |
Scott Todd | 1a1aea6 | 2022-04-28 09:12:11 -0700 | [diff] [blame] | 96 | foreach(_SRC_FILE IN LISTS _CC_SRCS) |
hehaoqian | c7ef4be | 2022-07-06 06:13:12 +0800 | [diff] [blame] | 97 | if(${_SRC_FILE} MATCHES ".*\\.(h|inc)$") |
Scott Todd | 1a1aea6 | 2022-04-28 09:12:11 -0700 | [diff] [blame] | 98 | list(REMOVE_ITEM _CC_SRCS "${_SRC_FILE}") |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 99 | endif() |
| 100 | endforeach() |
| 101 | if("${_CC_SRCS}" STREQUAL "") |
| 102 | set(_RULE_IS_INTERFACE 1) |
| 103 | else() |
| 104 | set(_RULE_IS_INTERFACE 0) |
| 105 | endif() |
| 106 | |
| 107 | if(NOT _RULE_IS_INTERFACE) |
| 108 | add_library(${_NAME} STATIC "") |
| 109 | target_sources(${_NAME} |
| 110 | PRIVATE |
| 111 | ${_RULE_SRCS} |
| 112 | ${_RULE_HDRS} |
| 113 | ) |
Ben Vanik | afd7abe | 2020-10-07 09:01:53 -0700 | [diff] [blame] | 114 | target_include_directories(${_NAME} SYSTEM |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 115 | PUBLIC |
Ben Vanik | 6bc6f90 | 2020-11-16 05:37:08 -0800 | [diff] [blame] | 116 | "$<BUILD_INTERFACE:${IREE_SOURCE_DIR}>" |
| 117 | "$<BUILD_INTERFACE:${IREE_BINARY_DIR}>" |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 118 | "$<BUILD_INTERFACE:${_RULE_INCLUDES}>" |
| 119 | ) |
| 120 | target_compile_options(${_NAME} |
| 121 | PRIVATE |
| 122 | ${_RULE_COPTS} |
| 123 | ${IREE_DEFAULT_COPTS} |
| 124 | ) |
Ben Vanik | 2f0b75c | 2020-12-23 19:29:55 -0800 | [diff] [blame] | 125 | target_link_options(${_NAME} |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 126 | PRIVATE |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 127 | ${IREE_DEFAULT_LINKOPTS} |
Ben Vanik | bf4069e | 2020-11-14 11:23:01 -0800 | [diff] [blame] | 128 | ${_RULE_LINKOPTS} |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 129 | ) |
Ben Vanik | 2f0b75c | 2020-12-23 19:29:55 -0800 | [diff] [blame] | 130 | target_link_libraries(${_NAME} |
| 131 | PUBLIC |
| 132 | ${_RULE_DEPS} |
| 133 | ) |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 134 | target_compile_definitions(${_NAME} |
| 135 | PUBLIC |
| 136 | ${_RULE_DEFINES} |
| 137 | ) |
| 138 | iree_add_data_dependencies(NAME ${_NAME} DATA ${_RULE_DATA}) |
| 139 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 140 | # Add all external targets to a a folder in the IDE for organization. |
| 141 | if(_RULE_PUBLIC) |
| 142 | set_property(TARGET ${_NAME} PROPERTY FOLDER third_party) |
| 143 | elseif(_RULE_TESTONLY) |
| 144 | set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/test) |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 145 | else() |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 146 | set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/internal) |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 147 | endif() |
| 148 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 149 | # INTERFACE libraries can't have the CXX_STANDARD property set |
| 150 | set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${IREE_CXX_STANDARD}) |
| 151 | set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON) |
| 152 | else() |
| 153 | # Generating header-only library |
| 154 | add_library(${_NAME} INTERFACE) |
Ben Vanik | afd7abe | 2020-10-07 09:01:53 -0700 | [diff] [blame] | 155 | target_include_directories(${_NAME} SYSTEM |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 156 | INTERFACE |
Ben Vanik | 6bc6f90 | 2020-11-16 05:37:08 -0800 | [diff] [blame] | 157 | "$<BUILD_INTERFACE:${IREE_SOURCE_DIR}>" |
| 158 | "$<BUILD_INTERFACE:${IREE_BINARY_DIR}>" |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 159 | "$<BUILD_INTERFACE:${_RULE_INCLUDES}>" |
| 160 | ) |
| 161 | target_compile_options(${_NAME} |
| 162 | INTERFACE |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 163 | ${IREE_DEFAULT_COPTS} |
Ben Vanik | bf4069e | 2020-11-14 11:23:01 -0800 | [diff] [blame] | 164 | ${_RULE_COPTS} |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 165 | ) |
Ben Vanik | 2f0b75c | 2020-12-23 19:29:55 -0800 | [diff] [blame] | 166 | target_link_options(${_NAME} |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 167 | INTERFACE |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 168 | ${IREE_DEFAULT_LINKOPTS} |
Ben Vanik | bf4069e | 2020-11-14 11:23:01 -0800 | [diff] [blame] | 169 | ${_RULE_LINKOPTS} |
Ben Vanik | 2f0b75c | 2020-12-23 19:29:55 -0800 | [diff] [blame] | 170 | ) |
| 171 | target_link_libraries(${_NAME} |
| 172 | INTERFACE |
Ben Vanik | bf4069e | 2020-11-14 11:23:01 -0800 | [diff] [blame] | 173 | ${_RULE_DEPS} |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 174 | ) |
| 175 | iree_add_data_dependencies(NAME ${_NAME} DATA ${_RULE_DATA}) |
| 176 | target_compile_definitions(${_NAME} |
| 177 | INTERFACE |
| 178 | ${_RULE_DEFINES} |
| 179 | ) |
| 180 | endif() |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 181 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 182 | add_library(${_RULE_PACKAGE}::${_RULE_NAME} ALIAS ${_NAME}) |
Geoffrey Martin-Noble | b5d90ac | 2021-05-12 13:49:59 -0700 | [diff] [blame] | 183 | # If the library name matches the final component of the package then treat it |
| 184 | # as a default. For example, 'foo::bar' library 'bar' would end up as |
| 185 | # 'foo::bar'. |
| 186 | string(REGEX REPLACE "^.*::" "" _PACKAGE_DIR ${_RULE_PACKAGE}) |
| 187 | if(${_PACKAGE_DIR} STREQUAL ${_RULE_NAME}) |
| 188 | |
Lei Zhang | d454ee4 | 2020-06-02 11:48:57 -0700 | [diff] [blame] | 189 | add_library(${_RULE_PACKAGE} ALIAS ${_NAME}) |
Ben Vanik | 512d2d3 | 2019-09-20 13:22:34 -0700 | [diff] [blame] | 190 | endif() |
| 191 | endfunction() |