From eccd2f098ae0ba60c5aad1e2289909ef8f287b9f Mon Sep 17 00:00:00 2001 From: "xichou.wc" Date: Fri, 10 Oct 2025 16:07:57 +0800 Subject: [PATCH 1/2] use cmake for compile --- .gitignore | 24 ++++- .gitmodules | 3 + CMakeLists.txt | 113 ++++++++++++++++++++++ Makefile | 18 ---- README.md | 55 +++++++++-- bench/CMakeLists.txt | 3 + bench/Makefile | 15 --- bench/fio/CMakeLists.txt | 55 +++++++++++ bench/fio/Makefile | 45 --------- bench/mdtest/CMakeLists.txt | 34 +++++++ bench/mdtest/Makefile | 23 ----- compile.sh | 93 ++++++++++++++++++ core/CMakeLists.txt | 170 +++++++++++++++++++++++++++++++++ core/Makefile | 43 --------- fuse/CMakeLists.txt | 46 +++++++++ fuse/Makefile | 25 ----- scripts/build_fio.sh | 39 ++++++++ scripts/build_spdk.sh | 74 ++++++++++++++ spdk.patch | 32 ++++++- test/CMakeLists.txt | 34 +++++++ test/Makefile | 17 ---- test/bytebuffer/CMakeLists.txt | 33 +++++++ test/bytebuffer/Makefile | 36 ------- test/ckpt/CMakeLists.txt | 33 +++++++ test/ckpt/Makefile | 28 ------ test/fs/CMakeLists.txt | 46 +++++++++ test/fs/Makefile | 28 ------ test/journal/CMakeLists.txt | 33 +++++++ test/journal/Makefile | 31 ------ third_party/spdk | 1 + tools/CMakeLists.txt | 34 +++++++ tools/Makefile | 22 ----- verify_cmake.sh | 65 +++++++++++++ 33 files changed, 1007 insertions(+), 344 deletions(-) create mode 100644 .gitmodules create mode 100644 CMakeLists.txt delete mode 100644 Makefile create mode 100644 bench/CMakeLists.txt delete mode 100644 bench/Makefile create mode 100644 bench/fio/CMakeLists.txt delete mode 100644 bench/fio/Makefile create mode 100644 bench/mdtest/CMakeLists.txt delete mode 100644 bench/mdtest/Makefile create mode 100644 compile.sh create mode 100644 core/CMakeLists.txt delete mode 100644 core/Makefile create mode 100644 fuse/CMakeLists.txt delete mode 100644 fuse/Makefile create mode 100755 scripts/build_fio.sh create mode 100755 scripts/build_spdk.sh create mode 100644 test/CMakeLists.txt delete mode 100644 test/Makefile create mode 100644 test/bytebuffer/CMakeLists.txt delete mode 100644 test/bytebuffer/Makefile create mode 100644 test/ckpt/CMakeLists.txt delete mode 100644 test/ckpt/Makefile create mode 100644 test/fs/CMakeLists.txt delete mode 100644 test/fs/Makefile create mode 100644 test/journal/CMakeLists.txt delete mode 100644 test/journal/Makefile create mode 160000 third_party/spdk create mode 100644 tools/CMakeLists.txt delete mode 100644 tools/Makefile create mode 100644 verify_cmake.sh diff --git a/.gitignore b/.gitignore index 8d34657..b495194 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,26 @@ +# IDE files .project .cproject .settings -build/ \ No newline at end of file + +# Build directories +build/ +cmake-build-*/ +CMakeCache.txt +CMakeFiles/ +Makefile +cmake_install.cmake +deps/ + +# Compiled binaries and libraries +bin/ +lib/ + +# IDE files +.vscode/ +.idea/ +*.swp +*.swo + +# Backup files +*~ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..31ca052 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "third_party/spdk"] + path = third_party/spdk + url = https://github.com/spdk/spdk.git diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..8b3da75 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,113 @@ +cmake_minimum_required(VERSION 3.16) +project(FastFS VERSION 1.0 LANGUAGES CXX C) + +# 设置 C++ 标准 +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +# 查找 Threads 库 +find_package(Threads REQUIRED) + +# 设置输出目录 +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) + +# 脚本目录 +set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/scripts) + +# SPDK 作为 submodule 的路径 (现在在 third_party/spdk) +set(SPDK_SUBMODULE_DIR ${CMAKE_SOURCE_DIR}/third_party/spdk) +set(SPDK_BUILD_DIR ${SPDK_SUBMODULE_DIR}/build) + +# deps 目录用于临时依赖 +set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps) + +# 编译选项 +option(ENABLE_FIO_PLUGIN "Enable FIO plugin support" ON) +set(FIO_VERSION "fio-3.39" CACHE STRING "FIO version to download") +option(ENABLE_FUSE "Enable FUSE support" ON) +option(ENABLE_TESTS "Enable unit tests" ON) +option(BUILD_SPDK "Automatically build SPDK submodule" ON) +option(BUILD_FIO "Automatically build FIO when plugin enabled" ON) + +# 设置编译选项 +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2") + +# 检查 SPDK submodule 是否存在 +if(NOT EXISTS ${SPDK_SUBMODULE_DIR}/mk/spdk.common.mk) + message(FATAL_ERROR "SPDK submodule not found at ${SPDK_SUBMODULE_DIR}. Please run: git submodule update --init") +endif() + +# SPDK 自动编译逻辑 +if(BUILD_SPDK) + # 创建 SPDK 编译命令 + set(SPDK_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_spdk.sh ${SPDK_SUBMODULE_DIR} ${CMAKE_SOURCE_DIR}/spdk.patch) + + # 添加自定义目标来编译 SPDK + add_custom_target(build_spdk + COMMAND ${SPDK_BUILD_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Building SPDK submodule" + ) + + # 确保 SPDK 在使用前已编译 + set(SPDK_DEPENDENCY build_spdk) +else() + set(SPDK_DEPENDENCY "") +endif() + +# FIO 下载和构建逻辑(仅在启用 FIO 插件时) +if(ENABLE_FIO_PLUGIN) + include(FetchContent) + + # 下载 FIO 到 deps 目录 + FetchContent_Declare( + fio + URL https://github.com/axboe/fio/archive/refs/tags/${FIO_VERSION}.tar.gz + DOWNLOAD_DIR ${DEPS_DIR} + SOURCE_DIR ${DEPS_DIR}/${FIO_VERSION} + ) + + FetchContent_MakeAvailable(fio) + + # 设置 FIO 源码路径 + set(FIO_SRC_DIR ${DEPS_DIR}/${FIO_VERSION}) + set(FIO_BUILD_DIR ${FIO_SRC_DIR}) + + # FIO 自动编译逻辑 + if(BUILD_FIO) + set(FIO_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_fio.sh ${FIO_SRC_DIR}) + + add_custom_target(build_fio + COMMAND ${FIO_BUILD_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Building FIO" + ) + + set(FIO_DEPENDENCY build_fio) + else() + set(FIO_DEPENDENCY "") + endif() +endif() + +# 添加子目录 +add_subdirectory(core) +add_subdirectory(tools) +add_subdirectory(fuse) +add_subdirectory(test) +add_subdirectory(bench) + +# 安装规则 +install(DIRECTORY ${CMAKE_SOURCE_DIR}/bench/ DESTINATION share/fastfs/bench + FILES_MATCHING PATTERN "*.json") + +message(STATUS "FastFS configuration:") +message(STATUS " SPDK_SUBMODULE_DIR: ${SPDK_SUBMODULE_DIR}") +message(STATUS " DEPS_DIR: ${DEPS_DIR}") +message(STATUS " BUILD_SPDK: ${BUILD_SPDK}") +message(STATUS " ENABLE_FIO_PLUGIN: ${ENABLE_FIO_PLUGIN}") +message(STATUS " BUILD_FIO: ${BUILD_FIO}") +message(STATUS " ENABLE_FUSE: ${ENABLE_FUSE}") +message(STATUS " ENABLE_TESTS: ${ENABLE_TESTS}") \ No newline at end of file diff --git a/Makefile b/Makefile deleted file mode 100644 index e8b6862..0000000 --- a/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk - -DIRS-y += core -DIRS-y += tools -DIRS-y += bench -DIRS-y += fuse -DIRS-y += test - -.PHONY: all clean $(DIRS-y) - -all: $(DIRS-y) -clean: $(DIRS-y) - -include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk diff --git a/README.md b/README.md index cdd6256..b9b10f5 100644 --- a/README.md +++ b/README.md @@ -1,35 +1,72 @@ +## Here's my code: ### Compilation and Build -The compilation depends on SPDK, DPDK, and FIO, with the versions spdk-25.05, dpdk-22.11, and fio-3.39 used respectively. +The compilation depends on SPDK (as git submodule in third_party/spdk), DPDK, and optionally FIO for plugin support, with the versions spdk-25.05, dpdk-22.11, and fio-3.39 used respectively. The spdk.patch must be applied during SPDK compilation, and C++17 compiler support is required. Assuming all projects are located in /chenxu14/workspace - export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/chenxu14/workspace/spdk/build/lib:/chenxu14/workspace/spdk/dpdk/build/lib - make +#### Initialize SPDK Submodule +First, initialize the SPDK submodule: +```bash +git submodule update --init +``` + +#### Using CMake (Recommended) +```bash +# Basic build (automatically compiles SPDK and builds without FIO plugin) +./compile.sh + +# Build with FIO plugin support (automatically downloads and compiles FIO) +./compile.sh --enable-fio-plugin + +# Build without automatically compiling SPDK (assuming SPDK is already built) +./compile.sh --disable-spdk-build + +# Build with custom FIO version +./compile.sh --enable-fio-plugin --fio-version fio-3.39 + +# Manual CMake configuration +mkdir build && cd build +cmake .. -DENABLE_FIO_PLUGIN=ON -DBUILD_SPDK=ON -DBUILD_FIO=ON +make -j$(nproc) +``` + +#### Environment Setup +```bash +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/third_party/spdk/build/lib:$(pwd)/third_party/spdk/dpdk/build/lib +``` ### Benchmark MDTEST Bench - ./bench/mdtest/fs_bench -c /chenxu14/workspace/FastFS/bench/bdev.json -b Malloc0 + ./build/bin/fs_bench -c /path/to/FastFS/bench/bdev.json -b Malloc0 FIO Bench - fio /chenxu14/workspace/FastFS/bench/fio/fastfs.fio + fio /path/to/FastFS/bench/fio/fastfs.fio ### Maintenance Tools Format the filesystem - ./tools/fastfs_tools -c /chenxu14/workspace/FastFS/bench/bdev_aio.json -b aio0 -f + ./build/bin/fastfs_tools -c /path/to/FastFS/bench/bdev_aio.json -b aio0 -f Dump metadata - ./tools/fastfs_tools -c /chenxu14/workspace/FastFS/bench/bdev_aio.json -b aio0 -D + ./build/bin/fastfs_tools -c /path/to/FastFS/bench/bdev_aio.json -b aio0 -D Checkpoint operation - ./tools/fastfs_tools -c /chenxu14/workspace/FastFS/bench/bdev_aio.json -b aio0 -C + ./build/bin/fastfs_tools -c /path/to/FastFS/bench/bdev_aio.json -b aio0 -C Mount FUSE - ./fuse/fastfs_fuse -c /chenxu14/workspace/FastFS/bench/bdev_aio.json -b aio0 -m /mnt/fastfs + ./build/bin/fastfs_fuse -c /path/to/FastFS/bench/bdev_aio.json -b aio0 -m /mnt/fastfs + +### CMake Build Options +- `-DBUILD_SPDK=ON/OFF`: Automatically build SPDK submodule (default: ON) +- `-DENABLE_FIO_PLUGIN=ON/OFF`: Enable FIO plugin support (default: OFF) +- `-DBUILD_FIO=ON/OFF`: Automatically build FIO when plugin enabled (default: ON) +- `-DFIO_VERSION=version`: FIO version to download (default: fio-3.39) +- `-DENABLE_FUSE=ON/OFF`: Enable FUSE support (default: ON) +- `-DENABLE_TESTS=ON/OFF`: Enable unit tests (default: ON) \ No newline at end of file diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt new file mode 100644 index 0000000..76bbaf3 --- /dev/null +++ b/bench/CMakeLists.txt @@ -0,0 +1,3 @@ +# Add benchmark subdirectories +add_subdirectory(fio) +add_subdirectory(mdtest) \ No newline at end of file diff --git a/bench/Makefile b/bench/Makefile deleted file mode 100644 index b2c7a69..0000000 --- a/bench/Makefile +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk - -DIRS-y += fio -DIRS-y += mdtest - -.PHONY: all clean $(DIRS-y) - -all: $(DIRS-y) -clean: $(DIRS-y) - -include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk diff --git a/bench/fio/CMakeLists.txt b/bench/fio/CMakeLists.txt new file mode 100644 index 0000000..8a3b614 --- /dev/null +++ b/bench/fio/CMakeLists.txt @@ -0,0 +1,55 @@ +# FIO plugin support is optional +if(ENABLE_FIO_PLUGIN) + set(TARGET_NAME fastfs_fio) + + # 源文件 + set(SOURCES ${TARGET_NAME}.cpp) + + # 创建共享库 (FIO plugin) + add_library(${TARGET_NAME} SHARED ${SOURCES}) + + # 包含目录 + target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${FIO_SRC_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ) + + # 链接 fastfs 库 + target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads + ) + + # 添加依赖 + if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) + endif() + if(DEFINED FIO_DEPENDENCY AND FIO_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${FIO_DEPENDENCY}) + endif() + + # 设置编译选项 + target_compile_options(${TARGET_NAME} PRIVATE + -fpermissive + -O3 + -rdynamic + ) + + # 设置 RPATH + set_target_properties(${TARGET_NAME} PROPERTIES + PREFIX "" + SUFFIX ".so" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + ) + + # 安装规则 + install(TARGETS ${TARGET_NAME} DESTINATION lib/fio) +endif() \ No newline at end of file diff --git a/bench/fio/Makefile b/bench/fio/Makefile deleted file mode 100644 index 10ab88b..0000000 --- a/bench/fio/Makefile +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk -CXXFLAGS += -std=c++17 -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -FIO_SRC_DIR := /chenxu14/workspace/fio-3.39 -PLUGIN_NAME = fastfs_fio -SO_NAME = ${PLUGIN_NAME}.so -CXXFLAGS += -I${FIO_SRC_DIR} -include config-host.h -CXXFLAGS += -fpermissive -O3 -shared -rdynamic - -CXX_SRCS := ${PLUGIN_NAME}.cpp -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_vars.mk -LIBS += $(SPDK_LIB_LINKER_ARGS) - -all : $(SO_NAME) - @: - -install: empty_rule - -uninstall: empty_rule - -# To avoid overwriting warning -empty_rule: - @: - -$(SO_NAME) : $(OBJS) $(SPDK_LIB_FILES) $(ENV_LIBS) - $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) $(ENV_LDFLAGS) $(SYS_LIBS) - -clean : - rm -rf ${OBJS} ${SO_NAME} - -include $(SPDK_ROOT_DIR)/mk/spdk.deps.mk diff --git a/bench/mdtest/CMakeLists.txt b/bench/mdtest/CMakeLists.txt new file mode 100644 index 0000000..584e4f8 --- /dev/null +++ b/bench/mdtest/CMakeLists.txt @@ -0,0 +1,34 @@ +set(TARGET_NAME fs_bench) + +# 源文件 +set(SOURCES fs_bench.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include +) + +# 链接 fastfs 库和 SPDK 静态库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) + +# 安装规则 +install(TARGETS ${TARGET_NAME} DESTINATION bin) \ No newline at end of file diff --git a/bench/mdtest/Makefile b/bench/mdtest/Makefile deleted file mode 100644 index 7517317..0000000 --- a/bench/mdtest/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk -CXXFLAGS += -std=c++17 - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -APP = fs_bench - -CXX_SRCS := fs_bench.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000..75bb271 --- /dev/null +++ b/compile.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# FastFS CMake 编译脚本 + +set -e + +# 默认配置 +ENABLE_FIO_PLUGIN=0 +BUILD_SPDK=1 +BUILD_FIO=1 +FIO_VERSION="fio-3.39" + +# 解析命令行参数 +while [[ $# -gt 0 ]]; do + case $1 in + --enable-fio-plugin) + ENABLE_FIO_PLUGIN=1 + shift + ;; + --disable-spdk-build) + BUILD_SPDK=0 + shift + ;; + --disable-fio-build) + BUILD_FIO=0 + shift + ;; + --fio-version) + FIO_VERSION="$2" + shift 2 + ;; + --disable-fuse) + DISABLE_FUSE=1 + shift + ;; + --disable-tests) + DISABLE_TESTS=1 + shift + ;; + *) + echo "Unknown option: $1" + exit 1 + ;; + esac +done + +# 检查 SPDK submodule (现在在 third_party/spdk) +if [ ! -d "third_party/spdk" ] || [ ! -f "third_party/spdk/mk/spdk.common.mk" ]; then + echo "Error: SPDK submodule not found. Please run:" + echo " git submodule update --init" + exit 1 +fi + +# 创建构建目录 +BUILD_DIR="build" +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" + +# 构建 CMake 配置命令 +CMAKE_CMD="cmake .." + +if [[ $ENABLE_FIO_PLUGIN -eq 1 ]]; then + CMAKE_CMD+=" -DENABLE_FIO_PLUGIN=ON" + CMAKE_CMD+=" -DFIO_VERSION=$FIO_VERSION" +fi + +if [[ $BUILD_SPDK -eq 0 ]]; then + CMAKE_CMD+=" -DBUILD_SPDK=OFF" +fi + +if [[ $BUILD_FIO -eq 0 ]]; then + CMAKE_CMD+=" -DBUILD_FIO=OFF" +fi + +if [[ -n "$DISABLE_FUSE" ]]; then + CMAKE_CMD+=" -DENABLE_FUSE=OFF" +fi + +if [[ -n "$DISABLE_TESTS" ]]; then + CMAKE_CMD+=" -DENABLE_TESTS=OFF" +fi + +# 运行 CMake 配置 +echo "Running CMake configuration..." +eval "$CMAKE_CMD" + +# 编译项目 +echo "Building FastFS..." +make -j16 + +echo "Build completed successfully!" +echo "Binaries are located in: $BUILD_DIR/bin" +echo "Libraries are located in: $BUILD_DIR/lib" \ No newline at end of file diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt new file mode 100644 index 0000000..f617862 --- /dev/null +++ b/core/CMakeLists.txt @@ -0,0 +1,170 @@ +set(TARGET_NAME fastfs) + +# 源文件 +file(GLOB SOURCES "*.cpp") +file(GLOB HEADERS "*.h") + +# 创建共享库 +add_library(${TARGET_NAME} SHARED ${SOURCES} ${HEADERS}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PUBLIC + $ + $ + PRIVATE + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include +) + +# 自动发现所有 SPDK 静态库(按依赖顺序) +file(GLOB SPDK_LIBS "${SPDK_SUBMODULE_DIR}/build/lib/libspdk_*.a") + +# 关键的 SPDK 库顺序(基于 Makefile 中的 SPDK_LIB_LIST) +# 这些库必须按照依赖顺序链接 +set(SPDK_CORE_LIBS + # Event 子系统(最上层) + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_accel.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_vmd.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_sock.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_iobuf.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_keyring.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + + # 所有 bdev 模块 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_malloc.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_null.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_nvme.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_passthru.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_lvol.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_raid.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_error.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_gpt.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_split.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_delay.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_zone_block.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_aio.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_ftl.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_virtio.a + + # Blob 和 LVol + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_blob_bdev.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_lvol.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_blob.a + + # FTL + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_ftl.a + + # VMD 和 NVMe + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_vmd.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_nvme.a + + # Virtio + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_virtio.a + + # VFIO User + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_vfio_user.a + + # Accel 子系统 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel_error.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel_ioat.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_ioat.a + + # Sock 子系统 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_sock_posix.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_sock.a + + # Keyring 子系统 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring_file.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring_linux.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring.a + + # 核心 BDEV 层 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev.a + + # Notify + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_notify.a + + # 基础库 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_init.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_thread.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_trace.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_rpc.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_jsonrpc.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_json.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_util.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_log.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_dma.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_conf.a + + # 环境抽象层 + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_env_dpdk.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_env_dpdk_rpc.a +) + +# 过滤出实际存在的库 +set(SPDK_LIBS_FILTERED) +foreach(lib ${SPDK_CORE_LIBS}) + if(EXISTS ${lib}) + list(APPEND SPDK_LIBS_FILTERED ${lib}) + endif() +endforeach() + +# 自动发现所有 DPDK 静态库 +file(GLOB DPDK_LIBS "${SPDK_SUBMODULE_DIR}/dpdk/build/lib/librte_*.a") + +# 链接库(使用 --whole-archive 确保所有符号都被包含) +target_link_libraries(${TARGET_NAME} + PRIVATE + # 使用 --whole-archive 包含所有 SPDK 库 + -Wl,--whole-archive + ${SPDK_LIBS_FILTERED} + -Wl,--no-whole-archive + + # DPDK 库 + ${DPDK_LIBS} + + # ISA-L 库(SPDK 内置,提供压缩、加密、CRC 等功能) + ${SPDK_SUBMODULE_DIR}/isa-l/.libs/libisal.a + ${SPDK_SUBMODULE_DIR}/isa-l-crypto/.libs/libisal_crypto.a + + # SPDK 依赖的外部库 + ssl + crypto + uuid + fuse3 + lz4 + keyutils + + # 系统库 + Threads::Threads + dl + pthread + numa + rt + m + aio +) + +# 添加 SPDK 依赖(如果启用自动编译) +if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) +endif() + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) + +# 安装规则 +install(TARGETS ${TARGET_NAME} + LIBRARY DESTINATION lib + ARCHIVE DESTINATION lib + RUNTIME DESTINATION bin +) + +install(FILES ${HEADERS} DESTINATION include/fastfs) \ No newline at end of file diff --git a/core/Makefile b/core/Makefile deleted file mode 100644 index e22d0ea..0000000 --- a/core/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk - -#XXHASH_DIR := /chenxu14/workspace/xxHash -#SYS_LIBS += -L$(XXHASH_DIR) -lxxhash -#LDFLAGS += -Wl,-rpath=$(XXHASH_DIR) -#CXXFLAGS += -I$(XXHASH_DIR) -CXXFLAGS += -I$(SPDK_ROOT_DIR)/dpdk/build/include - -SO_NAME = libfastfs.so -CXXFLAGS += -shared -std=c++17 -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -CXX_SRCS = $(wildcard *.cpp) -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_vars.mk -LIBS += $(SPDK_LIB_LINKER_ARGS) - -all : $(SO_NAME) - @: - -install: empty_rule - -uninstall: empty_rule - -# To avoid overwriting warning -empty_rule: - @: - -$(SO_NAME) : $(OBJS) $(SPDK_LIB_FILES) $(ENV_LIBS) - $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) $(ENV_LDFLAGS) $(SYS_LIBS) - -clean : - rm -rf ${OBJS} ${SO_NAME} - -include $(SPDK_ROOT_DIR)/mk/spdk.deps.mk - diff --git a/fuse/CMakeLists.txt b/fuse/CMakeLists.txt new file mode 100644 index 0000000..27b7f51 --- /dev/null +++ b/fuse/CMakeLists.txt @@ -0,0 +1,46 @@ +# FUSE support is optional +if(ENABLE_FUSE) + set(TARGET_NAME fastfs_fuse) + + # 查找 FUSE3 + find_package(PkgConfig REQUIRED) + pkg_check_modules(FUSE3 REQUIRED fuse3) + + # 源文件 + set(SOURCES fastfs_fuse.cpp) + + # 创建可执行文件 + add_executable(${TARGET_NAME} ${SOURCES}) + + # 包含目录 + target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${FUSE3_INCLUDE_DIRS} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ) + + # 链接库 + target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${FUSE3_LIBRARIES} + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads + ) + + # 设置编译选项 + target_compile_options(${TARGET_NAME} PRIVATE ${FUSE3_CFLAGS_OTHER}) + + # 设置 RPATH + set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + ) + + # 安装规则 + install(TARGETS ${TARGET_NAME} DESTINATION bin) +endif() \ No newline at end of file diff --git a/fuse/Makefile b/fuse/Makefile deleted file mode 100644 index b38761e..0000000 --- a/fuse/Makefile +++ /dev/null @@ -1,25 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk -CXXFLAGS += -std=c++17 - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -SYS_LIBS += -lfuse3 - -APP = fastfs_fuse - -CXX_SRCS := fastfs_fuse.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/scripts/build_fio.sh b/scripts/build_fio.sh new file mode 100755 index 0000000..bb49710 --- /dev/null +++ b/scripts/build_fio.sh @@ -0,0 +1,39 @@ +#!/bin/bash + +# FIO 编译脚本 +# 用于在启用 FIO 插件时编译 FIO + +set -e + +FIO_DIR="${1}" +BUILD_DIR="${2:-build}" + +echo "=== 编译 FIO ===" +echo "FIO 目录: $FIO_DIR" +echo "构建目录: $BUILD_DIR" + +if [ ! -d "$FIO_DIR" ]; then + echo "错误: FIO 目录 $FIO_DIR 不存在" + exit 1 +fi + +# 检查是否已经编译完成 +if [ -f "$FIO_DIR/fio" ]; then + echo "检测到 FIO 已经编译完成,跳过编译步骤" + exit 0 +fi + +cd "$FIO_DIR" + +# 配置 FIO +echo "配置 FIO..." +./configure + +# 编译 FIO +echo "编译 FIO..." +make -j16 + +# 返回项目根目录 +cd .. + +echo "=== FIO 编译完成 ===" \ No newline at end of file diff --git a/scripts/build_spdk.sh b/scripts/build_spdk.sh new file mode 100755 index 0000000..2b56b4a --- /dev/null +++ b/scripts/build_spdk.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# SPDK 编译脚本 +# 用于在 CMake 配置中自动编译 SPDK submodule + +set -e + +SPDK_DIR="${1:-third_party/spdk}" +PATCH_FILE="${2:-spdk.patch}" +BUILD_DIR="${3:-build}" + +echo "=== 编译 SPDK ===" +echo "SPDK 目录: $SPDK_DIR" +echo "补丁文件: $PATCH_FILE" +echo "构建目录: $BUILD_DIR" + +# 检查 SPDK 目录 +if [ ! -d "$SPDK_DIR" ]; then + echo "错误: SPDK 目录 $SPDK_DIR 不存在" + echo "请先运行: git submodule update --init" + exit 1 +fi + +# 检查是否已经编译完成 +if [ -f "$SPDK_DIR/build/lib/libspdk_event.a" ] && [ -f "$SPDK_DIR/dpdk/build/lib/librte_eal.a" ]; then + echo "检测到 SPDK 已经编译完成,跳过编译步骤" + exit 0 +fi + +# 应用补丁(如果存在) +if [ -f "$PATCH_FILE" ]; then + echo "应用补丁: $PATCH_FILE" + cd "$SPDK_DIR" + + # 检查补丁是否已经应用 + if git apply --check "../../$PATCH_FILE" 2>/dev/null; then + # 补丁可以应用,说明尚未应用 + echo "检测到补丁尚未应用,正在应用..." + if git apply "../../$PATCH_FILE"; then + echo "补丁应用成功" + else + echo "错误: 补丁应用失败" + exit 1 + fi + else + # 检查是否已经应用了补丁(通过检查关键文件内容) + if grep -q "struct spdk_bit_pool {" include/spdk/bit_pool.h 2>/dev/null; then + echo "检测到补丁已应用,跳过补丁应用步骤" + else + echo "警告: 补丁无法应用且未检测到已应用状态" + echo "可能的原因: SPDK 版本不兼容或文件已被修改" + echo "尝试继续编译..." + fi + fi + cd .. +else + echo "警告: 补丁文件 $PATCH_FILE 不存在,跳过补丁应用" +fi + +# 配置 SPDK +cd "$SPDK_DIR" +git submodule update --init +./scripts/pkgdep.sh +echo "配置 SPDK..." +./configure --disable-tests --disable-unit-tests --disable-apps --disable-examples + +# 编译 SPDK +echo "编译 SPDK..." +make -j16 + +# 返回项目根目录 +cd .. + +echo "=== SPDK 编译完成 ===" \ No newline at end of file diff --git a/spdk.patch b/spdk.patch index bb6398e..08aecde 100644 --- a/spdk.patch +++ b/spdk.patch @@ -1,5 +1,5 @@ diff --git a/include/spdk/bit_pool.h b/include/spdk/bit_pool.h -index 1a038a5..369b907 100644 +index 316c66aaa..e34034f90 100644 --- a/include/spdk/bit_pool.h +++ b/include/spdk/bit_pool.h @@ -16,8 +16,12 @@ @@ -16,11 +16,24 @@ index 1a038a5..369b907 100644 /** * Return the number of bits that a bit pool is currently sized to hold. +diff --git a/lib/nvme/nvme_cuse.c b/lib/nvme/nvme_cuse.c +index ea7e8d3e9..2abd61eaa 100644 +--- a/lib/nvme/nvme_cuse.c ++++ b/lib/nvme/nvme_cuse.c +@@ -1241,7 +1241,7 @@ nvme_cuse_start(struct spdk_nvme_ctrlr *ctrlr) + * fuse_log.h, so this is the easiest way to check for it + * without adding a separate CONFIG flag. + */ +- fuse_set_log_func(nvme_fuse_log_func); ++ //fuse_set_log_func(nvme_fuse_log_func); + #endif + } + diff --git a/lib/util/bit_array.c b/lib/util/bit_array.c -index ec18249..21029fc 100644 +index ff51705b3..021db1b73 100644 --- a/lib/util/bit_array.c +++ b/lib/util/bit_array.c -@@ -335,12 +335,6 @@ +@@ -335,12 +335,6 @@ spdk_bit_array_clear_mask(struct spdk_bit_array *ba) } } @@ -33,3 +46,16 @@ index ec18249..21029fc 100644 struct spdk_bit_pool * spdk_bit_pool_create(uint32_t num_bits) { +diff --git a/scripts/pkgdep/rhel.sh b/scripts/pkgdep/rhel.sh +index 55b9b183a..bcd029224 100755 +--- a/scripts/pkgdep/rhel.sh ++++ b/scripts/pkgdep/rhel.sh +@@ -122,7 +122,7 @@ if [ "$(uname -m)" = "aarch64" ]; then + fi + fi + +-if echo "$ID $VERSION_ID" | grep -E -q 'centos 8|rhel 8|rocky 8'; then ++if echo "$ID $VERSION_ID" | grep -E -q 'centos 8|rhel 8|rocky 8 |alinux 3'; then + yum install -y python36 python36-devel + #Create hard link to use in SPDK as python + if [[ ! -e /usr/bin/python && -e /etc/alternatives/python3 ]]; then diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 0000000..61adb7c --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,34 @@ +# Test support is optional +if(ENABLE_TESTS) + # 首先尝试使用 pkg-config 查找 CUnit + find_package(PkgConfig QUIET) + if(PKG_CONFIG_FOUND) + pkg_check_modules(CUNIT QUIET cunit) + endif() + + # 如果 pkg-config 找不到,尝试手动查找 + if(NOT CUNIT_FOUND) + find_path(CUNIT_INCLUDE_DIR CUnit/CUnit.h) + find_library(CUNIT_LIBRARY NAMES cunit) + + if(CUNIT_INCLUDE_DIR AND CUNIT_LIBRARY) + set(CUNIT_FOUND TRUE) + set(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR}) + set(CUNIT_LIBRARIES ${CUNIT_LIBRARY}) + endif() + endif() + + # 检查 CUnit 是否最终找到 + if(NOT CUNIT_FOUND) + message(FATAL_ERROR "CUnit not found. Please install CUnit development package.") + endif() + + # 添加 CUnit 包含目录 + include_directories(${CUNIT_INCLUDE_DIRS}) + + # 添加子目录 + add_subdirectory(bytebuffer) + add_subdirectory(ckpt) + add_subdirectory(fs) + add_subdirectory(journal) +endif() \ No newline at end of file diff --git a/test/Makefile b/test/Makefile deleted file mode 100644 index 4bf0fd8..0000000 --- a/test/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk - -DIRS-y += bytebuffer -DIRS-y += ckpt -DIRS-y += fs -DIRS-y += journal - -.PHONY: all clean $(DIRS-y) - -all: $(DIRS-y) -clean: $(DIRS-y) - -include $(SPDK_ROOT_DIR)/mk/spdk.subdirs.mk diff --git a/test/bytebuffer/CMakeLists.txt b/test/bytebuffer/CMakeLists.txt new file mode 100644 index 0000000..29b1544 --- /dev/null +++ b/test/bytebuffer/CMakeLists.txt @@ -0,0 +1,33 @@ +set(TARGET_NAME bytebuffer_ut) + +# 源文件 +set(SOURCES bytebuffer_ut.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_SUBMODULE_DIR}/test +) + +# 链接 fastfs 库和 SPDK 静态库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) \ No newline at end of file diff --git a/test/bytebuffer/Makefile b/test/bytebuffer/Makefile deleted file mode 100644 index 64aad58..0000000 --- a/test/bytebuffer/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk - -SYS_LIBS += -lcunit -LDFLAGS += -Wl,--gc-sections -CXXFLAGS += -std=c++17 -CXXFLAGS += -I$(FASTFS_ROOT_DIR) -CXXFLAGS += -ffunction-sections - -APP = bytebuffer_ut - -CXX_SRCS := bytebuffer_ut.cpp - -CLEAN_FILES = $(APP) - -all : $(APP) - @: - -install: empty_rule - -uninstall: empty_rule - -# To avoid overwriting warning -empty_rule: - @: - -$(APP) : $(OBJS) - $(Q)+echo " LINK $(notdir $@)"; \ - $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) $(OBJS) $(SYS_LIBS) - -clean : - $(CLEAN_C) $(CLEAN_FILES) diff --git a/test/ckpt/CMakeLists.txt b/test/ckpt/CMakeLists.txt new file mode 100644 index 0000000..edf7b4e --- /dev/null +++ b/test/ckpt/CMakeLists.txt @@ -0,0 +1,33 @@ +set(TARGET_NAME checkpoint_ut) + +# 源文件 +set(SOURCES checkpoint_ut.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_SUBMODULE_DIR}/test +) + +# 链接 fastfs 库和 SPDK 静态库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) \ No newline at end of file diff --git a/test/ckpt/Makefile b/test/ckpt/Makefile deleted file mode 100644 index 8b403ee..0000000 --- a/test/ckpt/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.app_vars.mk -CXXFLAGS += -std=c++17 -CXXFLAGS += -I$(SPDK_ROOT_DIR)/dpdk/build/include - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -SYS_LIBS += -lcunit -LDFLAGS += -Wl,--gc-sections -CXXFLAGS += -ffunction-sections -CXXFLAGS += -DSPDK_UNIT_TEST=1 - -APP = checkpoint_ut -CXX_SRCS := checkpoint_ut.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/test/fs/CMakeLists.txt b/test/fs/CMakeLists.txt new file mode 100644 index 0000000..1c6e2c0 --- /dev/null +++ b/test/fs/CMakeLists.txt @@ -0,0 +1,46 @@ +set(TARGET_NAME fastfs_ut) + +# 源文件 +set(SOURCES fastfs_ut.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_SUBMODULE_DIR}/test + ${CUNIT_INCLUDE_DIRS} +) + +# 链接库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${CUNIT_LIBRARIES} + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置编译选项 +target_compile_options(${TARGET_NAME} PRIVATE + ${CUNIT_CFLAGS_OTHER} + -ffunction-sections + -DSPDK_UNIT_TEST=1 +) + +# 设置链接选项 +target_link_options(${TARGET_NAME} PRIVATE + -Wl,--gc-sections +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) \ No newline at end of file diff --git a/test/fs/Makefile b/test/fs/Makefile deleted file mode 100644 index 6857e0b..0000000 --- a/test/fs/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.app_vars.mk -CXXFLAGS += -std=c++17 -CXXFLAGS += -I$(SPDK_ROOT_DIR)/dpdk/build/include - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -SYS_LIBS += -lcunit -LDFLAGS += -Wl,--gc-sections -CXXFLAGS += -ffunction-sections -CXXFLAGS += -DSPDK_UNIT_TEST=1 - -APP = fastfs_ut -CXX_SRCS := fastfs_ut.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/test/journal/CMakeLists.txt b/test/journal/CMakeLists.txt new file mode 100644 index 0000000..3b1e569 --- /dev/null +++ b/test/journal/CMakeLists.txt @@ -0,0 +1,33 @@ +set(TARGET_NAME journal_ut) + +# 源文件 +set(SOURCES journal_ut.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_SUBMODULE_DIR}/test +) + +# 链接 fastfs 库和 SPDK 静态库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) \ No newline at end of file diff --git a/test/journal/Makefile b/test/journal/Makefile deleted file mode 100644 index d4b3ffd..0000000 --- a/test/journal/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.app_vars.mk -# reference to memory_ut.c -# include $(SPDK_ROOT_DIR)/mk/spdk.mock.unittest.mk -CXXFLAGS += -std=c++17 -CXXFLAGS += -I$(SPDK_ROOT_DIR)/dpdk/build/include - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/../..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - - -SYS_LIBS += -lcunit -LDFLAGS += -Wl,--gc-sections -CXXFLAGS += -ffunction-sections -CXXFLAGS += -DSPDK_UNIT_TEST=1 - -APP = journal_ut -CXX_SRCS := journal_ut.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/third_party/spdk b/third_party/spdk new file mode 160000 index 0000000..a2f2a0b --- /dev/null +++ b/third_party/spdk @@ -0,0 +1 @@ +Subproject commit a2f2a0b2794366fe1e42b97061782aae25119457 diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt new file mode 100644 index 0000000..97a1cd9 --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +1,34 @@ +set(TARGET_NAME fastfs_tools) + +# 源文件 +set(SOURCES fastfs_tools.cpp) + +# 创建可执行文件 +add_executable(${TARGET_NAME} ${SOURCES}) + +# 包含目录 +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${SPDK_SUBMODULE_DIR}/include + ${SPDK_SUBMODULE_DIR}/build/include + ${SPDK_SUBMODULE_DIR}/dpdk/build/include +) + +# 链接 fastfs 库和 SPDK 静态库 +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +# 设置 RPATH +set_target_properties(${TARGET_NAME} PROPERTIES + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" +) + +# 安装规则 +install(TARGETS ${TARGET_NAME} DESTINATION bin) \ No newline at end of file diff --git a/tools/Makefile b/tools/Makefile deleted file mode 100644 index b3ac6b8..0000000 --- a/tools/Makefile +++ /dev/null @@ -1,22 +0,0 @@ -# Copyright (C) 2025 chenxu14 -# SPDX-License-Identifier: BSD-3-Clause - -SPDK_ROOT_DIR := /chenxu14/workspace/spdk -LDFLAGS = -Wl,-rpath=$(SPDK_ROOT_DIR)/dpdk/build/lib -LDFLAGS += -Wl,-rpath=$(SPDK_ROOT_DIR)/build/lib - -include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -include $(SPDK_ROOT_DIR)/mk/spdk.modules.mk -CXXFLAGS += -std=c++17 - -FASTFS_ROOT_DIR := $(abspath $(CURDIR)/..) -SYS_LIBS += -L$(FASTFS_ROOT_DIR)/core -lfastfs -LDFLAGS += -Wl,-rpath=$(FASTFS_ROOT_DIR)/core -CXXFLAGS += -I$(FASTFS_ROOT_DIR) - -APP = fastfs_tools -CXX_SRCS := fastfs_tools.cpp - -SPDK_LIB_LIST = $(ALL_MODULES_LIST) event event_bdev - -include $(SPDK_ROOT_DIR)/mk/spdk.app_cxx.mk diff --git a/verify_cmake.sh b/verify_cmake.sh new file mode 100644 index 0000000..b5f8d35 --- /dev/null +++ b/verify_cmake.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# 验证 FastFS CMake 配置脚本 (支持 submodule) + +set -e + +echo "=== 验证 FastFS CMake 配置 (submodule 版本) ===" + +# 检查必要的文件是否存在 +if [ ! -f "CMakeLists.txt" ]; then + echo "错误: CMakeLists.txt 不存在" + exit 1 +fi + +if [ ! -d "core" ]; then + echo "错误: core 目录不存在" + exit 1 +fi + +if [ ! -f "core/CMakeLists.txt" ]; then + echo "错误: core/CMakeLists.txt 不存在" + exit 1 +fi + +echo "✓ 基本文件结构验证通过" + +# 检查 SPDK submodule (现在在 third_party/spdk) +if [ ! -d "third_party/spdk" ]; then + echo "⚠ SPDK submodule 目录不存在 (需要运行: git submodule update --init)" +else + if [ ! -f "third_party/spdk/mk/spdk.common.mk" ]; then + echo "⚠ SPDK submodule 未正确初始化" + else + echo "✓ SPDK submodule 验证通过" + fi +fi + +# 创建构建目录并测试 CMake 配置 +BUILD_DIR="cmake_verify_build" +mkdir -p "$BUILD_DIR" +cd "$BUILD_DIR" + +echo "正在运行 CMake 配置测试 (不启用 FIO 插件)..." + +# 测试基本配置(不启用 FIO 插件) +cmake .. 2>/dev/null || true + +if [ -f "Makefile" ]; then + echo "✓ CMake 基本配置成功生成 Makefile" +else + echo "⚠ CMake 基本配置可能失败,但这是预期的(缺少实际依赖)" +fi + +# 清理 +cd .. +rm -rf "$BUILD_DIR" + +echo "=== 验证完成 ===" +echo "" +echo "使用方法:" +echo "1. 初始化 SPDK submodule: git submodule update --init" +echo "2. 应用 spdk.patch 到 SPDK" +echo "3. 编译 SPDK" +echo "4. 运行 ./compile.sh 进行编译" +echo "5. 或者启用 FIO 插件: ./compile.sh --enable-fio-plugin" \ No newline at end of file From 063e36cc3df1feeb922a1c87d728342bdee664e5 Mon Sep 17 00:00:00 2001 From: "xichou.wc" Date: Tue, 21 Oct 2025 08:43:42 +0800 Subject: [PATCH 2/2] use cmake for compile only english --- CMakeLists.txt | 106 ++++++++++++---------- bench/CMakeLists.txt | 7 +- bench/fio/CMakeLists.txt | 98 +++++++++----------- bench/mdtest/CMakeLists.txt | 20 ++--- compile.sh | 28 +++--- core/CMakeLists.txt | 159 ++++++++++++++------------------- fuse/CMakeLists.txt | 22 ++--- scripts/build_fio.sh | 29 +++--- scripts/build_spdk.sh | 68 +++++++------- test/CMakeLists.txt | 55 +++++------- test/bytebuffer/CMakeLists.txt | 21 ++--- test/ckpt/CMakeLists.txt | 21 ++--- test/fs/CMakeLists.txt | 23 ++--- test/journal/CMakeLists.txt | 21 ++--- tools/CMakeLists.txt | 20 ++--- 15 files changed, 312 insertions(+), 386 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8b3da75..8bcc731 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,82 +1,83 @@ cmake_minimum_required(VERSION 3.16) project(FastFS VERSION 1.0 LANGUAGES CXX C) -# 设置 C++ 标准 set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) -# 查找 Threads 库 find_package(Threads REQUIRED) -# 设置输出目录 -set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib64) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib64) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) -# 脚本目录 set(SCRIPTS_DIR ${CMAKE_SOURCE_DIR}/scripts) -# SPDK 作为 submodule 的路径 (现在在 third_party/spdk) -set(SPDK_SUBMODULE_DIR ${CMAKE_SOURCE_DIR}/third_party/spdk) -set(SPDK_BUILD_DIR ${SPDK_SUBMODULE_DIR}/build) +# SPDK configuration +if(NOT DEFINED SPDK_ROOT_DIR) + set(SPDK_ROOT_DIR ${CMAKE_SOURCE_DIR}/third_party/spdk) + set(SPDK_AUTO_DOWNLOAD ON) +else() + set(SPDK_AUTO_DOWNLOAD OFF) +endif() +set(SPDK_BUILD_DIR ${SPDK_ROOT_DIR}/build) -# deps 目录用于临时依赖 set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps) -# 编译选项 -option(ENABLE_FIO_PLUGIN "Enable FIO plugin support" ON) +option(ENABLE_FIO "Enable FIO support" ON) set(FIO_VERSION "fio-3.39" CACHE STRING "FIO version to download") option(ENABLE_FUSE "Enable FUSE support" ON) option(ENABLE_TESTS "Enable unit tests" ON) option(BUILD_SPDK "Automatically build SPDK submodule" ON) -option(BUILD_FIO "Automatically build FIO when plugin enabled" ON) +option(BUILD_FIO "Automatically build FIO when enabled" ON) -# 设置编译选项 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2") -# 检查 SPDK submodule 是否存在 -if(NOT EXISTS ${SPDK_SUBMODULE_DIR}/mk/spdk.common.mk) - message(FATAL_ERROR "SPDK submodule not found at ${SPDK_SUBMODULE_DIR}. Please run: git submodule update --init") +# SPDK setup and build logic +if(SPDK_AUTO_DOWNLOAD) + if(NOT EXISTS ${SPDK_ROOT_DIR}/mk/spdk.common.mk) + message(FATAL_ERROR "SPDK submodule not found at ${SPDK_ROOT_DIR}. Please run: git submodule update --init") + endif() endif() -# SPDK 自动编译逻辑 if(BUILD_SPDK) - # 创建 SPDK 编译命令 - set(SPDK_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_spdk.sh ${SPDK_SUBMODULE_DIR} ${CMAKE_SOURCE_DIR}/spdk.patch) + set(SPDK_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_spdk.sh ${SPDK_ROOT_DIR} ${CMAKE_SOURCE_DIR}/spdk.patch) - # 添加自定义目标来编译 SPDK add_custom_target(build_spdk COMMAND ${SPDK_BUILD_COMMAND} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} - COMMENT "Building SPDK submodule" + COMMENT "Building SPDK" ) - # 确保 SPDK 在使用前已编译 set(SPDK_DEPENDENCY build_spdk) else() set(SPDK_DEPENDENCY "") endif() -# FIO 下载和构建逻辑(仅在启用 FIO 插件时) -if(ENABLE_FIO_PLUGIN) - include(FetchContent) - - # 下载 FIO 到 deps 目录 - FetchContent_Declare( - fio - URL https://github.com/axboe/fio/archive/refs/tags/${FIO_VERSION}.tar.gz - DOWNLOAD_DIR ${DEPS_DIR} - SOURCE_DIR ${DEPS_DIR}/${FIO_VERSION} - ) - - FetchContent_MakeAvailable(fio) +# FIO configuration and build logic +if(ENABLE_FIO) + if(NOT DEFINED FIO_ROOT_DIR) + include(FetchContent) + + FetchContent_Declare( + fio + URL https://github.com/axboe/fio/archive/refs/tags/${FIO_VERSION}.tar.gz + URL_HASH SHA256=e2f4ff137061b44ceb83a55eb9ca8856fe188db6d9b00cb59f8629c9162afe0a + DOWNLOAD_DIR ${DEPS_DIR} + SOURCE_DIR ${DEPS_DIR}/${FIO_VERSION} + ) + + FetchContent_MakeAvailable(fio) + + set(FIO_ROOT_DIR ${DEPS_DIR}/${FIO_VERSION}) + set(FIO_AUTO_DOWNLOAD ON) + else() + set(FIO_AUTO_DOWNLOAD OFF) + endif() - # 设置 FIO 源码路径 - set(FIO_SRC_DIR ${DEPS_DIR}/${FIO_VERSION}) - set(FIO_BUILD_DIR ${FIO_SRC_DIR}) + set(FIO_SRC_DIR ${FIO_ROOT_DIR}) + set(FIO_BUILD_DIR ${FIO_ROOT_DIR}) - # FIO 自动编译逻辑 if(BUILD_FIO) set(FIO_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_fio.sh ${FIO_SRC_DIR}) @@ -92,22 +93,35 @@ if(ENABLE_FIO_PLUGIN) endif() endif() -# 添加子目录 +# Core library (always built) add_subdirectory(core) add_subdirectory(tools) -add_subdirectory(fuse) -add_subdirectory(test) + +# Optional components with centralized condition checks +if(ENABLE_FUSE) + add_subdirectory(fuse) +endif() + +if(ENABLE_TESTS) + add_subdirectory(test) +endif() + +# Bench directory (contains both general benchmarks and FIO plugin) add_subdirectory(bench) -# 安装规则 install(DIRECTORY ${CMAKE_SOURCE_DIR}/bench/ DESTINATION share/fastfs/bench FILES_MATCHING PATTERN "*.json") message(STATUS "FastFS configuration:") -message(STATUS " SPDK_SUBMODULE_DIR: ${SPDK_SUBMODULE_DIR}") +message(STATUS " SPDK_ROOT_DIR: ${SPDK_ROOT_DIR}") +message(STATUS " SPDK_AUTO_DOWNLOAD: ${SPDK_AUTO_DOWNLOAD}") message(STATUS " DEPS_DIR: ${DEPS_DIR}") message(STATUS " BUILD_SPDK: ${BUILD_SPDK}") -message(STATUS " ENABLE_FIO_PLUGIN: ${ENABLE_FIO_PLUGIN}") +message(STATUS " ENABLE_FIO: ${ENABLE_FIO}") +if(ENABLE_FIO) + message(STATUS " FIO_ROOT_DIR: ${FIO_ROOT_DIR}") + message(STATUS " FIO_AUTO_DOWNLOAD: ${FIO_AUTO_DOWNLOAD}") +endif() message(STATUS " BUILD_FIO: ${BUILD_FIO}") message(STATUS " ENABLE_FUSE: ${ENABLE_FUSE}") message(STATUS " ENABLE_TESTS: ${ENABLE_TESTS}") \ No newline at end of file diff --git a/bench/CMakeLists.txt b/bench/CMakeLists.txt index 76bbaf3..7343f8b 100644 --- a/bench/CMakeLists.txt +++ b/bench/CMakeLists.txt @@ -1,3 +1,6 @@ # Add benchmark subdirectories -add_subdirectory(fio) -add_subdirectory(mdtest) \ No newline at end of file +add_subdirectory(mdtest) + +if(ENABLE_FIO) + add_subdirectory(fio) +endif() \ No newline at end of file diff --git a/bench/fio/CMakeLists.txt b/bench/fio/CMakeLists.txt index 8a3b614..6ab67b5 100644 --- a/bench/fio/CMakeLists.txt +++ b/bench/fio/CMakeLists.txt @@ -1,55 +1,45 @@ # FIO plugin support is optional -if(ENABLE_FIO_PLUGIN) - set(TARGET_NAME fastfs_fio) - - # 源文件 - set(SOURCES ${TARGET_NAME}.cpp) - - # 创建共享库 (FIO plugin) - add_library(${TARGET_NAME} SHARED ${SOURCES}) - - # 包含目录 - target_include_directories(${TARGET_NAME} - PRIVATE - ${CMAKE_SOURCE_DIR} - ${FIO_SRC_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include - ) - - # 链接 fastfs 库 - target_link_libraries(${TARGET_NAME} - PRIVATE - fastfs - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a - Threads::Threads - ) - - # 添加依赖 - if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) - add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) - endif() - if(DEFINED FIO_DEPENDENCY AND FIO_DEPENDENCY) - add_dependencies(${TARGET_NAME} ${FIO_DEPENDENCY}) - endif() - - # 设置编译选项 - target_compile_options(${TARGET_NAME} PRIVATE - -fpermissive - -O3 - -rdynamic - ) - - # 设置 RPATH - set_target_properties(${TARGET_NAME} PROPERTIES - PREFIX "" - SUFFIX ".so" - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - ) - - # 安装规则 - install(TARGETS ${TARGET_NAME} DESTINATION lib/fio) -endif() \ No newline at end of file +set(TARGET_NAME fastfs_fio) + +set(SOURCES ${TARGET_NAME}.cpp) + +add_library(${TARGET_NAME} SHARED ${SOURCES}) + +target_include_directories(${TARGET_NAME} + PRIVATE + ${CMAKE_SOURCE_DIR} + ${FIO_ROOT_DIR} + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include +) + +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) +endif() +if(DEFINED FIO_DEPENDENCY AND FIO_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${FIO_DEPENDENCY}) +endif() + +target_compile_options(${TARGET_NAME} PRIVATE + -fpermissive + -O3 + -rdynamic +) + +set_target_properties(${TARGET_NAME} PROPERTIES + PREFIX "" + SUFFIX ".so" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" +) + +install(TARGETS ${TARGET_NAME} DESTINATION lib64/fio) \ No newline at end of file diff --git a/bench/mdtest/CMakeLists.txt b/bench/mdtest/CMakeLists.txt index 584e4f8..6d7aa4a 100644 --- a/bench/mdtest/CMakeLists.txt +++ b/bench/mdtest/CMakeLists.txt @@ -1,34 +1,28 @@ set(TARGET_NAME fs_bench) -# 源文件 set(SOURCES fs_bench.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include ) -# 链接 fastfs 库和 SPDK 静态库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) -# 安装规则 install(TARGETS ${TARGET_NAME} DESTINATION bin) \ No newline at end of file diff --git a/compile.sh b/compile.sh index 75bb271..6c4d1bc 100644 --- a/compile.sh +++ b/compile.sh @@ -1,20 +1,20 @@ #!/bin/bash -# FastFS CMake 编译脚本 +# FastFS CMake build script set -e -# 默认配置 +# Default configuration ENABLE_FIO_PLUGIN=0 BUILD_SPDK=1 BUILD_FIO=1 FIO_VERSION="fio-3.39" -# 解析命令行参数 +# Parse command line arguments while [[ $# -gt 0 ]]; do case $1 in - --enable-fio-plugin) - ENABLE_FIO_PLUGIN=1 + --enable-fio) + ENABLE_FIO=1 shift ;; --disable-spdk-build) @@ -44,23 +44,23 @@ while [[ $# -gt 0 ]]; do esac done -# 检查 SPDK submodule (现在在 third_party/spdk) +# Check SPDK submodule (now in third_party/spdk) if [ ! -d "third_party/spdk" ] || [ ! -f "third_party/spdk/mk/spdk.common.mk" ]; then echo "Error: SPDK submodule not found. Please run:" echo " git submodule update --init" exit 1 fi -# 创建构建目录 +# Create build directory BUILD_DIR="build" mkdir -p "$BUILD_DIR" cd "$BUILD_DIR" -# 构建 CMake 配置命令 +# Build CMake configuration command CMAKE_CMD="cmake .." -if [[ $ENABLE_FIO_PLUGIN -eq 1 ]]; then - CMAKE_CMD+=" -DENABLE_FIO_PLUGIN=ON" +if [[ $ENABLE_FIO -eq 1 ]]; then + CMAKE_CMD+=" -DENABLE_FIO=ON" CMAKE_CMD+=" -DFIO_VERSION=$FIO_VERSION" fi @@ -80,14 +80,14 @@ if [[ -n "$DISABLE_TESTS" ]]; then CMAKE_CMD+=" -DENABLE_TESTS=OFF" fi -# 运行 CMake 配置 +# Run CMake configuration echo "Running CMake configuration..." eval "$CMAKE_CMD" -# 编译项目 +# Build project echo "Building FastFS..." -make -j16 +make -j2 echo "Build completed successfully!" echo "Binaries are located in: $BUILD_DIR/bin" -echo "Libraries are located in: $BUILD_DIR/lib" \ No newline at end of file +echo "Libraries are located in: $BUILD_DIR/lib64" \ No newline at end of file diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index f617862..6dcd291 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -1,111 +1,92 @@ set(TARGET_NAME fastfs) -# 源文件 file(GLOB SOURCES "*.cpp") file(GLOB HEADERS "*.h") -# 创建共享库 add_library(${TARGET_NAME} SHARED ${SOURCES} ${HEADERS}) -# 包含目录 target_include_directories(${TARGET_NAME} PUBLIC $ $ PRIVATE - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include ) -# 自动发现所有 SPDK 静态库(按依赖顺序) -file(GLOB SPDK_LIBS "${SPDK_SUBMODULE_DIR}/build/lib/libspdk_*.a") +file(GLOB SPDK_LIBS "${SPDK_ROOT_DIR}/build/lib/libspdk_*.a") -# 关键的 SPDK 库顺序(基于 Makefile 中的 SPDK_LIB_LIST) -# 这些库必须按照依赖顺序链接 + +# Use manual library list for better control and compatibility set(SPDK_CORE_LIBS - # Event 子系统(最上层) - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_accel.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_vmd.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_sock.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_iobuf.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_keyring.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_accel.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_vmd.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_sock.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_iobuf.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_keyring.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a - # 所有 bdev 模块 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_malloc.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_null.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_nvme.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_passthru.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_lvol.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_raid.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_error.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_gpt.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_split.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_delay.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_zone_block.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_aio.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_ftl.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev_virtio.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_malloc.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_null.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_nvme.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_passthru.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_lvol.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_raid.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_error.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_gpt.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_split.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_delay.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_zone_block.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_aio.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_ftl.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev_virtio.a - # Blob 和 LVol - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_blob_bdev.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_lvol.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_blob.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_blob_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_lvol.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_blob.a - # FTL - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_ftl.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_ftl.a - # VMD 和 NVMe - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_vmd.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_nvme.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_vmd.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_nvme.a - # Virtio - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_virtio.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_virtio.a - # VFIO User - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_vfio_user.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_vfio_user.a - # Accel 子系统 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel_error.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel_ioat.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_accel.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_ioat.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_accel_error.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_accel_ioat.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_accel.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_ioat.a - # Sock 子系统 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_sock_posix.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_sock.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_sock_posix.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_sock.a - # Keyring 子系统 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring_file.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring_linux.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_keyring.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_keyring_file.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_keyring_linux.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_keyring.a - # 核心 BDEV 层 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev.a - # Notify - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_notify.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_notify.a - # 基础库 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_init.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_thread.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_trace.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_rpc.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_jsonrpc.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_json.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_util.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_log.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_dma.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_conf.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_init.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_thread.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_trace.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_rpc.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_jsonrpc.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_json.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_util.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_log.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_dma.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_conf.a - # 环境抽象层 - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_env_dpdk.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_env_dpdk_rpc.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_env_dpdk.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_env_dpdk_rpc.a ) -# 过滤出实际存在的库 set(SPDK_LIBS_FILTERED) foreach(lib ${SPDK_CORE_LIBS}) if(EXISTS ${lib}) @@ -113,25 +94,19 @@ foreach(lib ${SPDK_CORE_LIBS}) endif() endforeach() -# 自动发现所有 DPDK 静态库 -file(GLOB DPDK_LIBS "${SPDK_SUBMODULE_DIR}/dpdk/build/lib/librte_*.a") +file(GLOB DPDK_LIBS "${SPDK_ROOT_DIR}/dpdk/build/lib/librte_*.a") -# 链接库(使用 --whole-archive 确保所有符号都被包含) target_link_libraries(${TARGET_NAME} PRIVATE - # 使用 --whole-archive 包含所有 SPDK 库 -Wl,--whole-archive ${SPDK_LIBS_FILTERED} -Wl,--no-whole-archive - # DPDK 库 ${DPDK_LIBS} - # ISA-L 库(SPDK 内置,提供压缩、加密、CRC 等功能) - ${SPDK_SUBMODULE_DIR}/isa-l/.libs/libisal.a - ${SPDK_SUBMODULE_DIR}/isa-l-crypto/.libs/libisal_crypto.a + ${SPDK_ROOT_DIR}/isa-l/.libs/libisal.a + ${SPDK_ROOT_DIR}/isa-l-crypto/.libs/libisal_crypto.a - # SPDK 依赖的外部库 ssl crypto uuid @@ -139,7 +114,6 @@ target_link_libraries(${TARGET_NAME} lz4 keyutils - # 系统库 Threads::Threads dl pthread @@ -149,21 +123,18 @@ target_link_libraries(${TARGET_NAME} aio ) -# 添加 SPDK 依赖(如果启用自动编译) if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) endif() -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) -# 安装规则 install(TARGETS ${TARGET_NAME} - LIBRARY DESTINATION lib - ARCHIVE DESTINATION lib + LIBRARY DESTINATION lib64 + ARCHIVE DESTINATION lib64 RUNTIME DESTINATION bin ) diff --git a/fuse/CMakeLists.txt b/fuse/CMakeLists.txt index 27b7f51..43d5edf 100644 --- a/fuse/CMakeLists.txt +++ b/fuse/CMakeLists.txt @@ -2,45 +2,37 @@ if(ENABLE_FUSE) set(TARGET_NAME fastfs_fuse) - # 查找 FUSE3 find_package(PkgConfig REQUIRED) pkg_check_modules(FUSE3 REQUIRED fuse3) - # 源文件 set(SOURCES fastfs_fuse.cpp) - # 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) - # 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} ${FUSE3_INCLUDE_DIRS} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include ) - # 链接库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs ${FUSE3_LIBRARIES} - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) - # 设置编译选项 target_compile_options(${TARGET_NAME} PRIVATE ${FUSE3_CFLAGS_OTHER}) - # 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) - # 安装规则 install(TARGETS ${TARGET_NAME} DESTINATION bin) endif() \ No newline at end of file diff --git a/scripts/build_fio.sh b/scripts/build_fio.sh index bb49710..e16ce4a 100755 --- a/scripts/build_fio.sh +++ b/scripts/build_fio.sh @@ -1,39 +1,36 @@ #!/bin/bash -# FIO 编译脚本 -# 用于在启用 FIO 插件时编译 FIO - set -e FIO_DIR="${1}" BUILD_DIR="${2:-build}" -echo "=== 编译 FIO ===" -echo "FIO 目录: $FIO_DIR" -echo "构建目录: $BUILD_DIR" +echo "=== compile FIO ===" +echo "FIO dir: $FIO_DIR" +echo "build dir: $BUILD_DIR" if [ ! -d "$FIO_DIR" ]; then - echo "错误: FIO 目录 $FIO_DIR 不存在" + echo "Error: FIO directory $FIO_DIR does not exist" exit 1 fi -# 检查是否已经编译完成 +# Check if FIO is already compiled if [ -f "$FIO_DIR/fio" ]; then - echo "检测到 FIO 已经编译完成,跳过编译步骤" + echo "Detected that FIO is already compiled, skipping compilation step" exit 0 fi cd "$FIO_DIR" -# 配置 FIO -echo "配置 FIO..." +# Configure FIO +echo "Configuring FIO..." ./configure -# 编译 FIO -echo "编译 FIO..." -make -j16 +# Compile FIO +echo "Compiling FIO..." +make -j2 -# 返回项目根目录 +# Return to project root directory cd .. -echo "=== FIO 编译完成 ===" \ No newline at end of file +echo "=== FIO compilation completed ===" \ No newline at end of file diff --git a/scripts/build_spdk.sh b/scripts/build_spdk.sh index 2b56b4a..0cc8812 100755 --- a/scripts/build_spdk.sh +++ b/scripts/build_spdk.sh @@ -1,7 +1,7 @@ #!/bin/bash -# SPDK 编译脚本 -# 用于在 CMake 配置中自动编译 SPDK submodule +# SPDK build script +# Used to automatically compile SPDK submodule in CMake configuration set -e @@ -9,66 +9,66 @@ SPDK_DIR="${1:-third_party/spdk}" PATCH_FILE="${2:-spdk.patch}" BUILD_DIR="${3:-build}" -echo "=== 编译 SPDK ===" -echo "SPDK 目录: $SPDK_DIR" -echo "补丁文件: $PATCH_FILE" -echo "构建目录: $BUILD_DIR" +echo "=== Building SPDK ===" +echo "SPDK directory: $SPDK_DIR" +echo "Patch file: $PATCH_FILE" +echo "Build directory: $BUILD_DIR" -# 检查 SPDK 目录 +# Check SPDK directory if [ ! -d "$SPDK_DIR" ]; then - echo "错误: SPDK 目录 $SPDK_DIR 不存在" - echo "请先运行: git submodule update --init" + echo "Error: SPDK directory $SPDK_DIR does not exist" + echo "Please run first: git submodule update --init" exit 1 fi -# 检查是否已经编译完成 +# Check if already compiled if [ -f "$SPDK_DIR/build/lib/libspdk_event.a" ] && [ -f "$SPDK_DIR/dpdk/build/lib/librte_eal.a" ]; then - echo "检测到 SPDK 已经编译完成,跳过编译步骤" + echo "Detected that SPDK is already compiled, skipping compilation step" exit 0 fi -# 应用补丁(如果存在) +# Apply patch (if exists) if [ -f "$PATCH_FILE" ]; then - echo "应用补丁: $PATCH_FILE" + echo "Applying patch: $PATCH_FILE" cd "$SPDK_DIR" - # 检查补丁是否已经应用 - if git apply --check "../../$PATCH_FILE" 2>/dev/null; then - # 补丁可以应用,说明尚未应用 - echo "检测到补丁尚未应用,正在应用..." - if git apply "../../$PATCH_FILE"; then - echo "补丁应用成功" + # Check if patch is already applied + if git apply --check "$PATCH_FILE" 2>/dev/null; then + # Patch can be applied, meaning it hasn't been applied yet + echo "Detected that patch has not been applied yet, applying now..." + if git apply "$PATCH_FILE"; then + echo "Patch applied successfully" else - echo "错误: 补丁应用失败" + echo "Error: Patch application failed" exit 1 fi else - # 检查是否已经应用了补丁(通过检查关键文件内容) + # Check if patch has already been applied (by checking key file content) if grep -q "struct spdk_bit_pool {" include/spdk/bit_pool.h 2>/dev/null; then - echo "检测到补丁已应用,跳过补丁应用步骤" + echo "Detected that patch has been applied, skipping patch application step" else - echo "警告: 补丁无法应用且未检测到已应用状态" - echo "可能的原因: SPDK 版本不兼容或文件已被修改" - echo "尝试继续编译..." + echo "Warning: Patch cannot be applied and no applied state detected" + echo "Possible reasons: SPDK version incompatible or files have been modified" + echo "Attempting to continue compilation..." fi fi cd .. else - echo "警告: 补丁文件 $PATCH_FILE 不存在,跳过补丁应用" + echo "Warning: Patch file $PATCH_FILE does not exist, skipping patch application" fi -# 配置 SPDK +# Configure SPDK cd "$SPDK_DIR" git submodule update --init ./scripts/pkgdep.sh -echo "配置 SPDK..." -./configure --disable-tests --disable-unit-tests --disable-apps --disable-examples +echo "Configuring SPDK..." +./configure --disable-tests --disable-unit-tests --disable-apps --disable-examples --with-shared -# 编译 SPDK -echo "编译 SPDK..." -make -j16 +# Compile SPDK +echo "Compiling SPDK..." +make -j2 -# 返回项目根目录 +# Return to project root directory cd .. -echo "=== SPDK 编译完成 ===" \ No newline at end of file +echo "=== SPDK compilation completed ===" \ No newline at end of file diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 61adb7c..8793010 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,34 +1,27 @@ # Test support is optional -if(ENABLE_TESTS) - # 首先尝试使用 pkg-config 查找 CUnit - find_package(PkgConfig QUIET) - if(PKG_CONFIG_FOUND) - pkg_check_modules(CUNIT QUIET cunit) - endif() - - # 如果 pkg-config 找不到,尝试手动查找 - if(NOT CUNIT_FOUND) - find_path(CUNIT_INCLUDE_DIR CUnit/CUnit.h) - find_library(CUNIT_LIBRARY NAMES cunit) - - if(CUNIT_INCLUDE_DIR AND CUNIT_LIBRARY) - set(CUNIT_FOUND TRUE) - set(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR}) - set(CUNIT_LIBRARIES ${CUNIT_LIBRARY}) - endif() - endif() +find_package(PkgConfig QUIET) +if(PKG_CONFIG_FOUND) + pkg_check_modules(CUNIT QUIET cunit) +endif() + +if(NOT CUNIT_FOUND) + find_path(CUNIT_INCLUDE_DIR CUnit/CUnit.h) + find_library(CUNIT_LIBRARY NAMES cunit) - # 检查 CUnit 是否最终找到 - if(NOT CUNIT_FOUND) - message(FATAL_ERROR "CUnit not found. Please install CUnit development package.") + if(CUNIT_INCLUDE_DIR AND CUNIT_LIBRARY) + set(CUNIT_FOUND TRUE) + set(CUNIT_INCLUDE_DIRS ${CUNIT_INCLUDE_DIR}) + set(CUNIT_LIBRARIES ${CUNIT_LIBRARY}) endif() - - # 添加 CUnit 包含目录 - include_directories(${CUNIT_INCLUDE_DIRS}) - - # 添加子目录 - add_subdirectory(bytebuffer) - add_subdirectory(ckpt) - add_subdirectory(fs) - add_subdirectory(journal) -endif() \ No newline at end of file +endif() + +if(NOT CUNIT_FOUND) + message(FATAL_ERROR "CUnit not found. Please install CUnit development package.") +endif() + +include_directories(${CUNIT_INCLUDE_DIRS}) + +add_subdirectory(bytebuffer) +add_subdirectory(ckpt) +add_subdirectory(fs) +add_subdirectory(journal) \ No newline at end of file diff --git a/test/bytebuffer/CMakeLists.txt b/test/bytebuffer/CMakeLists.txt index 29b1544..7ca393b 100644 --- a/test/bytebuffer/CMakeLists.txt +++ b/test/bytebuffer/CMakeLists.txt @@ -1,33 +1,28 @@ set(TARGET_NAME bytebuffer_ut) -# 源文件 set(SOURCES bytebuffer_ut.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include - ${SPDK_SUBMODULE_DIR}/test + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test ) -# 链接 fastfs 库和 SPDK 静态库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs cunit - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) \ No newline at end of file diff --git a/test/ckpt/CMakeLists.txt b/test/ckpt/CMakeLists.txt index edf7b4e..df8885b 100644 --- a/test/ckpt/CMakeLists.txt +++ b/test/ckpt/CMakeLists.txt @@ -1,33 +1,28 @@ set(TARGET_NAME checkpoint_ut) -# 源文件 set(SOURCES checkpoint_ut.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include - ${SPDK_SUBMODULE_DIR}/test + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test ) -# 链接 fastfs 库和 SPDK 静态库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs cunit - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) \ No newline at end of file diff --git a/test/fs/CMakeLists.txt b/test/fs/CMakeLists.txt index 1c6e2c0..f005405 100644 --- a/test/fs/CMakeLists.txt +++ b/test/fs/CMakeLists.txt @@ -1,46 +1,39 @@ set(TARGET_NAME fastfs_ut) -# 源文件 set(SOURCES fastfs_ut.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include - ${SPDK_SUBMODULE_DIR}/test + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test ${CUNIT_INCLUDE_DIRS} ) -# 链接库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs ${CUNIT_LIBRARIES} - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置编译选项 target_compile_options(${TARGET_NAME} PRIVATE ${CUNIT_CFLAGS_OTHER} -ffunction-sections -DSPDK_UNIT_TEST=1 ) -# 设置链接选项 target_link_options(${TARGET_NAME} PRIVATE -Wl,--gc-sections ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) \ No newline at end of file diff --git a/test/journal/CMakeLists.txt b/test/journal/CMakeLists.txt index 3b1e569..932e569 100644 --- a/test/journal/CMakeLists.txt +++ b/test/journal/CMakeLists.txt @@ -1,33 +1,28 @@ set(TARGET_NAME journal_ut) -# 源文件 set(SOURCES journal_ut.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include - ${SPDK_SUBMODULE_DIR}/test + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test ) -# 链接 fastfs 库和 SPDK 静态库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs cunit - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) \ No newline at end of file diff --git a/tools/CMakeLists.txt b/tools/CMakeLists.txt index 97a1cd9..acdf07a 100644 --- a/tools/CMakeLists.txt +++ b/tools/CMakeLists.txt @@ -1,34 +1,28 @@ set(TARGET_NAME fastfs_tools) -# 源文件 set(SOURCES fastfs_tools.cpp) -# 创建可执行文件 add_executable(${TARGET_NAME} ${SOURCES}) -# 包含目录 target_include_directories(${TARGET_NAME} PRIVATE ${CMAKE_SOURCE_DIR} - ${SPDK_SUBMODULE_DIR}/include - ${SPDK_SUBMODULE_DIR}/build/include - ${SPDK_SUBMODULE_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include ) -# 链接 fastfs 库和 SPDK 静态库 target_link_libraries(${TARGET_NAME} PRIVATE fastfs - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event.a - ${SPDK_SUBMODULE_DIR}/build/lib/libspdk_event_bdev.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a Threads::Threads ) -# 设置 RPATH set_target_properties(${TARGET_NAME} PROPERTIES - INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" - BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_SUBMODULE_DIR}/dpdk/build/lib:${SPDK_SUBMODULE_DIR}/build/lib" + INSTALL_RPATH "${CMAKE_SOURCE_DIR}/core:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" + BUILD_RPATH "${CMAKE_BINARY_DIR}/lib:${SPDK_ROOT_DIR}/dpdk/build/lib:${SPDK_ROOT_DIR}/build/lib" ) -# 安装规则 install(TARGETS ${TARGET_NAME} DESTINATION bin) \ No newline at end of file