Skip to content
Snippets Groups Projects
Select Git revision
  • burak
  • master default
  • ci-bump-test
  • abp-queue
  • new-delete-leaks
  • fused-continuation-and-completion-stealing
  • emper-fix-invalid-conv
  • remote-put-get-free-context-cycle
  • linux-version-construct-on-first-use
  • libstdc++-asserts
  • msan
  • libc++
  • completer-strategies
  • cactus_stack_devel_one_commit
  • client-load-change
  • cppcheck
  • flow
  • cast-if-future
  • async_network2
  • thread_safe_log_config
  • attic/clang-release-tls-optimization-debug-and-fix
  • attic/continuation-stealing-dev
22 results

CMakeLists.txt

Blame
  • Forked from Lehrstuhl für Informatik 4 (Systemsoftware) / manycore / emper
    Source project has a limited visibility.
    CMakeLists.txt 5.14 KiB
    cmake_minimum_required(VERSION 3.3)
    
    project(EMPER)
    
    set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
    message("CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
    include(doxygen)
    
    set(CMAKE_CXX_STANDARD 14)
    set(CMAKE_CXX_STANDARD_REQUIRED on)
    set(CMAKE_EXPORT_COMPILE_COMMANDS on)
    
    set(COMMON_FLAGS "-Wall -pedantic -Wextra")# -Werror")
    set(COMMON_FLAGS "${COMMON_FLAGS} -fno-exceptions -fno-omit-frame-pointer")
    
    set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS} -faligned-new")
    
    message("CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
    message("CMAKE_CXX_FLAGS: ${CMAKE_CXX_FLAGS}")
    
    set(COMMON_DEBUG_FLAGS "-ggdb3")
    set(COMMON_BUILD_DEBUG_FLAGS "${COMMON_DEBUG_FLAGS} -O0")
    
    set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COMMON_BUILD_DEBUG_FLAGS}")
    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COMMON_BUILD_DEBUG_FLAGS}")
    
    set(COMMON_BUILD_RELWITHDEBUG_FLAGS "${COMMON_DEBUG_FLAGS} -O3")
    set(CMAKE_C_FLAGS_RELWITHDEBUG "${CMAKE_C_FLAGS_RELWITHDEBUG} ${COMMON_BUILD_RELWITHDEBUG_FLAGS}")
    set(CMAKE_CXX_FLAGS_RELWITHDEBUG "${CMAKE_CXX_FLAGS_RELWITHDEBUG} ${COMMON_BUILD_RELWITHDEBUG_FLAGS}")
    
    # For "-rdynamic" see https://stackoverflow.com/a/77336/194894 and "man gcc"
    # We probably don't need it since EMPER is mostly statically linked,
    # but it can't hurt to have it (hopefully).
    set(CMAKE_EXEC_LINKER_FLAGS_DEBUG "${CMAKE_EXEC_LINKER_FLAGS_DEBUG} -rdynamic")
    
    add_definitions(-D_GNU_SOURCE)
    
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    find_package(Threads REQUIRED)
    
    enable_testing()
    
    # Custom options, enable with "cmake -DEMPER_WORKER_SLEEP=ON"
    # Source: https://stackoverflow.com/a/10364240/194894
    macro(emper_option option_name option_description)
        option(EMPER_${option_name} ${option_description})
        if(EMPER_${option_name})
            add_definitions(-DEMPER_${option_name})
        endif(EMPER_${option_name})
    endmacro()
    
    emper_option(WORKER_SLEEP "Enable sleeping worker support")
    emper_option(LOCKED_WS_QUEUE "Use a fully locked queue for work-stealing")
    emper_option(OVERFLOW_QUEUE "Use a overflow queue in case the primary queue is full")
    emper_option(LOCKED_MPSC_QUEUE "Use the locked variant for the MPSC queue")
    emper_option(STATS "Collect stats and print them at the end of the execution")
    emper_option(SPAWN_ON_BLOCK "Runs a backup thread when a fiber gets blocked by the linux scheduler")
    emper_option(CHECK_BLOCK "Checks if any of the fibers call functions which results in a blocked state in the linux scheduler")
    emper_option(ASYNC_NETWORK "Adds support for asynchronous network IO")
    emper_option(ASYNC_DISK_IO "Adds support for asynchronous disk IO")
    
    if(EMPER_ASYNC_NETWORK OR EMPER_ASYNC_DISK_IO)
        add_definitions(-DEMPER_ASYNC_LIB)
    endif(EMPER_ASYNC_NETWORK OR EMPER_ASYNC_DISK_IO)
    
    # Macro to add files to a var. Can even be used in subdirectories.
    # Source: http://stackoverflow.com/a/7049380/194894
    macro (add_files var)
        file (RELATIVE_PATH _relPath "${PROJECT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}")
        foreach (_src ${ARGN})
            if (_relPath)
                list (APPEND ${var} "${_relPath}/${_src}")
            else()
                list (APPEND ${var} "${_src}")
            endif()
        endforeach()
        if (_relPath)
            # propagate ${var} to parent directory
            set (${var} ${${var}} PARENT_SCOPE)
        endif()
    endmacro()
    
    enable_language(ASM_NASM)
    
    add_subdirectory("emper")
    
    message("EMPER_SOURCE: ${EMPER_SOURCE}")
    message("EMPER_INCLUDE: ${EMPER_INCLUDE}")
    message("CMAKE_CXX_FLAGS_RELEASE: ${CMAKE_CXX_FLAGS_RELEASE}")
    message("CMAKE_CXX_FLAGS_RELWITHDEBUG: ${CMAKE_CXX_FLAGS_RELWITHDEBUG}")
    message("CMAKE_CXX_FLAGS_DEBUG: ${CMAKE_CXX_FLAGS_DEBUG}")
    
    add_library(emper_asm_source STATIC ${EMPER_ASM_SOURCE})
    
    add_library(emper STATIC ${EMPER_SOURCE})
    foreach(include_dir ${EMPER_INCLUDE})
      message("Adding include directory: ${include_dir}")
      target_include_directories(emper PUBLIC
    	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/${include_dir}>
    	$<INSTALL_INTERFACE:${include_dir}>
      )
    endforeach()
    if (EMPER_CHECK_BLOCK)
        target_link_libraries(emper bcc)
        target_include_directories(emper PUBLIC "/usr/include/bcc")
    endif()
    # The following property is supposed to enable something like LTO. But
    # CMake appearantly only supports it for the icc. See
    # http://stackoverflow.com/a/31522585/194894
    # set_property(TARGET emper PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
    target_link_libraries(emper Threads::Threads emper_asm_source)
    
    if(EMPER_ASYNC_DISK_IO)
        target_link_libraries(emper uring)
    endif(EMPER_ASYNC_DISK_IO)
    
    add_library(c_emper STATIC ${C_EMPER_SOURCE})
    # See comment above regarding INTERPROCEDURAL_OPTIMIZATION
    # set_property(TARGET c_emper PROPERTY INTERPROCEDURAL_OPTIMIZATION True)
    target_link_libraries(c_emper emper)
    
    add_subdirectory("apps")
    
    add_subdirectory("tests")
    
    add_subdirectory("eval")
    
    file(GLOB ALL_SOURCE_FILES *.cpp)
    file(GLOB ALL_HEADER_FILES *.hpp)
    
    add_custom_target(clang-tidy
      COMMAND clang-tidy
      -config=''
      -p ${CMAKE_BINARY_DIR}
      ${ALL_SOURCE_FILES}
      )
    add_dependencies(clang-tidy Main)
    
    add_custom_target(CheckEmperVersionHeader
      COMMAND ${PROJECT_SOURCE_DIR}/scripts/versionManager.sh -v check
      COMMENT "Checking if EMPER version header is up-to-date"
      )
    add_dependencies(emper CheckEmperVersionHeader)