Partial CMakeLists to compile the real icing C++ lib.
Limitations:
* Currently using execute_process instead of add_custom_command, which
causes protobuf compilation to occur during configure. We need to
build protoc on the host, so trying to use add_custom_command to do it
during the target build is complicated.
* Invoking protoc directly instead of using FindProtobuf and
protobuf_generate_cpp. I was able to get FindProtobuf to work with the
external/protobuf source tree, but I can't get protobuf_generate_cpp
to put the generated protos in the right place.
* Icing lib is missing utf dependencies, so this does not currently
compile.
* No work has been done on the link step; we'll have to find a way to
compile libprotobuf-lite for the target and depend on it.
Test: ./gradlew icing:assemble
Bug: 149853706
Change-Id: I0568efe23f255b1fca463891ebd816aca5979841
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..556150a
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,121 @@
+# Copyright 2020 The Android Open Source Project
+#
+# 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
+#
+# http://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.
+
+cmake_minimum_required(VERSION 3.10.2)
+
+# Build protoc with a host configuration. We need to run it on the host to create our proto
+# files.
+set(CMAKE_HOST_ARGS
+ -DBUILD_SHARED_LIBS:BOOL=${BUILD_SHARED_LIBS}
+ -DCMAKE_BUILD_TYPE:STRING=${CMAKE_BUILD_TYPE}
+ -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
+ -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
+ -DCMAKE_GENERATOR:STRING=${CMAKE_GENERATOR}
+ -DCMAKE_MAKE_PROGRAM:FILEPATH=${CMAKE_MAKE_PROGRAM})
+
+set(Protobuf_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../protobuf")
+set(Protobuf_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf-host")
+# Run another cmake invocation to configure the protobuf project
+execute_process(
+ COMMAND "${CMAKE_COMMAND}"
+ ${CMAKE_HOST_ARGS}
+ -H${Protobuf_SOURCE_DIR}/cmake
+ -B${Protobuf_BINARY_DIR}
+ -Dprotobuf_BUILD_TESTS:BOOL=OFF
+ RESULT_VARIABLE exec_value
+ OUTPUT_VARIABLE exec_output
+ ERROR_VARIABLE exec_output
+)
+message("Result of proto configuration: ${exec_value}. Output: ${exec_output}")
+
+# Run the actual build tool (ninja) to compile protoc for the host
+execute_process(
+ COMMAND "${CMAKE_MAKE_PROGRAM}" protoc
+ WORKING_DIRECTORY ${Protobuf_BINARY_DIR}
+ RESULT_VARIABLE exec_value
+ OUTPUT_VARIABLE exec_output
+ ERROR_VARIABLE exec_output
+)
+message("Result of proto build: ${exec_value}. Output: ${exec_output}")
+
+# Glob Icing proto sources
+file(
+ GLOB_RECURSE
+ Icing_PROTO_FILES
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ "icing/*.proto")
+message(STATUS "Icing_PROTO_FILES=${Icing_PROTO_FILES}")
+
+# Run protoc on Icing_PROTO_FILES to generate pb.cc and pb.h files
+set(Icing_PROTO_GEN_DIR "${PROTO_GENERATED_FILES_BASE_DIR}/cpp")
+file(MAKE_DIRECTORY ${Icing_PROTO_GEN_DIR})
+foreach(FILE ${Icing_PROTO_FILES})
+ # Find the name of the proto file without the .proto extension
+ string(REGEX REPLACE "\.proto$" "" FILE_NOEXT ${FILE})
+ execute_process(
+ COMMAND "${Protobuf_BINARY_DIR}/protoc"
+ --proto_path ${CMAKE_CURRENT_SOURCE_DIR}
+ --cpp_out ${Icing_PROTO_GEN_DIR}
+ ${FILE}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ RESULT_VARIABLE exec_value
+ OUTPUT_VARIABLE exec_output
+ ERROR_VARIABLE exec_output
+ )
+ message("Result of protoc ${FILE}: ${exec_value}. Output: ${exec_output}")
+endforeach()
+
+# Glob generated source files from running protoc
+file(
+ GLOB_RECURSE
+ Icing_PROTO_SOURCES
+ "${Icing_PROTO_GEN_DIR}/*.pb.cc"
+ "${Icing_PROTO_GEN_DIR}/*.pb.h"
+)
+message(STATUS "Icing_PROTO_SOURCES=${Icing_PROTO_SOURCES}")
+
+# Glob Icing C++ sources
+# TODO: When supporting cmake v3.12 or higher, use CONFIGURE_DEPENDS in the glob
+# below so that cmake knows when to re-generate the makefiles.
+file(
+ # List files recursively
+ GLOB_RECURSE
+ # Store into a variable of this name
+ Icing_CC_SOURCES
+ # Return paths that are relative to the project root
+ RELATIVE ${CMAKE_CURRENT_SOURCE_DIR}
+ # Glob expressions
+ icing/*.cc icing/*.h
+)
+# Exclude the same types of files as Android.bp. See the comments there.
+list(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/.*_test\.cc$")
+list(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/.*_benchmark\.cc$")
+list(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/testing/.*$")
+list(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/tools/.*$")
+message(STATUS "Icing_CC_SOURCES=${Icing_CC_SOURCES}")
+
+add_library(
+ # .so name
+ icing
+
+ # Shared or static
+ SHARED
+
+ # Provides a relative path to your source file(s).
+ ${Icing_CC_SOURCES}
+ ${Icing_PROTO_SOURCES}
+)
+target_include_directories(icing PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
+target_include_directories(icing PRIVATE ${Icing_PROTO_GEN_DIR})
+target_include_directories(icing PRIVATE "${Protobuf_SOURCE_DIR}/src")