cmake_minimum_required(VERSION 3.9) # Must be set before project, otherwise you cannot choose between gcc and clang option(ENABLE_FUZZING_TEST "Enable fuzzing test" False) if(ENABLE_FUZZING_TEST) set(CMAKE_C_COMPILER "clang") set(CMAKE_CXX_COMPILER "clang++") endif() project(marsio) # option option(ENABLE_WARNING_AS_ERROR "Enable all optional warnings which are desirable for normal code" TRUE) option(ENABLE_SANITIZE_ADDRESS "Enable AddressSanitizer" FALSE) option(ENABLE_SANITIZE_THREAD "Enable ThreadSanitizer" FALSE) option(ENABLE_VNODE_CHECK_THREAD_SAFE "Enable concurrent write thread-safe check for VNODE." FALSE) option(ENABLE_PTF_TEST "Enable ptf test." FALSE) # envirment message("CMake version: ${CMAKE_VERSION}") message(STATUS "C Compiler Version: ${CMAKE_C_COMPILER_VERSION}") message(STATUS "CXX Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}") message(STATUS "C Standard: ${CMAKE_C_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") # machine set(COREI7 "corei7") set(ICELAKE_SERVER "icelake-server") set(ZNVER1 "znver1") set(SUPPORTED_MACHINES ${COREI7} ${ICELAKE_SERVER} ${ZNVER1}) if(NOT MACHINE) set(MACHINE "corei7") endif() list(FIND SUPPORTED_MACHINES ${MACHINE} INDEX) if(${INDEX} GREATER -1) message(STATUS "current MACHINE is ${MACHINE}.") else() message(FATAL_ERROR "${MACHINE} is not in the support machines list.") endif() # FLAGS and define set(CMAKE_C_FLAGS "-std=gnu99 -m64 -march=${MACHINE} -fPIC -Wall -Wno-format-truncation") set(CMAKE_CXX_FLAGS "-std=gnu++11 -m64 -march=${MACHINE} -fPIC -Wall -Wno-format-truncation") # enable LTO set(CMAKE_INTERPROCEDURAL_OPTIMIZATION True) # Force -O3 for release and relwithdebinfo #string(REPLACE "-O2" "-O3" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") #string(REPLACE "-O2" "-O3" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") if(ENABLE_WARNING_AS_ERROR) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror") endif() if(ENABLE_SANITIZE_ADDRESS) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -fno-omit-frame-pointer") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") elseif(ENABLE_SANITIZE_THREAD) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=thread -fno-omit-frame-pointer") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=thread -fno-omit-frame-pointer") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lasan") endif() if(ENABLE_FUZZING_TEST) # These options need to be added to the compilation options when building the library under test # ref: https://github.com/google/fuzzer-test-suite/blob/master/common.sh set(FSANITIZE_FUZZER_FLAGS "-fsanitize=address,fuzzer-no-link") set(COVERAGE_FLAGS "-fprofile-instr-generate -fcoverage-mapping") set(OTHER_FLAGS "-fPIC -m64 -march=${MACHINE}") set(CMAKE_C_FLAGS "${FSANITIZE_FUZZER_FLAGS} ${COVERAGE_FLAGS} ${OTHER_FLAGS}") set(CMAKE_CXX_FLAGS "${FSANITIZE_FUZZER_FLAGS} ${COVERAGE_FLAGS} ${OTHER_FLAGS}") endif() if(ENABLE_PTF_TEST OR ENABLE_FUZZING_TEST) enable_testing() endif() if(ENABLE_VNODE_CHECK_THREAD_SAFE) add_definitions(-DVNODE_CHECK_THREAD_SAFE) endif() add_definitions(-D_GNU_SOURCE -D__STDC_LIMIT_MACROS) add_definitions(-DALLOW_EXPERIMENTAL_API=1) # Install Dirs set(CMAKE_INSTALL_PREFIX /opt/tsg/mrzcpd) set(MR_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) set(MR_INSTALL_LIBDIR ${MACHINE}/lib) set(MR_INSTALL_BINDIR ${MACHINE}/bin) set(MR_INSTALL_INCLUDEDIR ${MACHINE}/include) set(MR_INSTALL_SYSTEM ${MACHINE}/system) set(MR_ALTERNATIVE_PREFIX ${CMAKE_INSTALL_PREFIX}) set(MR_ALTERNATIVE_LIBDIR ${MR_ALTERNATIVE_PREFIX}/lib) set(MR_ALTERNATIVE_BINDIR ${MR_ALTERNATIVE_PREFIX}/bin) set(MR_ALTERNATIVE_INCLUDEDIR ${MR_ALTERNATIVE_PREFIX}/include) set(MR_INSTALL_LDCONFDIR /etc/ld.so.conf.d/) set(MR_INSTALL_SYSUNITCONFDIR /etc/sysconfig/) set(MR_INSTALL_PROFILEDIR /etc/profile.d/) set(ALTERANTIVES_PRIORITY 300) if(MACHINE STREQUAL ${COREI7}) set(ALTERANTIVES_PRIORITY 300) elseif(MACHINE STREQUAL ${ICELAKE_SERVER}) set(ALTERANTIVES_PRIORITY 200) elseif(MACHINE STREQUAL ${ZNVER1}) set(ALTERANTIVES_PRIORITY 100) endif() exec_program(pkg-config ARGS systemd --variable=systemdsystemunitdir OUTPUT_VARIABLE MR_INSTALL_SYSUNITDIR) # compile set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) include(Version) include_directories(include/external) include_directories(include/internal) find_package(PCAP REQUIRED) link_directories(${PCAP_LIBRARY_DIR}) include_directories(${PCAP_INCLUDE_DIR}) add_subdirectory(${CMAKE_SOURCE_DIR}/support) add_subdirectory(${CMAKE_SOURCE_DIR}/include) add_subdirectory(${CMAKE_SOURCE_DIR}/infra) add_subdirectory(${CMAKE_SOURCE_DIR}/service) add_subdirectory(${CMAKE_SOURCE_DIR}/app) add_subdirectory(${CMAKE_SOURCE_DIR}/pag) #add_subdirectory(${CMAKE_SOURCE_DIR}/tunnat) add_subdirectory(${CMAKE_SOURCE_DIR}/examples) add_subdirectory(${CMAKE_SOURCE_DIR}/tools) add_subdirectory(${CMAKE_SOURCE_DIR}/conf) add_subdirectory(${CMAKE_SOURCE_DIR}/test) add_custom_target("install-program" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Program -P cmake_install.cmake) add_custom_target("install-profile" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Profile -P cmake_install.cmake) message(STATUS "Packet I/O Middleware based on DPDK(Marsio), Version: ${MARSIO_VERSION}") # package include(InstallDPDK) include(Package)