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..8bcc731 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,127 @@ +cmake_minimum_required(VERSION 3.16) +project(FastFS VERSION 1.0 LANGUAGES CXX C) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) + +find_package(Threads REQUIRED) + +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 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) + +set(DEPS_DIR ${CMAKE_SOURCE_DIR}/deps) + +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 enabled" ON) + +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -O2") + +# 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() + +if(BUILD_SPDK) + set(SPDK_BUILD_COMMAND ${CMAKE_SOURCE_DIR}/scripts/build_spdk.sh ${SPDK_ROOT_DIR} ${CMAKE_SOURCE_DIR}/spdk.patch) + + add_custom_target(build_spdk + COMMAND ${SPDK_BUILD_COMMAND} + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + COMMENT "Building SPDK" + ) + + set(SPDK_DEPENDENCY build_spdk) +else() + set(SPDK_DEPENDENCY "") +endif() + +# 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() + + set(FIO_SRC_DIR ${FIO_ROOT_DIR}) + set(FIO_BUILD_DIR ${FIO_ROOT_DIR}) + + 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() + +# Core library (always built) +add_subdirectory(core) +add_subdirectory(tools) + +# 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_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: ${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/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..7343f8b --- /dev/null +++ b/bench/CMakeLists.txt @@ -0,0 +1,6 @@ +# Add benchmark subdirectories +add_subdirectory(mdtest) + +if(ENABLE_FIO) + add_subdirectory(fio) +endif() \ 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..6ab67b5 --- /dev/null +++ b/bench/fio/CMakeLists.txt @@ -0,0 +1,45 @@ +# FIO plugin support is optional +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/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..6d7aa4a --- /dev/null +++ b/bench/mdtest/CMakeLists.txt @@ -0,0 +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_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 +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..6c4d1bc --- /dev/null +++ b/compile.sh @@ -0,0 +1,93 @@ +#!/bin/bash + +# 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) + ENABLE_FIO=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 + +# 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" + +# Build CMake configuration command +CMAKE_CMD="cmake .." + +if [[ $ENABLE_FIO -eq 1 ]]; then + CMAKE_CMD+=" -DENABLE_FIO=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 + +# Run CMake configuration +echo "Running CMake configuration..." +eval "$CMAKE_CMD" + +# Build project +echo "Building FastFS..." +make -j2 + +echo "Build completed successfully!" +echo "Binaries are located in: $BUILD_DIR/bin" +echo "Libraries are located in: $BUILD_DIR/lib64" \ No newline at end of file diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt new file mode 100644 index 0000000..6dcd291 --- /dev/null +++ b/core/CMakeLists.txt @@ -0,0 +1,141 @@ +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_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include +) + +file(GLOB SPDK_LIBS "${SPDK_ROOT_DIR}/build/lib/libspdk_*.a") + + +# Use manual library list for better control and compatibility +set(SPDK_CORE_LIBS + ${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 + + ${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 + + ${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 + + ${SPDK_ROOT_DIR}/build/lib/libspdk_ftl.a + + ${SPDK_ROOT_DIR}/build/lib/libspdk_vmd.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_nvme.a + + ${SPDK_ROOT_DIR}/build/lib/libspdk_virtio.a + + ${SPDK_ROOT_DIR}/build/lib/libspdk_vfio_user.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 + + ${SPDK_ROOT_DIR}/build/lib/libspdk_sock_posix.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_sock.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 + + ${SPDK_ROOT_DIR}/build/lib/libspdk_bdev.a + + ${SPDK_ROOT_DIR}/build/lib/libspdk_notify.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_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}) + list(APPEND SPDK_LIBS_FILTERED ${lib}) + endif() +endforeach() + +file(GLOB DPDK_LIBS "${SPDK_ROOT_DIR}/dpdk/build/lib/librte_*.a") + +target_link_libraries(${TARGET_NAME} + PRIVATE + -Wl,--whole-archive + ${SPDK_LIBS_FILTERED} + -Wl,--no-whole-archive + + ${DPDK_LIBS} + + ${SPDK_ROOT_DIR}/isa-l/.libs/libisal.a + ${SPDK_ROOT_DIR}/isa-l-crypto/.libs/libisal_crypto.a + + ssl + crypto + uuid + fuse3 + lz4 + keyutils + + Threads::Threads + dl + pthread + numa + rt + m + aio +) + +if(DEFINED SPDK_DEPENDENCY AND SPDK_DEPENDENCY) + add_dependencies(${TARGET_NAME} ${SPDK_DEPENDENCY}) +endif() + +set_target_properties(${TARGET_NAME} PROPERTIES + 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 lib64 + ARCHIVE DESTINATION lib64 + 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..43d5edf --- /dev/null +++ b/fuse/CMakeLists.txt @@ -0,0 +1,38 @@ +# FUSE support is optional +if(ENABLE_FUSE) + set(TARGET_NAME fastfs_fuse) + + 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_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ) + + target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + ${FUSE3_LIBRARIES} + ${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}) + + set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..e16ce4a --- /dev/null +++ b/scripts/build_fio.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +set -e + +FIO_DIR="${1}" +BUILD_DIR="${2:-build}" + +echo "=== compile FIO ===" +echo "FIO dir: $FIO_DIR" +echo "build dir: $BUILD_DIR" + +if [ ! -d "$FIO_DIR" ]; then + 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 "Detected that FIO is already compiled, skipping compilation step" + exit 0 +fi + +cd "$FIO_DIR" + +# Configure FIO +echo "Configuring FIO..." +./configure + +# Compile FIO +echo "Compiling FIO..." +make -j2 + +# Return to project root directory +cd .. + +echo "=== FIO compilation completed ===" \ No newline at end of file diff --git a/scripts/build_spdk.sh b/scripts/build_spdk.sh new file mode 100755 index 0000000..0cc8812 --- /dev/null +++ b/scripts/build_spdk.sh @@ -0,0 +1,74 @@ +#!/bin/bash + +# SPDK build script +# Used to automatically compile SPDK submodule in CMake configuration + +set -e + +SPDK_DIR="${1:-third_party/spdk}" +PATCH_FILE="${2:-spdk.patch}" +BUILD_DIR="${3:-build}" + +echo "=== Building SPDK ===" +echo "SPDK directory: $SPDK_DIR" +echo "Patch file: $PATCH_FILE" +echo "Build directory: $BUILD_DIR" + +# Check SPDK directory +if [ ! -d "$SPDK_DIR" ]; then + 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 "Detected that SPDK is already compiled, skipping compilation step" + exit 0 +fi + +# Apply patch (if exists) +if [ -f "$PATCH_FILE" ]; then + echo "Applying patch: $PATCH_FILE" + cd "$SPDK_DIR" + + # 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 "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 "Detected that patch has been applied, skipping patch application step" + else + 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 "Warning: Patch file $PATCH_FILE does not exist, skipping patch application" +fi + +# Configure SPDK +cd "$SPDK_DIR" +git submodule update --init +./scripts/pkgdep.sh +echo "Configuring SPDK..." +./configure --disable-tests --disable-unit-tests --disable-apps --disable-examples --with-shared + +# Compile SPDK +echo "Compiling SPDK..." +make -j2 + +# Return to project root directory +cd .. + +echo "=== SPDK compilation completed ===" \ 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..8793010 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,27 @@ +# Test support is optional +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) + + 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() + +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/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..7ca393b --- /dev/null +++ b/test/bytebuffer/CMakeLists.txt @@ -0,0 +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_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test +) + +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..df8885b --- /dev/null +++ b/test/ckpt/CMakeLists.txt @@ -0,0 +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_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test +) + +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..f005405 --- /dev/null +++ b/test/fs/CMakeLists.txt @@ -0,0 +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_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_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 +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..932e569 --- /dev/null +++ b/test/journal/CMakeLists.txt @@ -0,0 +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_ROOT_DIR}/include + ${SPDK_ROOT_DIR}/build/include + ${SPDK_ROOT_DIR}/dpdk/build/include + ${SPDK_ROOT_DIR}/test +) + +target_link_libraries(${TARGET_NAME} + PRIVATE + fastfs + cunit + ${SPDK_ROOT_DIR}/build/lib/libspdk_event.a + ${SPDK_ROOT_DIR}/build/lib/libspdk_event_bdev.a + Threads::Threads +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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..acdf07a --- /dev/null +++ b/tools/CMakeLists.txt @@ -0,0 +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_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 +) + +set_target_properties(${TARGET_NAME} PROPERTIES + 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/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