1*8b6cd535SAndroid Build Coastguard Worker# Copyright 2020 The Android Open Source Project 2*8b6cd535SAndroid Build Coastguard Worker# 3*8b6cd535SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*8b6cd535SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*8b6cd535SAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*8b6cd535SAndroid Build Coastguard Worker# 7*8b6cd535SAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*8b6cd535SAndroid Build Coastguard Worker# 9*8b6cd535SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*8b6cd535SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*8b6cd535SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*8b6cd535SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*8b6cd535SAndroid Build Coastguard Worker# limitations under the License. 14*8b6cd535SAndroid Build Coastguard Worker 15*8b6cd535SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.22.1) 16*8b6cd535SAndroid Build Coastguard Worker 17*8b6cd535SAndroid Build Coastguard Workerproject(icing) 18*8b6cd535SAndroid Build Coastguard Worker 19*8b6cd535SAndroid Build Coastguard Workeradd_definitions("-DICING_REVERSE_JNI_SEGMENTATION=1") 20*8b6cd535SAndroid Build Coastguard Workerset(VERSION_SCRIPT "${CMAKE_CURRENT_SOURCE_DIR}/icing/jni.lds") 21*8b6cd535SAndroid Build Coastguard Workerset(CMAKE_CXX_STANDARD 17) 22*8b6cd535SAndroid Build Coastguard Workerset(CMAKE_SHARED_LINKER_FLAGS 23*8b6cd535SAndroid Build Coastguard Worker "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--gc-sections -Wl,--version-script=${VERSION_SCRIPT}") 24*8b6cd535SAndroid Build Coastguard Worker 25*8b6cd535SAndroid Build Coastguard Workerset( 26*8b6cd535SAndroid Build Coastguard Worker Protobuf_PREBUILTS_DIR 27*8b6cd535SAndroid Build Coastguard Worker "${CMAKE_CURRENT_SOURCE_DIR}/../../prebuilts/protobuf") 28*8b6cd535SAndroid Build Coastguard Workerset(Protobuf_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../protobuf") 29*8b6cd535SAndroid Build Coastguard Workerset(Protobuf_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/protobuf-target") 30*8b6cd535SAndroid Build Coastguard Workerset(Icing_PROTO_GEN_DIR "${CMAKE_CURRENT_BINARY_DIR}/icing-protobuf-gen") 31*8b6cd535SAndroid Build Coastguard Worker 32*8b6cd535SAndroid Build Coastguard Worker## Configure libprotobuf ## 33*8b6cd535SAndroid Build Coastguard Worker# Find the right protoc to compile our proto files 34*8b6cd535SAndroid Build Coastguard Workerif(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Darwin") 35*8b6cd535SAndroid Build Coastguard Worker set(Protobuf_PROTOC_PATH "${Protobuf_PREBUILTS_DIR}/darwin-x86_64/protoc") 36*8b6cd535SAndroid Build Coastguard Workerelseif(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Linux") 37*8b6cd535SAndroid Build Coastguard Worker set(Protobuf_PROTOC_PATH "${Protobuf_PREBUILTS_DIR}/linux-x86_64/protoc") 38*8b6cd535SAndroid Build Coastguard Workerelseif(${CMAKE_HOST_SYSTEM_NAME} STREQUAL "Windows") 39*8b6cd535SAndroid Build Coastguard Worker set(Protobuf_PROTOC_PATH "${Protobuf_PREBUILTS_DIR}/windows-x86/protoc.exe") 40*8b6cd535SAndroid Build Coastguard Workerelse() 41*8b6cd535SAndroid Build Coastguard Worker message( 42*8b6cd535SAndroid Build Coastguard Worker FATAL_ERROR 43*8b6cd535SAndroid Build Coastguard Worker "No protoc prebuilt found for host OS ${CMAKE_HOST_SYSTEM_NAME}") 44*8b6cd535SAndroid Build Coastguard Workerendif() 45*8b6cd535SAndroid Build Coastguard Workermessage(STATUS "Using prebuilt protoc at: ${Protobuf_PROTOC_PATH}") 46*8b6cd535SAndroid Build Coastguard Worker 47*8b6cd535SAndroid Build Coastguard Worker# Compile libprotobuf 48*8b6cd535SAndroid Build Coastguard Workerset(protobuf_BUILD_TESTS OFF CACHE BOOL "") 49*8b6cd535SAndroid Build Coastguard Workeradd_subdirectory("${Protobuf_SOURCE_DIR}/cmake" ${Protobuf_TARGET_BINARY_DIR}) 50*8b6cd535SAndroid Build Coastguard Worker 51*8b6cd535SAndroid Build Coastguard Worker# Compile libandroidicu 52*8b6cd535SAndroid Build Coastguard Workerset(ICU_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../icu/libandroidicu") 53*8b6cd535SAndroid Build Coastguard Workerset(ICU_TARGET_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/icu-target") 54*8b6cd535SAndroid Build Coastguard Workeradd_subdirectory("${ICU_SOURCE_DIR}/static_shim" ${ICU_TARGET_BINARY_DIR}) 55*8b6cd535SAndroid Build Coastguard Worker 56*8b6cd535SAndroid Build Coastguard Worker# Glob Icing proto sources. Results look like this: icing/proto/document.proto 57*8b6cd535SAndroid Build Coastguard Workerfile( 58*8b6cd535SAndroid Build Coastguard Worker GLOB_RECURSE 59*8b6cd535SAndroid Build Coastguard Worker Icing_PROTO_FILES 60*8b6cd535SAndroid Build Coastguard Worker RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}/proto" 61*8b6cd535SAndroid Build Coastguard Worker "*.proto") 62*8b6cd535SAndroid Build Coastguard Workermessage(STATUS "Icing_PROTO_FILES=${Icing_PROTO_FILES}") 63*8b6cd535SAndroid Build Coastguard Worker 64*8b6cd535SAndroid Build Coastguard Worker 65*8b6cd535SAndroid Build Coastguard Worker# Run protoc on Icing_PROTO_FILES to generate pb.cc and pb.h files 66*8b6cd535SAndroid Build Coastguard Worker# The DEPENDS section of add_custom_command could trigger a remake if any proto 67*8b6cd535SAndroid Build Coastguard Worker# source file has been updated. 68*8b6cd535SAndroid Build Coastguard Workerfile(MAKE_DIRECTORY ${Icing_PROTO_GEN_DIR}) 69*8b6cd535SAndroid Build Coastguard Workerforeach(FILE ${Icing_PROTO_FILES}) 70*8b6cd535SAndroid Build Coastguard Worker # Find the name of the proto file without the .proto extension 71*8b6cd535SAndroid Build Coastguard Worker string(REGEX REPLACE "\.proto$" "" FILE_NOEXT ${FILE}) 72*8b6cd535SAndroid Build Coastguard Worker list(APPEND Icing_PROTO_SOURCES 73*8b6cd535SAndroid Build Coastguard Worker "${Icing_PROTO_GEN_DIR}/${FILE_NOEXT}.pb.cc" 74*8b6cd535SAndroid Build Coastguard Worker "${Icing_PROTO_GEN_DIR}/${FILE_NOEXT}.pb.h") 75*8b6cd535SAndroid Build Coastguard Worker add_custom_command( 76*8b6cd535SAndroid Build Coastguard Worker OUTPUT "${Icing_PROTO_GEN_DIR}/${FILE_NOEXT}.pb.cc" 77*8b6cd535SAndroid Build Coastguard Worker "${Icing_PROTO_GEN_DIR}/${FILE_NOEXT}.pb.h" 78*8b6cd535SAndroid Build Coastguard Worker COMMAND ${Protobuf_PROTOC_PATH} 79*8b6cd535SAndroid Build Coastguard Worker --proto_path "${CMAKE_CURRENT_SOURCE_DIR}/proto" 80*8b6cd535SAndroid Build Coastguard Worker --cpp_out "lite:${Icing_PROTO_GEN_DIR}" 81*8b6cd535SAndroid Build Coastguard Worker ${FILE} 82*8b6cd535SAndroid Build Coastguard Worker WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 83*8b6cd535SAndroid Build Coastguard Worker DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/proto/${FILE} 84*8b6cd535SAndroid Build Coastguard Worker ) 85*8b6cd535SAndroid Build Coastguard Workerendforeach() 86*8b6cd535SAndroid Build Coastguard Workermessage(STATUS "Icing_PROTO_SOURCES=${Icing_PROTO_SOURCES}") 87*8b6cd535SAndroid Build Coastguard Worker 88*8b6cd535SAndroid Build Coastguard Worker# Glob Icing C++ sources 89*8b6cd535SAndroid Build Coastguard Worker# TODO: When supporting cmake v3.12 or higher, use CONFIGURE_DEPENDS in the glob 90*8b6cd535SAndroid Build Coastguard Worker# below so that cmake knows when to re-generate the makefiles. 91*8b6cd535SAndroid Build Coastguard Workerfile( 92*8b6cd535SAndroid Build Coastguard Worker # List files recursively 93*8b6cd535SAndroid Build Coastguard Worker GLOB_RECURSE 94*8b6cd535SAndroid Build Coastguard Worker # Store into a variable of this name 95*8b6cd535SAndroid Build Coastguard Worker Icing_CC_SOURCES 96*8b6cd535SAndroid Build Coastguard Worker # Return paths that are relative to the project root 97*8b6cd535SAndroid Build Coastguard Worker RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} 98*8b6cd535SAndroid Build Coastguard Worker # Glob expressions 99*8b6cd535SAndroid Build Coastguard Worker icing/*.cc icing/*.h 100*8b6cd535SAndroid Build Coastguard Worker) 101*8b6cd535SAndroid Build Coastguard Worker 102*8b6cd535SAndroid Build Coastguard Worker# TODO(b/170611579): When supporting cmake v3.12 or higher, use CONFIGURE_DEPENDS 103*8b6cd535SAndroid Build Coastguard Worker# in the glob and remove this section. 104*8b6cd535SAndroid Build Coastguard Workerinclude(synced_AOSP_CL_number.txt) 105*8b6cd535SAndroid Build Coastguard Worker 106*8b6cd535SAndroid Build Coastguard Worker# Exclude the same types of files as Android.bp. See the comments there. 107*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/.*[^a-zA-Z0-9]test[^a-zA-Z0-9].*$") 108*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/.*_benchmark\.cc$") 109*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/helpers/icu/.*$") 110*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/testing/.*$") 111*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/tokenization/icu/.*$") 112*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/tokenization/simple/.*$") 113*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/tools/.*$") 114*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/transform/icu/.*$") 115*8b6cd535SAndroid Build Coastguard Workerlist(FILTER Icing_CC_SOURCES EXCLUDE REGEX "^icing/transform/simple/.*$") 116*8b6cd535SAndroid Build Coastguard Workermessage(STATUS "Icing_CC_SOURCES=${Icing_CC_SOURCES}") 117*8b6cd535SAndroid Build Coastguard Worker 118*8b6cd535SAndroid Build Coastguard Workeradd_library( 119*8b6cd535SAndroid Build Coastguard Worker # .so name 120*8b6cd535SAndroid Build Coastguard Worker icing 121*8b6cd535SAndroid Build Coastguard Worker 122*8b6cd535SAndroid Build Coastguard Worker # Shared or static 123*8b6cd535SAndroid Build Coastguard Worker SHARED 124*8b6cd535SAndroid Build Coastguard Worker 125*8b6cd535SAndroid Build Coastguard Worker # Provides a relative path to your source file(s). 126*8b6cd535SAndroid Build Coastguard Worker ${Icing_CC_SOURCES} 127*8b6cd535SAndroid Build Coastguard Worker ${Icing_PROTO_SOURCES} 128*8b6cd535SAndroid Build Coastguard Worker) 129*8b6cd535SAndroid Build Coastguard Workertarget_include_directories(icing PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) 130*8b6cd535SAndroid Build Coastguard Workertarget_include_directories(icing PRIVATE ${Icing_PROTO_GEN_DIR}) 131*8b6cd535SAndroid Build Coastguard Workertarget_include_directories(icing PRIVATE "${Protobuf_SOURCE_DIR}/src") 132*8b6cd535SAndroid Build Coastguard Workertarget_include_directories(icing PRIVATE "${ICU_SOURCE_DIR}/include") 133*8b6cd535SAndroid Build Coastguard Workertarget_link_libraries(icing protobuf::libprotobuf-lite libandroidicu log z) 134