From 319afcdd5b4ee20720922979a9fadc425391a3df Mon Sep 17 00:00:00 2001 From: kangkaisen Date: Wed, 1 Oct 2025 09:45:20 +0800 Subject: [PATCH] [Tool] Support compilation on Mac 3: CMakeLists.txt (#63713) --- .gitignore | 12 + build-mac/CMakeLists.txt | 876 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 888 insertions(+) create mode 100644 build-mac/CMakeLists.txt diff --git a/.gitignore b/.gitignore index 713ffe69dff..044cc67715f 100644 --- a/.gitignore +++ b/.gitignore @@ -98,3 +98,15 @@ CMakeLists.txt .claude CLAUDE.md .clangd + + +!build-mac/CMakeLists.txt +# build-mac generated files +build-mac/.ninja_deps +build-mac/.ninja_lock +build-mac/.ninja_log +build-mac/CMakeCache.txt +build-mac/CMakeFiles/ +build-mac/build.ninja +build-mac/build_version.cc +build-mac/cmake_install.cmake diff --git a/build-mac/CMakeLists.txt b/build-mac/CMakeLists.txt new file mode 100644 index 00000000000..e5b03a61de3 --- /dev/null +++ b/build-mac/CMakeLists.txt @@ -0,0 +1,876 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +# ============================================================================== +# StarRocks Backend (BE) CMakeLists.txt for macOS ARM64 +# ============================================================================== +# +# This CMakeLists.txt is specifically designed for building StarRocks BE on +# macOS ARM64 (Apple Silicon). It includes all necessary configurations for: +# - Third-party library integration +# - Apple frameworks support +# - ARM64 optimizations +# - Static linking preferences +# - Disabled problematic components +# +# Usage: +# mkdir build && cd build +# cmake -G Ninja -DCMAKE_BUILD_TYPE=Release .. +# ninja starrocks_be +# +# Environment Variables: +# STARROCKS_THIRDPARTY - Third-party libraries directory +# STARROCKS_GCC_HOME - Compiler home directory +# STARROCKS_LLVM_HOME - LLVM home directory +# PROTOBUF_ROOT - Protobuf installation directory +# + +cmake_minimum_required(VERSION 3.11.1) + +# ============================================================================== +# PLATFORM VALIDATION +# ============================================================================== +if(NOT APPLE) + message(FATAL_ERROR "This CMakeLists.txt is specifically for macOS builds only") +endif() + +# Check for ARM64 architecture (handle both possible values) +execute_process(COMMAND uname -m OUTPUT_VARIABLE SYSTEM_ARCH OUTPUT_STRIP_TRAILING_WHITESPACE) +if(NOT SYSTEM_ARCH STREQUAL "arm64" AND NOT CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64") + message(FATAL_ERROR "This CMakeLists.txt is specifically for Apple Silicon (ARM64) only. Current architecture: ${SYSTEM_ARCH}") +endif() + +# ============================================================================== +# COMPILER CONFIGURATION +# ============================================================================== +# Set CMAKE_C_COMPILER and CMAKE_CXX_COMPILER before project command +if(DEFINED ENV{CC} AND DEFINED ENV{CXX}) + set(CMAKE_C_COMPILER "$ENV{CC}") + set(CMAKE_CXX_COMPILER "$ENV{CXX}") +elseif(DEFINED ENV{STARROCKS_LLVM_HOME}) + set(CMAKE_C_COMPILER "$ENV{STARROCKS_LLVM_HOME}/bin/clang") + set(CMAKE_CXX_COMPILER "$ENV{STARROCKS_LLVM_HOME}/bin/clang++") +elseif(DEFINED ENV{STARROCKS_GCC_HOME}) + set(CMAKE_C_COMPILER "$ENV{STARROCKS_GCC_HOME}/bin/clang") + set(CMAKE_CXX_COMPILER "$ENV{STARROCKS_GCC_HOME}/bin/clang++") +else() + message(FATAL_ERROR "Either CC/CXX or STARROCKS_LLVM_HOME environment variable must be set") +endif() + +# Set archiver tools early (before enabling languages) +if(DEFINED ENV{STARROCKS_LLVM_HOME}) + if(NOT DEFINED CMAKE_AR) + set(CMAKE_AR "$ENV{STARROCKS_LLVM_HOME}/bin/llvm-ar" CACHE FILEPATH "Archiver" FORCE) + endif() + if(NOT DEFINED CMAKE_RANLIB) + set(CMAKE_RANLIB "$ENV{STARROCKS_LLVM_HOME}/bin/llvm-ranlib" CACHE FILEPATH "Ranlib" FORCE) + endif() +endif() + +# Disable pkgconfig searching libraries, all libraries are static imported +set(CMAKE_DISABLE_FIND_PACKAGE_PkgConfig ON) +# Workaround error of `Unknown CMake command "pkg_check_modules".'` +macro(pkg_check_modules) +endmacro() + +project(starrocks_macos CXX C) + +# ============================================================================== +# BUILD TYPE CONFIGURATION +# ============================================================================== +if(NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE Release) +endif() + +string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE) +message(STATUS "Build type is ${CMAKE_BUILD_TYPE}") + +# Set CMAKE_BUILD_TARGET_ARCH +execute_process(COMMAND bash "-c" "uname -m" + OUTPUT_VARIABLE CMAKE_BUILD_TARGET_ARCH + OUTPUT_STRIP_TRAILING_WHITESPACE) +message(STATUS "Build target arch is ${CMAKE_BUILD_TARGET_ARCH}") + +# ============================================================================== +# DIRECTORY CONFIGURATION +# ============================================================================== +set(BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../be") +set(BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}") +set(THIRDPARTY_DIR "$ENV{STARROCKS_THIRDPARTY}") +set(STARROCKS_THIRDPARTY "$ENV{STARROCKS_THIRDPARTY}") +set(SRC_DIR "${BASE_DIR}/src") +set(GENSRC_DIR "${SRC_DIR}/gen_cpp/build") +set(TEST_DIR "${CMAKE_SOURCE_DIR}/test/") +set(OUTPUT_DIR "${BASE_DIR}/output") +set(CONTRIB_DIR "${BASE_DIR}/../contrib/") + +# Validate essential paths +if(NOT EXISTS "${BASE_DIR}") + message(FATAL_ERROR "StarRocks BE directory not found: ${BASE_DIR}") +endif() + +if(NOT THIRDPARTY_DIR) + message(FATAL_ERROR "STARROCKS_THIRDPARTY environment variable must be set") +endif() + +message(STATUS "Base directory: ${BASE_DIR}") +message(STATUS "Build directory: ${BUILD_DIR}") +message(STATUS "Third-party directory: ${THIRDPARTY_DIR}") + +# ============================================================================== +# FEATURE OPTIONS - DISABLED COMPONENTS FOR MACOS +# ============================================================================== +# Force disable problematic components on macOS +option(MAKE_TEST "ON for make unit test or OFF for not" OFF) +option(WITH_AVRO "Build with Avro support" OFF) +option(WITH_ORC "Build with ORC support" OFF) +option(WITH_HDFS "Build with HDFS support" OFF) +option(WITH_JDBC "Build with JDBC support" OFF) +option(WITH_HTTP "Build with HTTP client support" ON) # Required for BE operation +option(WITH_PYTHON "Build with Python runtime support" OFF) +option(WITH_JAVA "Build with Java runtime support" OFF) +option(WITH_LZO "Build with LZO compression support" OFF) +option(WITH_S2 "Build with S2 geometry support" OFF) +option(WITH_GLOG_STACKTRACE "Build with glog stack trace support" OFF) +option(WITH_STARCACHE "Build with starcache support" OFF) +option(WITH_PULSAR "Build with Pulsar support" OFF) +option(WITH_BVAR "Build with BVAR support" OFF) +option(WITH_JSON_FLAT "Build with JSON flat support" OFF) +option(WITH_ARROW_FLIGHT "Build with Arrow Flight support" OFF) +option(WITH_KAFKA "Build with Kafka support" OFF) +option(WITH_TENANN "Build with TENANN" OFF) +option(WITH_AZURE "Build with Azure support" OFF) +option(WITH_GEO "Build with GEO support" OFF) +option(WITH_S3 "Build with S3 support" OFF) +option(WITH_MYSQL "Build with MySQL table writer support" OFF) +option(WITH_CLUCENE "Build with CLucene inverted index support" OFF) +option(USE_SANITIZER "Enable AddressSanitizer" OFF) +option(USE_SSE4_2 "Build with SSE4.2 instruction" OFF) +option(USE_BMI_2 "Build with BMI2 instruction" OFF) +option(USE_AVX2 "Build with AVX2 instruction" OFF) +option(USE_AVX512 "Build with AVX512f/AVX512BW instruction" OFF) +option(STARROCKS_JIT_ENABLE "Enable JIT compilation support" OFF) + +# Set all disabled options as FORCE to prevent override +set(WITH_AVRO OFF CACHE BOOL "Disable Avro on macOS" FORCE) +set(WITH_ORC OFF CACHE BOOL "Disable ORC on macOS" FORCE) +set(WITH_HDFS OFF CACHE BOOL "Disable HDFS on macOS" FORCE) +set(WITH_JDBC OFF CACHE BOOL "Disable JDBC on macOS" FORCE) +set(WITH_PYTHON OFF CACHE BOOL "Disable Python runtime on macOS" FORCE) +set(WITH_JAVA OFF CACHE BOOL "Disable Java runtime on macOS" FORCE) +set(WITH_LZO OFF CACHE BOOL "Disable LZO compression on macOS" FORCE) +set(WITH_S2 OFF CACHE BOOL "Disable S2 geometry on macOS" FORCE) +set(WITH_GLOG_STACKTRACE OFF CACHE BOOL "Disable glog stack trace on macOS" FORCE) +set(WITH_STARCACHE OFF CACHE BOOL "Disable starcache on macOS" FORCE) +set(USE_SSE4_2 OFF CACHE BOOL "Disable SSE4.2 on ARM64" FORCE) +set(USE_AVX2 OFF CACHE BOOL "Disable AVX2 on ARM64" FORCE) +set(USE_AVX512 OFF CACHE BOOL "Disable AVX512 on ARM64" FORCE) +set(STARROCKS_JIT_ENABLE OFF CACHE BOOL "Disable JIT on macOS" FORCE) +set(WITH_AZURE OFF CACHE BOOL "Disable Azure on macOS" FORCE) +set(WITH_GEO OFF CACHE BOOL "Disable GEO on macOS" FORCE) +set(WITH_S3 OFF CACHE BOOL "Disable S3 on macOS" FORCE) +set(WITH_MYSQL OFF CACHE BOOL "Disable MySQL table writer on macOS" FORCE) +set(WITH_CLUCENE OFF CACHE BOOL "Disable CLucene inverted index on macOS" FORCE) + +# Add compile definitions for disabled features +add_definitions(-DMACOS_DISABLE_AVRO) +add_definitions(-DMACOS_DISABLE_ORC) +add_definitions(-DMACOS_DISABLE_HDFS) +add_definitions(-DMACOS_DISABLE_JDBC) +add_definitions(-DMACOS_DISABLE_PYTHON) +add_definitions(-DMACOS_DISABLE_JAVA) +add_definitions(-DMACOS_DISABLE_LZO) +add_definitions(-DMACOS_DISABLE_S2) +add_definitions(-DMACOS_DISABLE_GLOG_STACKTRACE) +add_definitions(-DMACOS_DISABLE_TRACER) +add_definitions(-DMACOS_DISABLE_OPENTELEMETRY) +add_definitions(-DMACOS_DISABLE_JIT) +add_definitions(-DMACOS_DISABLE_AZURE) +add_definitions(-DMACOS_DISABLE_GEO) +add_definitions(-DMACOS_DISABLE_S3) +add_definitions(-DMACOS_DISABLE_MYSQL) +add_definitions(-DMACOS_DISABLE_CLUCENE) + +message(STATUS "macOS: Disabled problematic components for ARM64 compatibility") + +# ============================================================================== +# PROTOBUF CONFIGURATION - CRITICAL FOR BRPC COMPATIBILITY +# ============================================================================== +# Use compiled protobuf-3.14.0 from thirdparty directory +if(DEFINED ENV{PROTOBUF_ROOT}) + set(PROTOBUF_HOME "$ENV{PROTOBUF_ROOT}") +else() + set(PROTOBUF_HOME "${THIRDPARTY_DIR}/installed") +endif() + +# Force CMake to use our protobuf instead of system +set(CMAKE_FIND_PACKAGE_PREFER_CONFIG ON) +set(CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH OFF) +set(CMAKE_PREFIX_PATH "${PROTOBUF_HOME};${CMAKE_PREFIX_PATH}") +set(CMAKE_FIND_ROOT_PATH "${PROTOBUF_HOME};${CMAKE_FIND_ROOT_PATH}") + +# Overwrite any cached Protobuf discovery with our thirdparty 3.14.0 +set(Protobuf_DIR "${PROTOBUF_HOME}/lib/cmake/protobuf" CACHE PATH "Protobuf config dir" FORCE) +set(protobuf_DIR "${PROTOBUF_HOME}/lib/cmake/protobuf" CACHE PATH "protobuf config dir (lowercase)" FORCE) + +# Remove any system protobuf paths from CMAKE_PREFIX_PATH +string(REPLACE "/opt/homebrew/lib/cmake/protobuf" "" CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}") +string(REPLACE "/opt/homebrew" "" CMAKE_PREFIX_PATH "${CMAKE_PREFIX_PATH}") + +# Ensure our protobuf path is first in CMAKE_PREFIX_PATH +set(CMAKE_PREFIX_PATH "${PROTOBUF_HOME}/lib/cmake/protobuf;${PROTOBUF_HOME};${CMAKE_PREFIX_PATH}") + +# Set protobuf variables for direct usage +set(PROTOBUF_FOUND TRUE) +set(PROTOBUF_LIBRARY "${PROTOBUF_HOME}/lib/libprotobuf.a" CACHE FILEPATH "libprotobuf.a" FORCE) +set(PROTOBUF_INCLUDE_DIR "${PROTOBUF_HOME}/include" CACHE PATH "protobuf include dir" FORCE) +set(PROTOBUF_PROTOC_EXECUTABLE "${PROTOBUF_HOME}/bin/protoc" CACHE FILEPATH "protoc" FORCE) + +# Force override again after any other package loads protobuf +set(Protobuf_FOUND TRUE) +set(Protobuf_INCLUDE_DIRS "${PROTOBUF_HOME}/include" CACHE PATH "" FORCE) +set(Protobuf_LIBRARIES "${PROTOBUF_HOME}/lib/libprotobuf.a" CACHE FILEPATH "" FORCE) +set(Protobuf_PROTOC_EXECUTABLE "${PROTOBUF_HOME}/bin/protoc" CACHE FILEPATH "" FORCE) + +# Create protobuf target for macOS - STATIC ONLY to avoid dynamic linking +add_library(protobuf STATIC IMPORTED GLOBAL) +set_target_properties(protobuf PROPERTIES + IMPORTED_LOCATION "${PROTOBUF_HOME}/lib/libprotobuf.a" + INTERFACE_INCLUDE_DIRECTORIES "${PROTOBUF_HOME}/include" + IMPORTED_LINK_INTERFACE_LIBRARIES "") + +# Force static linking preferences +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +set(BUILD_SHARED_LIBS OFF) + +# Force linker to use static protobuf and reject dynamic ones +set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-search_paths_first") +set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-search_paths_first") + +# Force compiler include paths: ensure our protobuf include comes FIRST +include_directories(BEFORE "${PROTOBUF_HOME}/include") + +message(STATUS "Protobuf configuration:") +message(STATUS " Home: ${PROTOBUF_HOME}") +message(STATUS " Library: ${PROTOBUF_LIBRARY}") +message(STATUS " Include: ${PROTOBUF_INCLUDE_DIR}") +message(STATUS " Protoc: ${PROTOBUF_PROTOC_EXECUTABLE}") + +# ============================================================================== +# COMPILER VALIDATION +# ============================================================================== +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "4.8.2") + message(FATAL_ERROR "Need GCC version at least 4.8.2") + endif() +elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") + message(STATUS "Using Clang compiler: ${CMAKE_CXX_COMPILER}") +else() + message(FATAL_ERROR "Unsupported compiler: ${CMAKE_CXX_COMPILER_ID}") +endif() + +# ============================================================================== +# BUILD VERSION CONFIGURATION +# ============================================================================== +set(BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/build_version.cc) +configure_file(${SRC_DIR}/common/build_version.cc.in ${BUILD_VERSION_CC} @ONLY) +add_library(build_version OBJECT ${BUILD_VERSION_CC}) +target_include_directories(build_version PRIVATE ${SRC_DIR}/common) + +# ============================================================================== +# THIRD-PARTY LIBRARY PATHS +# ============================================================================== +# Add common cmake prefix path and link library path +list(APPEND CMAKE_PREFIX_PATH ${THIRDPARTY_DIR}/installed/lib/cmake) +list(APPEND CMAKE_PREFIX_PATH ${THIRDPARTY_DIR}/installed/lib64/cmake) +link_directories(${THIRDPARTY_DIR}/installed/lib ${THIRDPARTY_DIR}/installed/lib64) + +# ============================================================================== +# BOOST CONFIGURATION +# ============================================================================== +set(Boost_DEBUG FALSE) +set(Boost_USE_MULTITHREADED ON) +set(Boost_NO_BOOST_CMAKE ON) +set(BOOST_ROOT ${THIRDPARTY_DIR}/installed) + +# On macOS, use shared Boost (more compatible) +set(Boost_USE_STATIC_LIBS OFF) +set(Boost_USE_STATIC_RUNTIME OFF) + +# Thread configuration for macOS +set(CMAKE_THREAD_LIBS_INIT "-lpthread") +set(CMAKE_HAVE_THREADS_LIBRARY 1) +set(CMAKE_USE_WIN32_THREADS_INIT 0) +set(CMAKE_USE_PTHREADS_INIT 1) +set(THREADS_PREFER_PTHREAD_FLAG ON) + +# Find threads before Boost +find_package(Threads REQUIRED) + +# Skip gensrc build on macOS (causes issues with cross-compilation tools) +message(STATUS "Skipping gensrc build on macOS") + +# ============================================================================== +# BOOST PACKAGE DISCOVERY +# ============================================================================== +# Note: In Boost 1.73+, system is header-only and doesn't need to be specified +find_package(Boost 1.70 REQUIRED COMPONENTS + filesystem thread regex program_options) + +if(NOT Boost_FOUND) + message(FATAL_ERROR "Boost not found. Please check BOOST_ROOT: ${BOOST_ROOT}") +endif() + +message(STATUS "Boost configuration:") +message(STATUS " Version: ${Boost_VERSION}") +message(STATUS " Libraries: ${Boost_LIBRARIES}") +message(STATUS " Include dirs: ${Boost_INCLUDE_DIRS}") + +# ============================================================================== +# THIRD-PARTY STATIC LIBRARIES CONFIGURATION +# ============================================================================== +# Create imported targets for all third-party libraries + +# gflags +add_library(gflags STATIC IMPORTED GLOBAL) +set_target_properties(gflags PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libgflags.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# glog - use custom built glog for consistency with brpc +add_library(glog STATIC IMPORTED GLOBAL) +set_target_properties(glog PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libglog.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) +target_compile_definitions(glog INTERFACE GLOG_USE_GLOG_EXPORT) + +# leveldb +add_library(leveldb STATIC IMPORTED GLOBAL) +set_target_properties(leveldb PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libleveldb.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# brpc - critical for StarRocks functionality +add_library(brpc STATIC IMPORTED GLOBAL) +set_target_properties(brpc PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libbrpc.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) +target_compile_definitions(brpc INTERFACE BRPC_WITH_GLOG=1) + +# rocksdb +add_library(rocksdb STATIC IMPORTED GLOBAL) +set_target_properties(rocksdb PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/librocksdb.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# velocypack +add_library(velocypack STATIC IMPORTED GLOBAL) +set_target_properties(velocypack PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libvelocypack.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# bitshuffle +add_library(bitshuffle STATIC IMPORTED GLOBAL) +set_target_properties(bitshuffle PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libbitshuffle.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# Homebrew libraries - jemalloc +find_library(JEMALLOC_LIB NAMES jemalloc PATHS /opt/homebrew/lib REQUIRED) +add_library(jemalloc STATIC IMPORTED GLOBAL) +set_target_properties(jemalloc PROPERTIES + IMPORTED_LOCATION ${JEMALLOC_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +# Homebrew libraries - snappy +find_library(SNAPPY_LIB NAMES snappy PATHS /opt/homebrew/lib REQUIRED) +add_library(snappy STATIC IMPORTED GLOBAL) +set_target_properties(snappy PROPERTIES + IMPORTED_LOCATION ${SNAPPY_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +# zlib (from homebrew) - use direct path +set(ZLIB_LIB "/opt/homebrew/Cellar/zlib/1.3.1/lib/libz.a") +if(NOT EXISTS ${ZLIB_LIB}) + message(FATAL_ERROR "zlib library not found at ${ZLIB_LIB}") +endif() +add_library(zlib STATIC IMPORTED GLOBAL) +set_target_properties(zlib PROPERTIES + IMPORTED_LOCATION ${ZLIB_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +# vectorscan (hyperscan replacement) from thirdparty +add_library(vectorscan STATIC IMPORTED GLOBAL) +set_target_properties(vectorscan PROPERTIES + IMPORTED_LOCATION ${THIRDPARTY_DIR}/installed/lib/libvectorscan.a + INTERFACE_INCLUDE_DIRECTORIES ${THIRDPARTY_DIR}/installed/include) + +# roaring bitmap from homebrew (dynamic library) +set(ROARING_LIB "/opt/homebrew/Cellar/croaring/4.3.12/lib/libroaring.dylib") +if(NOT EXISTS ${ROARING_LIB}) + message(FATAL_ERROR "roaring library not found at ${ROARING_LIB}") +endif() +add_library(roaring SHARED IMPORTED GLOBAL) +set_target_properties(roaring PROPERTIES + IMPORTED_LOCATION ${ROARING_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +# Apache Arrow and Parquet from Homebrew - required for file formats +set(APACHE_ARROW_HOME "/opt/homebrew/opt/apache-arrow") +if(EXISTS "${APACHE_ARROW_HOME}/lib/libarrow.dylib") + add_library(arrow SHARED IMPORTED GLOBAL) + set_target_properties(arrow PROPERTIES + IMPORTED_LOCATION "${APACHE_ARROW_HOME}/lib/libarrow.dylib" + INTERFACE_INCLUDE_DIRECTORIES "${APACHE_ARROW_HOME}/include") + + add_library(parquet SHARED IMPORTED GLOBAL) + set_target_properties(parquet PROPERTIES + IMPORTED_LOCATION "${APACHE_ARROW_HOME}/lib/libparquet.dylib" + INTERFACE_INCLUDE_DIRECTORIES "${APACHE_ARROW_HOME}/include") + + message(STATUS "Apache Arrow and Parquet found at: ${APACHE_ARROW_HOME}") +else() + message(FATAL_ERROR "Apache Arrow not found. Please install: brew install apache-arrow") +endif() + +# Thrift from Homebrew - required for Thrift protocols +set(THRIFT_HOME "/opt/homebrew/opt/thrift@0.20") +if(EXISTS "${THRIFT_HOME}/lib/libthrift.dylib") + add_library(thrift SHARED IMPORTED GLOBAL) + set_target_properties(thrift PROPERTIES + IMPORTED_LOCATION "${THRIFT_HOME}/lib/libthrift.dylib" + INTERFACE_INCLUDE_DIRECTORIES "${THRIFT_HOME}/include") + + message(STATUS "Thrift found at: ${THRIFT_HOME}") +else() + message(FATAL_ERROR "Thrift not found. Please install: brew install thrift@0.20") +endif() + +# OpenSSL from Homebrew +find_package(OpenSSL REQUIRED) +if(NOT OpenSSL_FOUND) + message(FATAL_ERROR "OpenSSL not found. Please install: brew install openssl@3") +endif() + +# cURL from Homebrew - use direct path to fix linking +set(CURL_LIBRARY "/opt/homebrew/Cellar/curl/8.16.0/lib/libcurl.dylib") +if(NOT EXISTS ${CURL_LIBRARY}) + set(CURL_LIBRARY "/opt/homebrew/lib/libcurl.dylib") # fallback to symlink +endif() + +if(NOT EXISTS ${CURL_LIBRARY}) + message(FATAL_ERROR "CURL library not found") +endif() + +# Create imported target for curl +add_library(CURL::libcurl SHARED IMPORTED GLOBAL) +set_target_properties(CURL::libcurl PROPERTIES + IMPORTED_LOCATION ${CURL_LIBRARY} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +message(STATUS "CURL found: ${CURL_LIBRARY}") + +# libevent from Homebrew - required for HTTP server functionality +find_library(LIBEVENT_LIB NAMES event PATHS /opt/homebrew/lib REQUIRED) +find_library(LIBEVENT_CORE_LIB NAMES event_core PATHS /opt/homebrew/lib REQUIRED) +find_library(LIBEVENT_EXTRA_LIB NAMES event_extra PATHS /opt/homebrew/lib REQUIRED) +if(NOT LIBEVENT_LIB OR NOT LIBEVENT_CORE_LIB OR NOT LIBEVENT_EXTRA_LIB) + message(FATAL_ERROR "libevent not found. Please install: brew install libevent") +endif() + +add_library(libevent STATIC IMPORTED GLOBAL) +set_target_properties(libevent PROPERTIES + IMPORTED_LOCATION ${LIBEVENT_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +add_library(libevent_core STATIC IMPORTED GLOBAL) +set_target_properties(libevent_core PROPERTIES + IMPORTED_LOCATION ${LIBEVENT_CORE_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +add_library(libevent_extra STATIC IMPORTED GLOBAL) +set_target_properties(libevent_extra PROPERTIES + IMPORTED_LOCATION ${LIBEVENT_EXTRA_LIB} + INTERFACE_INCLUDE_DIRECTORIES /opt/homebrew/include) + +message(STATUS "Third-party libraries configured successfully") + +# ============================================================================== +# COMPILER FLAGS AND BUILD OPTIONS +# ============================================================================== +set(CMAKE_SKIP_RPATH TRUE) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +# Base compiler flags for ARM64 +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -march=armv8-a") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -std=gnu++20") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -stdlib=libc++") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fPIC") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fno-omit-frame-pointer") +# Increase template recursion depth for complex constexpr calculations +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -ftemplate-depth=1024") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -fconstexpr-depth=1024") + +# Disable nontrivial-memcall warning for brpc compatibility on macOS +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-nontrivial-memcall") +# Disable deprecated warnings for macOS compatibility +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-literal-operator") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-builtins") +# Disable additional warnings for cleaner build output +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-inconsistent-missing-override") +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-vla-cxx-extension") +# Disable warnings about deprecated headers (ext/hash_map, ext/hash_set) +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-#warnings") +# Disable deprecated declarations warning (e.g., std::iterator deprecated in C++17) +set(CXX_COMMON_FLAGS "${CXX_COMMON_FLAGS} -Wno-deprecated-declarations") + +# macOS SDK and deployment target +set(CMAKE_OSX_DEPLOYMENT_TARGET "15.0") +set(CMAKE_OSX_ARCHITECTURES "arm64") + +# Build type specific flags +if(CMAKE_BUILD_TYPE STREQUAL "DEBUG") + set(CXX_FLAGS_DEBUG "-g -O0 -DDEBUG") + set(CMAKE_CXX_FLAGS_DEBUG "${CXX_FLAGS_DEBUG}") + set(CMAKE_C_FLAGS_DEBUG "-g -O0 -DDEBUG") +elseif(CMAKE_BUILD_TYPE STREQUAL "RELEASE") + set(CXX_FLAGS_RELEASE "-O3 -DNDEBUG -DBOOST_DISABLE_ASSERTS") + set(CMAKE_CXX_FLAGS_RELEASE "${CXX_FLAGS_RELEASE}") + set(CMAKE_C_FLAGS_RELEASE "-O3 -DNDEBUG") +elseif(CMAKE_BUILD_TYPE STREQUAL "ASAN") + set(CXX_FLAGS_ASAN "-g -O1 -fsanitize=address -fno-omit-frame-pointer -DDEBUG") + set(CMAKE_CXX_FLAGS_ASAN "${CXX_FLAGS_ASAN}") + set(CMAKE_C_FLAGS_ASAN "-g -O1 -fsanitize=address -fno-omit-frame-pointer -DDEBUG") +endif() + +# Apply common flags +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXX_COMMON_FLAGS}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CXX_COMMON_FLAGS}") + +# ============================================================================== +# LINK LIBRARIES CONFIGURATION +# ============================================================================== +# Base link libraries for macOS +set(STARROCKS_LINK_LIBS "") + +# Static-only library strategy for better compatibility +set(WL_START_GROUP "-Wl,-all_load") +set(WL_END_GROUP "") + +# Core libraries +list(APPEND STARROCKS_LINK_LIBS + ${WL_START_GROUP} + protobuf + brpc + glog + gflags + leveldb + rocksdb + velocypack + bitshuffle + jemalloc + snappy + zlib + vectorscan + roaring + arrow + parquet + thrift + libevent + libevent_core + libevent_extra + ${Boost_LIBRARIES} + ${OPENSSL_LIBRARIES} + ${CURL_LIBRARIES} + ${WL_END_GROUP} +) + +# System libraries for macOS +list(APPEND STARROCKS_LINK_LIBS + -lresolv + -lc + -lm + -ldl + c++ + c++abi + ${CMAKE_THREAD_LIBS_INIT} +) + +# AddressSanitizer support +if(USE_SANITIZER) + list(APPEND STARROCKS_LINK_LIBS -fsanitize=address) + message(STATUS "AddressSanitizer enabled") +endif() + +# ============================================================================== +# APPLE FRAMEWORKS REQUIRED BY BRPC +# ============================================================================== +find_library(COREGRAPHICS_FRAMEWORK CoreGraphics REQUIRED) +find_library(CORETEXT_FRAMEWORK CoreText REQUIRED) +find_library(FOUNDATION_FRAMEWORK Foundation REQUIRED) +find_library(SECURITY_FRAMEWORK Security REQUIRED) + +list(APPEND STARROCKS_LINK_LIBS + ${COREGRAPHICS_FRAMEWORK} + ${CORETEXT_FRAMEWORK} + ${FOUNDATION_FRAMEWORK} + ${SECURITY_FRAMEWORK} +) + +message(STATUS "Apple frameworks configured for brpc support") + +# ============================================================================== +# SOURCE FILES CONFIGURATION +# ============================================================================== +# Include all source directories +include_directories(${SRC_DIR}) +include_directories(${GENSRC_DIR}) +include_directories(${BASE_DIR}/build) +include_directories(${BASE_DIR}/../gensrc/build) +include_directories(${BASE_DIR}/../gensrc/build/gen_cpp) +include_directories(${THIRDPARTY_DIR}/installed/include) +include_directories(SYSTEM ${Boost_INCLUDE_DIRS}) + +# Add source subdirectories - following the same pattern as main CMakeLists.txt +# Note: We need to be selective about which subdirectories to include +set(STARROCKS_SOURCE_DIRS + ${SRC_DIR}/common + ${SRC_DIR}/exec + ${SRC_DIR}/exprs + ${SRC_DIR}/fs + ${SRC_DIR}/gen_cpp + ${SRC_DIR}/geo + ${SRC_DIR}/runtime + ${SRC_DIR}/service + ${SRC_DIR}/storage + ${SRC_DIR}/types + ${SRC_DIR}/util +) + +# Create a library for all StarRocks sources +file(GLOB_RECURSE STARROCKS_SOURCES + ${SRC_DIR}/common/*.cpp + ${SRC_DIR}/column/*.cpp + ${SRC_DIR}/exec/*.cpp + ${SRC_DIR}/exprs/*.cpp + ${SRC_DIR}/formats/*.cpp + ${SRC_DIR}/fs/*.cpp + ${SRC_DIR}/gen_cpp/*.cc + ${SRC_DIR}/geo/*.cpp + ${SRC_DIR}/http/*.cpp + ${SRC_DIR}/runtime/*.cpp + ${SRC_DIR}/service/*.cpp + ${SRC_DIR}/storage/*.cpp + ${SRC_DIR}/types/*.cpp + ${SRC_DIR}/util/*.cpp +) + +# Add generated protobuf files +file(GLOB_RECURSE PROTOBUF_SOURCES + ${BASE_DIR}/build/*.pb.cc + ${BASE_DIR}/../gensrc/build/*.pb.cc + ${BASE_DIR}/../gensrc/build/gen_cpp/*.pb.cc + ${GENSRC_DIR}/*.pb.cc +) + +# Combine all sources +list(APPEND STARROCKS_SOURCES ${PROTOBUF_SOURCES}) + +# Exclude problematic files for macOS - be more specific to avoid excluding core functionality +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*_test\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*_unittest\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*test_.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*benchmark.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*java_.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*python_.*\\.cpp$") + +# Completely exclude HDFS related files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/fs/hdfs/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*hdfs.*\\.cpp$") + +# Completely exclude S3 related files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/fs/s3/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*s3.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*aws.*\\.cpp$") + +# Completely exclude JIT related files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/jit/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*jit.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*jit_.*\\.cpp$") + +# Exclude ORC and Avro formats +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*avro.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*formats/orc/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*orc.*\\.cpp$") + +# Exclude other disabled components +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*iceberg.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/iceberg/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*iceberg_table.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*mysql_scanner.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*minidump.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*jdbc.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*azure.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*mysql_table_writer.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*jvm_metrics.*\\.cpp$") + +# Exclude Pulsar related files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*pulsar.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/data_consumer\\.cpp$") + +# Exclude problematic components +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/inverted_plugin_factory\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*clucene.*\\.cpp$") + +# Exclude geo components that need special parsing files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/geo/.*\\.cpp$") + +# Exclude spillable components - more comprehensive +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*spillable.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*spill.*operator.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*spill.*factory.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*spill_process.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/spill/.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*SpillableHashJoin.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*SpillableNLJoin.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*SpillablePartitionSort.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*SpillProcess.*\\.cpp$") + +# Exclude tracer/opentelemetry - more comprehensive +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*tracer.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*opentelemetry.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/common/tracer\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/src/common/tracer\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*src/common/tracer\\.cpp$") + +# Alternative approach: directly remove tracer.cpp if it exists +list(REMOVE_ITEM STARROCKS_SOURCES "${SRC_DIR}/common/tracer.cpp") + +# Debug: Print a message to verify the exclusions are working +message(STATUS "Checking if tracer.cpp is in STARROCKS_SOURCES...") +foreach(source_file ${STARROCKS_SOURCES}) + if(source_file MATCHES ".*tracer\\.cpp$") + message(STATUS "Found tracer file: ${source_file}") + list(REMOVE_ITEM STARROCKS_SOURCES "${source_file}") + message(STATUS "Removed tracer file: ${source_file}") + endif() +endforeach() + +# Exclude additional ORC dependent files +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*file_chunk_sink.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*orc_chunk_sink.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*connector.*orc.*\\.cpp$") + +# Exclude HTTP actions that depend on disabled components +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/http/action/jit_.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*/http/action/.*jit.*\\.cpp$") + +# Exclude Arrow Flight components +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*arrow_flight.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*flight.*\\.cpp$") + +# Exclude Kafka and Pulsar data consumers - more comprehensive +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*kafka.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*pulsar.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*data_consumer.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*data_consumer_pool.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*data_consumer_group.*\\.cpp$") + +# Exclude Iceberg table sink +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*iceberg.*sink.*\\.cpp$") +list(FILTER STARROCKS_SOURCES EXCLUDE REGEX ".*iceberg_table_sink.*\\.cpp$") + +# Create StarRocks core library +add_library(starrocks_core STATIC ${STARROCKS_SOURCES}) +target_link_libraries(starrocks_core ${STARROCKS_LINK_LIBS}) + +# ============================================================================== +# MAIN EXECUTABLE TARGET +# ============================================================================== +# Create the main StarRocks BE executable +add_executable(starrocks_be ${SRC_DIR}/service/starrocks_main.cpp) + +# Link against core library and all dependencies +target_link_libraries(starrocks_be + starrocks_core + build_version + ${STARROCKS_LINK_LIBS} +) + +# Set executable properties +set_target_properties(starrocks_be PROPERTIES + OUTPUT_NAME starrocks_be + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} +) + +# ============================================================================== +# BUILD OUTPUT CONFIGURATION +# ============================================================================== +# Output directories +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${OUTPUT_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${OUTPUT_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${OUTPUT_DIR}/lib) + +# ============================================================================== +# INSTALL CONFIGURATION +# ============================================================================== +# Install the main executable +install(TARGETS starrocks_be + RUNTIME DESTINATION ${OUTPUT_DIR}/lib + PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE +) + +# Create necessary runtime directories +install(DIRECTORY DESTINATION ${OUTPUT_DIR}/bin) +install(DIRECTORY DESTINATION ${OUTPUT_DIR}/conf) +install(DIRECTORY DESTINATION ${OUTPUT_DIR}/lib) + +# ============================================================================== +# BUILD SUMMARY +# ============================================================================== +message(STATUS "") +message(STATUS "========================================") +message(STATUS "StarRocks BE macOS Build Configuration") +message(STATUS "========================================") +message(STATUS "Platform: macOS ${CMAKE_SYSTEM_VERSION} (${CMAKE_SYSTEM_PROCESSOR})") +message(STATUS "Build Type: ${CMAKE_BUILD_TYPE}") +message(STATUS "Compiler: ${CMAKE_CXX_COMPILER}") +message(STATUS "") +message(STATUS "Paths:") +message(STATUS " Source: ${BASE_DIR}") +message(STATUS " Build: ${BUILD_DIR}") +message(STATUS " Third-party: ${THIRDPARTY_DIR}") +message(STATUS " Output: ${OUTPUT_DIR}") +message(STATUS "") +message(STATUS "Key Components:") +message(STATUS " HTTP Support: ${WITH_HTTP}") +message(STATUS " Protobuf: ${PROTOBUF_HOME}") +message(STATUS " Boost: ${Boost_VERSION}") +message(STATUS " AddressSanitizer: ${USE_SANITIZER}") +message(STATUS "") +message(STATUS "Disabled Components (for macOS compatibility):") +message(STATUS " Avro, ORC, HDFS, JDBC, Python, Java, LZO, S2") +message(STATUS " SSE/AVX instructions (ARM64)") +message(STATUS "") +message(STATUS "Build Targets:") +message(STATUS " starrocks_be - Main executable") +message(STATUS "") +message(STATUS "To build:") +message(STATUS " ninja starrocks_be") +message(STATUS " ninja install") +message(STATUS "========================================") +message(STATUS "") \ No newline at end of file