Adding more (still incomplete) CMake files and fixing public build errors.
With this base/, hal/ and vm/ compile and link.
PiperOrigin-RevId: 270336801
diff --git a/build_tools/cmake/external_cc_library.cmake b/build_tools/cmake/external_cc_library.cmake
new file mode 100644
index 0000000..69e791f
--- /dev/null
+++ b/build_tools/cmake/external_cc_library.cmake
@@ -0,0 +1,179 @@
+# Copyright 2019 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)
+
+# external_cc_library()
+#
+# CMake function to imitate Bazel's cc_library rule.
+# This is used for external libraries (from third_party, etc) that don't live
+# in the IREE namespace.
+#
+# Parameters:
+# PACKAGE: Name of the package (overrides actual path)
+# NAME: Name of target (see Note)
+# ROOT: Path to the source root where files are found
+# HDRS: List of public header files for the library
+# SRCS: List of source files for the library
+# DEPS: List of other libraries to be linked in to the binary targets
+# COPTS: List of private compile options
+# DEFINES: List of public defines
+# INCLUDES: Include directories to add to dependencies
+# LINKOPTS: List of link options
+# PUBLIC: Add this so that this library will be exported under iree::
+# Also in IDE, target will appear in IREE folder while non PUBLIC will be in IREE/internal.
+# TESTONLY: When added, this target will only be built if user passes -DIREE_BUILD_TESTS=ON to CMake.
+#
+# Note:
+# By default, external_cc_library will always create a library named ${PACKAGE}_${NAME},
+# and alias target ${PACKAGE}::${NAME}. The ${PACKAGE}:: form should always be used.
+# This is to reduce namespace pollution.
+#
+# external_cc_library(
+# PACKAGE
+# some_external_thing
+# NAME
+# awesome
+# ROOT
+# "third_party/foo"
+# HDRS
+# "a.h"
+# SRCS
+# "a.cc"
+# )
+# external_cc_library(
+# PACKAGE
+# some_external_thing
+# NAME
+# fantastic_lib
+# ROOT
+# "third_party/foo"
+# SRCS
+# "b.cc"
+# DEPS
+# some_external_thing::awesome # not "awesome" !
+# PUBLIC
+# )
+#
+# iree_cc_library(
+# NAME
+# main_lib
+# ...
+# DEPS
+# some_external_thing::fantastic_lib
+# )
+#
+# TODO: Implement "ALWAYSLINK"
+function(external_cc_library)
+ cmake_parse_arguments(EXTERNAL_CC_LIB
+ "PUBLIC;TESTONLY"
+ "PACKAGE;NAME;ROOT"
+ "HDRS;SRCS;COPTS;DEFINES;LINKOPTS;DEPS;INCLUDES"
+ ${ARGN}
+ )
+
+ if(NOT EXTERNAL_CC_LIB_TESTONLY OR IREE_BUILD_TESTS)
+ # Prefix the library with the package name.
+ string(REPLACE "::" "_" _PACKAGE_NAME ${EXTERNAL_CC_LIB_PACKAGE})
+ set(_NAME "${_PACKAGE_NAME}_${EXTERNAL_CC_LIB_NAME}")
+
+ # Prefix paths with the root.
+ list(TRANSFORM EXTERNAL_CC_LIB_HDRS PREPEND ${EXTERNAL_CC_LIB_ROOT})
+ list(TRANSFORM EXTERNAL_CC_LIB_SRCS PREPEND ${EXTERNAL_CC_LIB_ROOT})
+
+ # Check if this is a header-only library.
+ # Note that as of February 2019, many popular OS's (for example, Ubuntu
+ # 16.04 LTS) only come with cmake 3.5 by default. For this reason, we can't
+ # use list(FILTER...)
+ set(_CC_SRCS "${EXTERNAL_CC_LIB_SRCS}")
+ foreach(src_file IN LISTS _CC_SRCS)
+ if(${src_file} MATCHES ".*\\.(h|inc)")
+ list(REMOVE_ITEM _CC_SRCS "${src_file}")
+ endif()
+ endforeach()
+ if("${_CC_SRCS}" STREQUAL "")
+ set(EXTERNAL_CC_LIB_IS_INTERFACE 1)
+ else()
+ set(EXTERNAL_CC_LIB_IS_INTERFACE 0)
+ endif()
+
+ if(NOT EXTERNAL_CC_LIB_IS_INTERFACE)
+ add_library(${_NAME} STATIC "")
+ target_sources(${_NAME}
+ PRIVATE
+ ${EXTERNAL_CC_LIB_SRCS}
+ ${EXTERNAL_CC_LIB_HDRS}
+ )
+ target_include_directories(${_NAME}
+ PUBLIC
+ "$<BUILD_INTERFACE:${IREE_COMMON_INCLUDE_DIRS}>"
+ "$<BUILD_INTERFACE:${EXTERNAL_CC_LIB_INCLUDES}>"
+ )
+ target_compile_options(${_NAME}
+ PRIVATE
+ ${EXTERNAL_CC_LIB_COPTS}
+ ${IREE_DEFAULT_COPTS}
+ )
+ target_link_libraries(${_NAME}
+ PUBLIC
+ ${EXTERNAL_CC_LIB_DEPS}
+ PRIVATE
+ ${EXTERNAL_CC_LIB_LINKOPTS}
+ ${IREE_DEFAULT_LINKOPTS}
+ )
+ target_compile_definitions(${_NAME}
+ PUBLIC
+ ${EXTERNAL_CC_LIB_DEFINES}
+ )
+
+ # Add all external targets to a a folder in the IDE for organization.
+ if(EXTERNAL_CC_LIB_PUBLIC)
+ set_property(TARGET ${_NAME} PROPERTY FOLDER third_party)
+ elseif(EXTERNAL_CC_LIB_TESTONLY)
+ set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/test)
+ else()
+ set_property(TARGET ${_NAME} PROPERTY FOLDER third_party/internal)
+ endif()
+
+ # INTERFACE libraries can't have the CXX_STANDARD property set
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD ${IREE_CXX_STANDARD})
+ set_property(TARGET ${_NAME} PROPERTY CXX_STANDARD_REQUIRED ON)
+ else()
+ # Generating header-only library
+ add_library(${_NAME} INTERFACE)
+ target_include_directories(${_NAME}
+ INTERFACE
+ "$<BUILD_INTERFACE:${IREE_COMMON_INCLUDE_DIRS}>"
+ "$<BUILD_INTERFACE:${EXTERNAL_CC_LIB_INCLUDES}>"
+ )
+ target_compile_options(${_NAME}
+ INTERFACE
+ ${EXTERNAL_CC_LIB_COPTS}
+ ${IREE_DEFAULT_COPTS}
+ )
+ target_link_libraries(${_NAME}
+ INTERFACE
+ ${EXTERNAL_CC_LIB_DEPS}
+ ${EXTERNAL_CC_LIB_LINKOPTS}
+ ${IREE_DEFAULT_LINKOPTS}
+ )
+ target_compile_definitions(${_NAME}
+ INTERFACE
+ ${EXTERNAL_CC_LIB_DEFINES}
+ )
+ endif()
+
+ add_library(${EXTERNAL_CC_LIB_PACKAGE}::${EXTERNAL_CC_LIB_NAME} ALIAS ${_NAME})
+ endif()
+endfunction()