@@ -200,6 +200,7 @@ ExternalProject_Add(gflags
200200 -DGFLAGS_NAMESPACE=gflags
201201 -DBUILD_STATIC_LIBS=ON
202202 -DBUILD_SHARED_LIBS=OFF
203+ -DREGISTER_INSTALL_PREFIX=OFF
203204 BUILD_COMMAND
204205 make -j${CPU_CORE}
205206)
@@ -457,9 +458,9 @@ set(LZ4_INCLUDE_DIR ${INSTALL_INCLUDEDIR})
457458ExternalProject_Add(zlib
458459 DEPENDS
459460 URL
460- https://github.com/madler/zlib/releases/download/v1.2.13 /zlib-1.2.13 .tar.gz
461+ https://github.com/madler/zlib/releases/download/v1.3.1 /zlib-1.3.1 .tar.gz
461462 URL_HASH
462- MD5=9b8aa094c4e5765dabf4da391f00d15c
463+ MD5=9855b6d802d7fe5b7bd5b196a2271655
463464 DOWNLOAD_NO_PROGRESS
464465 1
465466 UPDATE_COMMAND
@@ -598,6 +599,146 @@ set(PROTOBUF_INCLUDE_DIR ${INSTALL_INCLUDEDIR})
598599set (PROTOBUF_LIBRARY ${INSTALL_LIBDIR} /${LIB_PROTOBUF} )
599600set (PROTOBUF_PROTOC ${STAGED_INSTALL_PREFIX} /bin/protoc)
600601
602+ ExternalProject_Add(leveldb
603+ DEPENDS
604+ snappy
605+ URL
606+ https://github.com/google/leveldb/archive/refs/tags/1.23.tar.gz
607+ URL_HASH
608+ MD5=afbde776fb8760312009963f09a586c7
609+ DOWNLOAD_NO_PROGRESS
610+ 1
611+ UPDATE_COMMAND
612+ ""
613+ LOG_CONFIGURE
614+ 1
615+ LOG_BUILD
616+ 1
617+ LOG_INSTALL
618+ 1
619+ CMAKE_ARGS
620+ -DCMAKE_POLICY_VERSION_MINIMUM=3.5
621+ -DCMAKE_INSTALL_PREFIX=${STAGED_INSTALL_PREFIX}
622+ -DCMAKE_BUILD_TYPE=${LIB_BUILD_TYPE}
623+ -DLEVELDB_BUILD_TESTS=OFF
624+ -DLEVELDB_BUILD_BENCHMARKS=OFF
625+ -DBUILD_SHARED_LIBS=OFF
626+ -DHAVE_SNAPPY=ON
627+ -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
628+ -DCMAKE_CXX_FLAGS=-I${INSTALL_INCLUDEDIR}
629+ -DCMAKE_EXE_LINKER_FLAGS=-L${INSTALL_LIBDIR}
630+ BUILD_ALWAYS
631+ 1
632+ BUILD_COMMAND
633+ make -j${CPU_CORE}
634+ )
635+
636+ if (${OS_VERSION} MATCHES "Rocky" OR ${OS_VERSION} MATCHES "CentOS" )
637+ set (LEVELDB_LIBRARY ${INSTALL_LIBDIR_64} /libleveldb.a)
638+ else ()
639+ set (LEVELDB_LIBRARY ${INSTALL_LIBDIR} /libleveldb.a)
640+ endif ()
641+ set (LEVELDB_INCLUDE_DIR ${INSTALL_INCLUDEDIR} )
642+
643+ ExternalProject_Add(brpc
644+ DEPENDS
645+ gflags
646+ protobuf
647+ leveldb
648+ glog
649+ snappy
650+ zlib
651+ URL
652+ https://github.com/apache/brpc/archive/refs/tags/1.6.0.tar.gz
653+ URL_HASH
654+ MD5=0d37cea25bd006e89806f461ef7e39ba
655+ DOWNLOAD_NO_PROGRESS
656+ 1
657+ UPDATE_COMMAND
658+ ""
659+ LOG_CONFIGURE
660+ 1
661+ LOG_BUILD
662+ 1
663+ LOG_INSTALL
664+ 1
665+ CMAKE_ARGS
666+ -DCMAKE_POLICY_VERSION_MINIMUM=3.5
667+ -DCMAKE_INSTALL_PREFIX=${STAGED_INSTALL_PREFIX}
668+ -DCMAKE_BUILD_TYPE=${LIB_BUILD_TYPE}
669+ -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
670+ -DWITH_GLOG=ON
671+ -DWITH_SNAPPY=ON
672+ -DBUILD_SHARED_LIBS=OFF
673+ -DDOWNLOAD_GTEST=OFF
674+ BUILD_ALWAYS
675+ 1
676+ BUILD_COMMAND
677+ make -j${CPU_CORE}
678+ )
679+
680+ if (${OS_VERSION} MATCHES "Rocky" OR ${OS_VERSION} MATCHES "CentOS" )
681+ set (BRPC_LIBRARY ${INSTALL_LIBDIR_64} /libbrpc.a)
682+ else ()
683+ set (BRPC_LIBRARY ${INSTALL_LIBDIR} /libbrpc.a)
684+ endif ()
685+ set (BRPC_INCLUDE_DIR ${INSTALL_INCLUDEDIR} )
686+
687+ ExternalProject_Add(braft
688+ DEPENDS
689+ gflags
690+ protobuf
691+ leveldb
692+ brpc
693+ glog
694+ snappy
695+ zlib
696+ URL
697+ https://github.com/baidu/braft/archive/refs/tags/v1.1.2.tar.gz
698+ URL_HASH
699+ MD5=f1d0307cf45449bbec9b64ca81b5f808
700+ DOWNLOAD_NO_PROGRESS
701+ 1
702+ UPDATE_COMMAND
703+ ""
704+ LOG_CONFIGURE
705+ 1
706+ LOG_BUILD
707+ 1
708+ LOG_INSTALL
709+ 1
710+ CMAKE_ARGS
711+ -DCMAKE_POLICY_VERSION_MINIMUM=3.5
712+ -DCMAKE_INSTALL_PREFIX=${STAGED_INSTALL_PREFIX}
713+ -DCMAKE_BUILD_TYPE=${LIB_BUILD_TYPE}
714+ -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
715+ -DWITH_GLOG=ON
716+ -DBUILD_SHARED_LIBS=OFF
717+ -DBUILD_UNIT_TESTS=OFF
718+ -DDOWNLOAD_GTEST=OFF
719+ BUILD_ALWAYS
720+ 1
721+ BUILD_COMMAND
722+ make -j${CPU_CORE} braft-static
723+ INSTALL_COMMAND
724+ ${CMAKE_COMMAND} -E copy_directory <BINARY_DIR>/output /include /braft ${INSTALL_INCLUDEDIR} /braft
725+ COMMAND ${CMAKE_COMMAND} -E copy <BINARY_DIR>/output /lib/libbraft.a ${INSTALL_LIBDIR} /libbraft.a
726+ )
727+
728+ # For CentOS/Rocky, also copy to lib64
729+ if (${OS_VERSION} MATCHES "Rocky" OR ${OS_VERSION} MATCHES "CentOS" )
730+ ExternalProject_Add_Step(braft copy_to_lib64
731+ COMMAND ${CMAKE_COMMAND} -E make_directory ${INSTALL_LIBDIR_64}
732+ COMMAND ${CMAKE_COMMAND} -E copy_if_different ${INSTALL_LIBDIR} /libbraft.a ${INSTALL_LIBDIR_64} /libbraft.a
733+ DEPENDEES install
734+ COMMENT "Copying braft to lib64 for CentOS/Rocky"
735+ )
736+ set (BRAFT_LIBRARY ${INSTALL_LIBDIR_64} /libbraft.a)
737+ else ()
738+ set (BRAFT_LIBRARY ${INSTALL_LIBDIR} /libbraft.a)
739+ endif ()
740+ set (BRAFT_INCLUDE_DIR ${INSTALL_INCLUDEDIR} )
741+
601742ExternalProject_Add(rocksdb
602743 DEPENDS
603744 gflags
@@ -750,8 +891,21 @@ endif()
750891set (ROCKSDB_INCLUDE_DIR ${INSTALL_INCLUDEDIR} )
751892set (ROCKSDB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR} /${EP_BASE_SUFFIX} /Source /rocksdb)
752893
894+ # Generate protobuf files before compiling praft (which depends on them)
895+ set (PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR} /src/pika_inner_message.proto ${CMAKE_CURRENT_SOURCE_DIR} /src/rsync_service.proto)
896+ custom_protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES} )
897+ message ("pika PROTO_SRCS = ${PROTO_SRCS} " )
898+ message ("pika PROTO_HDRS = ${PROTO_HDRS} " )
899+
900+ # Create a custom target for generated proto files
901+ add_custom_target (pika_proto_gen
902+ DEPENDS ${PROTO_SRCS} ${PROTO_HDRS}
903+ COMMENT "Generating Pika protobuf files"
904+ )
905+
753906add_subdirectory (src/pstd)
754907add_subdirectory (src/net)
908+ add_subdirectory (src/praft) # praft 必须在 storage 之前,因为 storage 需要 binlog.pb.h
755909add_subdirectory (src/storage)
756910add_subdirectory (src/cache )
757911if (USE_PIKA_TOOLS)
@@ -794,10 +948,7 @@ set(PIKA_BUILD_VERSION_CC ${CMAKE_BINARY_DIR}/pika_build_version.cc
794948message ("PIKA_BUILD_VERSION_CC : " ${PIKA_BUILD_VERSION_CC} )
795949configure_file (${CMAKE_CURRENT_SOURCE_DIR} /src/build_version.cc.in ${PIKA_BUILD_VERSION_CC} @ONLY)
796950
797- set (PROTO_FILES ${CMAKE_CURRENT_SOURCE_DIR} /src/pika_inner_message.proto ${CMAKE_CURRENT_SOURCE_DIR} /src/rsync_service.proto)
798- custom_protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES} )
799- message ("pika PROTO_SRCS = ${PROTO_SRCS} " )
800- message ("pika PROTO_HDRS = ${PROTO_HDRS} " )
951+ # PROTO_SRCS and PROTO_HDRS are already generated above
801952
802953add_executable (${PROJECT_NAME}
803954 ${DIR_SRCS}
@@ -821,6 +972,9 @@ add_dependencies(${PROJECT_NAME}
821972 zlib
822973 ${LIBGPERF_NAME}
823974 ${LIBJEMALLOC_NAME}
975+ leveldb
976+ brpc
977+ braft
824978 rocksdb
825979 protobuf
826980 pstd
@@ -839,10 +993,14 @@ target_include_directories(${PROJECT_NAME}
839993target_link_libraries (${PROJECT_NAME}
840994 cache
841995 storage
996+ praft
842997 net
843998 pstd
844999 ${GLOG_LIBRARY}
8451000 librocksdb.a
1001+ ${BRAFT_LIBRARY}
1002+ ${BRPC_LIBRARY}
1003+ ${LEVELDB_LIBRARY}
8461004 ${LIB_PROTOBUF}
8471005 ${LIB_GFLAGS}
8481006 ${LIB_FMT}
@@ -854,6 +1012,49 @@ target_link_libraries(${PROJECT_NAME}
8541012 ${LIBUNWIND_LIBRARY}
8551013 ${JEMALLOC_LIBRARY} )
8561014
1015+ # Add platform-specific libraries for brpc and braft
1016+ if (CMAKE_SYSTEM_NAME MATCHES "Darwin" )
1017+ # macOS frameworks
1018+ target_link_libraries (${PROJECT_NAME}
1019+ "-framework CoreFoundation"
1020+ "-framework CoreGraphics"
1021+ "-framework CoreData"
1022+ "-framework CoreText"
1023+ "-framework Security"
1024+ "-framework Foundation"
1025+ "-framework ApplicationServices"
1026+ "-framework SystemConfiguration"
1027+ "-framework AppKit"
1028+ "-Wl,-undefined,dynamic_lookup" # Allow undefined symbols (gperftools optional)
1029+ )
1030+ find_library (OPENSSL_CRYPTO_LIBRARY NAMES crypto libcrypto)
1031+ find_library (OPENSSL_SSL_LIBRARY NAMES ssl libssl)
1032+ if (OPENSSL_CRYPTO_LIBRARY)
1033+ target_link_libraries (${PROJECT_NAME} ${OPENSSL_CRYPTO_LIBRARY} )
1034+ endif ()
1035+ if (OPENSSL_SSL_LIBRARY)
1036+ target_link_libraries (${PROJECT_NAME} ${OPENSSL_SSL_LIBRARY} )
1037+ endif ()
1038+ elseif (CMAKE_SYSTEM_NAME MATCHES "Linux" )
1039+ # Linux system libraries for brpc and braft
1040+ target_link_libraries (${PROJECT_NAME}
1041+ rt # Real-time extensions
1042+ dl # Dynamic linking
1043+ )
1044+ # Find and link OpenSSL for Linux
1045+ find_package (OpenSSL)
1046+ if (OPENSSL_FOUND)
1047+ target_link_libraries (${PROJECT_NAME} OpenSSL::SSL OpenSSL::Crypto)
1048+ else ()
1049+ # Fallback: try to find libraries directly
1050+ find_library (OPENSSL_CRYPTO_LIBRARY NAMES crypto libcrypto)
1051+ find_library (OPENSSL_SSL_LIBRARY NAMES ssl libssl)
1052+ if (OPENSSL_CRYPTO_LIBRARY AND OPENSSL_SSL_LIBRARY)
1053+ target_link_libraries (${PROJECT_NAME} ${OPENSSL_SSL_LIBRARY} ${OPENSSL_CRYPTO_LIBRARY} )
1054+ endif ()
1055+ endif ()
1056+ endif ()
1057+
8571058option (USE_SSL "Enable SSL support" OFF )
8581059add_custom_target (
8591060 clang-tidy
0 commit comments