Skip to content
Snippets Groups Projects
Select Git revision
  • b9bf520e1583539ffb607fa1ecc60fec0dd07543
  • main default protected
  • feature/websocket-handshake
  • bug/buffer-reset
  • debug/websocket-crash
  • feature/quic-websocket
  • bug/buffering
  • bug/sockets
  • feature/profiler
  • feature/windows-arm64-uwp
  • 0.7.0
  • 0.6.19
  • 0.6.18
  • 0.6.17
  • 0.6.16
  • 0.6.15
  • 0.6.14
  • 0.6.13
  • 0.6.12
  • 0.6.11
  • 0.6.10
  • 0.6.9
  • 0.6.8
  • 0.6.7
  • 0.6.6
  • 0.6.5
  • 0.6.4
  • 0.6.3
  • 0.6.2
  • 0.6.1
30 results

CMakeLists.txt

Blame
  • Code owners
    Assign users and groups as approvers for specific file changes. Learn more.
    CMakeLists.txt 5.95 KiB
    cmake_minimum_required (VERSION 3.18.0)
    include (CheckIncludeFile)
    include (CheckIncludeFileCXX)
    include (CheckFunctionExists)
    
    if (NOT FTL_VERSION)
    	set(FTL_VERSION 0.0.1)
    endif()
    
    project (beyond-protocol VERSION "${FTL_VERSION}")
    
    include(GNUInstallDirs)
    include(CTest)
    
    enable_testing()
    
    option(WITH_GNUTLS "Enable TLS support" ON)
    option(USE_CPPCHECK "Apply cppcheck during build" ON)
    option(BUILD_TESTS "Compile all unit and integration tests" ON)
    option(BUILD_EXAMPLES "Compile the examples" ON)
    
    if (NOT WIN32)
    	option(WITH_PYTHON "Enable python support" ON)
    endif()
    
    if (BUILD_TESTS)
    	include_directories(src/lib/catch)
    endif()
    
    set(THREADS_PREFER_PTHREAD_FLAG ON)
    set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
    
    find_package(Threads REQUIRED)
    find_package(URIParser REQUIRED)
    find_package(MsgPack REQUIRED)
    
    find_program(CCACHE_PROGRAM ccache)
    if(CCACHE_PROGRAM)
    	set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
    	message(STATUS "Found ccache: ${CCACHE_PROGRAM}")
    endif()
    
    # ==== GnuTLS ==================================================================
    
    if (WITH_GNUTLS)
    	#find_package(GnuTLS REQUIRED)
    	include(FindGnuTLS)
    	message(STATUS "Gnutls found: ${GNUTLS_FOUND}")
    	set(HAVE_GNUTLS true)
    else()
    	add_library(gnutls INTERFACE)
    endif()
    
    # ==============================================================================
    
    if(${CMAKE_VERSION} VERSION_GREATER "3.12.0")
    	cmake_policy(SET CMP0074 NEW)
    endif()
    
    set(CMAKE_CXX_STANDARD 17)
    
    # ==============================================================================
    
    # Incase find_package failed, manually look for msgpack
    if (NOT MsgPack_FOUND)
    	check_include_file_cxx("msgpack.hpp" MSGPACK_FOUND)
    	if (NOT MSGPACK_FOUND)
    		message(ERROR "Msgpack is required")
    	endif()
    else()
    	if(WIN32)
    		# Find include
    		find_path(MSGPACK_INCLUDE_DIRS
    			NAMES msgpack.hpp
    			PATHS "C:/Program Files/msgpack" "C:/Program Files (x86)/msgpack"
    			PATH_SUFFIXES include
    		)
    	endif()
    	# TODO(nick) Create imported target.
    	include_directories(${MSGPACK_INCLUDE_DIRS})
    endif()
    
    # Only need libuuid on Linux, Windows has its own
    if (NOT WIN32)
    check_include_file("uuid/uuid.h" UUID_FOUND)
    if (NOT UUID_FOUND)
    	message(ERROR "UUID library is required")
    endif()
    find_library(UUID_LIBRARIES NAMES uuid libuuid)
    else()
    endif()
    
    # Optional source problem check
    if (USE_CPPCHECK)
    	find_program(CPPCHECK_FOUND cppcheck)
    	if (CPPCHECK_FOUND)
    		message(STATUS "Found cppcheck: will perform source checks")
    		set(CMAKE_CXX_CPPCHECK "cppcheck" "-D__align__(A)" "--enable=warning,performance,style" "--inline-suppr" "--std=c++17" "--suppress=*:*loguru.*" "--suppress=*:*catch.hpp" "--suppress=*:*elas*" "--suppress=*:*json.hpp" "--quiet")
    	endif()
    endif()
    
    include(git_version)
    include(ftl_paths)
    
    if (WIN32) # TODO(nick) Should do based upon compiler (VS)
    	add_definitions(-DWIN32)
    	#set(CMAKE_GENERATOR_TOOLSET "host=x64")
    	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX2 /MP /std:c++17 /wd4996 /Zc:__cplusplus")
    	set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DFTL_DEBUG /Wall")
    	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /O2")
    	set(OS_LIBS "")
    else()
    	add_definitions(-DUNIX)
    	# -fdiagnostics-color
    	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-color=always -std=c++17 -fPIC -march=haswell -mavx2 -mfpmath=sse -Wall -Werror")
    	set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -pg")
    	set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
    	set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -O3")
    	set(OS_LIBS "dl")
    endif()
    
    SET(CMAKE_USE_RELATIVE_PATHS ON)
    set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
    
    # ==============================================================================
    
    #if (WITH_PYTHON)
    #	find_package(Python COMPONENTS Interpreter Development REQUIRED)
    #	if (Python_FOUND)
    #		add_subdirectory(src/ext/pybind11)
    #		set(HAVE_PYTHON TRUE)
    #		message(STATUS "Python module enabled")
    #	else()
    #		message(ERROR "Python dependencies not found, Python module is not built")
    #	endif()
    #endif()
    
    ### Generate Build Configuration Files =========================================
    
    configure_file(${CMAKE_SOURCE_DIR}/include/ftl/protocol/config.h.in
    			   ${CMAKE_SOURCE_DIR}/include/ftl/protocol/config.h
    )
    
    configure_file(${CMAKE_SOURCE_DIR}/src/config.cpp.in
    			   ${CMAKE_SOURCE_DIR}/src/config.cpp
    )
    
    if (WIN32) # TODO(nick) Should do based upon compiler (VS)
    	set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${VS_STARTUP_PROJECT})
    	#set_property(TARGET voltu-node PROPERTY VS_DEBUGGER_WORKING_DIRECTORY ${VS_DEBUG_WORKING_DIRECTORY})
    endif()
    
    include(ftl_CPack)
    
    ### ========
    
    include_directories("include/ftl/lib")
    
    add_library(beyond-common OBJECT
    	src/ctpl_stl.cpp
    	src/dispatcher.cpp
    	src/exception.cpp
    	src/loguru.cpp
    	src/uri.cpp
    	src/config.cpp
    	src/time.cpp
    	src/base64.cpp
    	src/channelSet.cpp
    )
    
    target_include_directories(beyond-common PUBLIC
    	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    	$<INSTALL_INTERFACE:include>)
    
    add_library(beyond-protocol STATIC
    	$<TARGET_OBJECTS:beyond-common>
        src/peer.cpp
        src/universe.cpp
    	src/socket/socket.cpp
    	src/protocol/connection.cpp
    	src/protocol/factory.cpp
    	src/protocol/tcp.cpp
    	src/protocol/tls.cpp
    	src/protocol/websocket.cpp
    	src/streams/streams.cpp
    	src/streams/muxer.cpp
    	src/streams/broadcaster.cpp
    	src/streams/netstream.cpp
    	src/streams/filestream.cpp
    	src/node.cpp
    	src/self.cpp
    	src/protocol.cpp
    	src/rpc.cpp
        src/channelUtils.cpp
        src/service.cpp
    )
    
    target_include_directories(beyond-protocol PUBLIC
    	$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
    	$<INSTALL_INTERFACE:include>)
    target_link_libraries(beyond-protocol Threads::Threads ${UUID_LIBRARIES} GnuTLS::GnuTLS)
    
    install(TARGETS beyond-protocol
    	ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    	LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    	RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
    install(DIRECTORY include/ DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
    
    if (BUILD_TESTS)
    	add_subdirectory(test)
    endif()
    
    if (BUILD_EXAMPLES)
        add_subdirectory(examples)
    endif()