diff --git a/CMakeLists.txt b/CMakeLists.txt index 51cbf52e..52bf27d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.1) +cmake_minimum_required(VERSION 3.4) project(pslite C CXX) set(CMAKE_CXX_STANDARD 11) @@ -8,31 +8,58 @@ list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake/Modules) add_library(pslite) +if(POLICY CMP0074) # Support Protobuf_ROOT etc environment variables on CMake 3.12+ + cmake_policy(SET CMP0074 NEW) +endif() + # ---[ zmq -include("cmake/External/zmq.cmake") -target_include_directories(pslite PRIVATE ${ZMQ_INCLUDE_DIRS}) -target_link_libraries(pslite PUBLIC ${ZMQ_LIBRARIES}) +find_package(ZMQ) +if(NOT ZMQ_FOUND) + cmake_minimum_required(VERSION 3.11) + include(FetchContent) + FetchContent_Declare(zmq + URL https://github.com/zeromq/libzmq/releases/download/v4.3.2/zeromq-4.3.2.zip + URL_HASH SHA256=d01517983ded9ff1b6c40f8206fc2b44ac96157a5aea7b974e8b0079547edfda) + FetchContent_GetProperties(zmq) + if(NOT zmq_POPULATED) + FetchContent_Populate(zmq) + if(POLICY CMP0077) # Avoid building shared library and tests on CMake 3.13+ + cmake_policy(SET CMP0077 NEW) + set(BUILD_SHARED OFF CACHE BOOL "") + set(BUILD_TESTS OFF CACHE BOOL "") + endif() + add_subdirectory(${zmq_SOURCE_DIR} ${zmq_BINARY_DIR}) + endif() + target_link_libraries(pslite PUBLIC libzmq-static) +else() + target_include_directories(pslite PRIVATE ${ZMQ_INCLUDE_DIRS}) + target_link_libraries(pslite PUBLIC ${ZMQ_LIBRARIES}) +endif() + # ---[ Google-protobuf -include(cmake/ProtoBuf.cmake) +# Workaround broken DLAMI. DLAMI ships a broken protoc at /home/ubuntu/anaconda3/bin +# https://docs.aws.amazon.com/dlami/latest/devguide/overview-base.html +set(CMAKE_IGNORE_PATH "/home/ubuntu/anaconda3/bin") +set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE) +find_package(Protobuf REQUIRED) target_link_libraries(pslite PUBLIC ${PROTOBUF_LIBRARY}) target_include_directories(pslite PUBLIC ${PROTOBUF_INCLUDE_DIR}) -FILE(GLOB SOURCE "src/*.cc") +# Generate protobuf headers and sources +file(GLOB_RECURSE PROTO_FILES "src/*.proto") +protobuf_generate_cpp(PROTO_SRCS PROTO_HDRS ${PROTO_FILES}) +target_sources(pslite PRIVATE ${PROTO_SRCS}) +target_include_directories(pslite PUBLIC ${CMAKE_CURRENT_BINARY_DIR}) # PROTO_HDRS files are here -# generate protobuf sources -set(proto_gen_folder "${PROJECT_BINARY_DIR}/src") -file(GLOB_RECURSE proto_files "src/*.proto") -pslite_protobuf_generate_cpp_py(${proto_gen_folder} proto_srcs proto_hdrs proto_python "${PROJECT_SOURCE_DIR}" "src" ${proto_files}) -list(APPEND SOURCE ${proto_srcs}) - -target_include_directories(pslite PUBLIC "${PROJECT_SOURCE_DIR}/include/") -target_include_directories(pslite PUBLIC "${PROJECT_BINARY_DIR}/include/") -target_include_directories(pslite PRIVATE "${PROJECT_BINARY_DIR}/src/") +# Generate protobuf python interface +protobuf_generate_python(PROTO_PYS ${PROTO_FILES}) +add_custom_target(proto_python ALL DEPENDS ${PROTO_PYS}) +add_dependencies(pslite proto_python) if(MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") FILE(GLOB getopt_SOURCE "src/windows/getopt.c") - list(APPEND SOURCE ${getopt_SOURCE}) + target_sources(pslite PRIVATE ${getopt_SOURCE}) add_definitions(-DSTATIC_GETOPT) target_include_directories(pslite PRIVATE "${PROJECT_SOURCE_DIR}/src/windows") target_link_libraries(pslite PUBLIC "ipHlpApi.lib" "ws2_32.lib") @@ -45,4 +72,6 @@ if(MSVC) endforeach(flag_var) endif() +file(GLOB_RECURSE SOURCE "src/*.cc") +target_include_directories(pslite PUBLIC "${PROJECT_SOURCE_DIR}/include/") target_sources(pslite PRIVATE ${SOURCE}) diff --git a/cmake/External/zmq.cmake b/cmake/External/zmq.cmake deleted file mode 100644 index 5b2bde2e..00000000 --- a/cmake/External/zmq.cmake +++ /dev/null @@ -1,63 +0,0 @@ -if (NOT __ZMQ_INCLUDED) # guard against multiple includes - set(__ZMQ_INCLUDED TRUE) - - # use the system-wide ZMQ if present - find_package(ZMQ) - if (ZMQ_FOUND) - set(ZMQ_EXTERNAL FALSE) - else() - # ZMQ will use pthreads if it's available in the system, so we must link with it - find_package(Threads) - - # build directory - set(ZMQ_PREFIX ${CMAKE_BINARY_DIR}/external/ZMQ-prefix) - # install directory - set(ZMQ_INSTALL ${CMAKE_BINARY_DIR}/external/ZMQ-install) - - # we build ZMQ statically, but want to link it into the caffe shared library - # this requires position-independent code - if (UNIX) - set(ZMQ_EXTRA_COMPILER_FLAGS "-fPIC") - endif() - - set(ZMQ_CXX_FLAGS ${CMAKE_CXX_FLAGS} ${ZMQ_EXTRA_COMPILER_FLAGS}) - set(ZMQ_C_FLAGS ${CMAKE_C_FLAGS} ${ZMQ_EXTRA_COMPILER_FLAGS}) - - include(ExternalProject) - ExternalProject_Add(ZMQ - PREFIX ${ZMQ_PREFIX} - GIT_REPOSITORY "https://github.com/zeromq/libZMQ.git" - UPDATE_COMMAND "" - INSTALL_DIR ${ZMQ_INSTALL} - CMAKE_ARGS -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} - -DCMAKE_INSTALL_PREFIX=${ZMQ_INSTALL} - -DBUILD_SHARED_LIBS=OFF - -DBUILD_STATIC_LIBS=ON - -DBUILD_PACKAGING=OFF - -DBUILD_TESTING=OFF - -DBUILD_NC_TESTS=OFF - -BUILD_CONFIG_TESTS=OFF - -DINSTALL_HEADERS=ON - -DCMAKE_C_FLAGS=${ZMQ_C_FLAGS} - -DCMAKE_CXX_FLAGS=${ZMQ_CXX_FLAGS} - LOG_DOWNLOAD 1 - LOG_INSTALL 1 - ) - - set(ZMQ_FOUND TRUE) - set(ZMQ_INCLUDE_DIRS ${ZMQ_INSTALL}/include) - - if(MSVC) - FILE(GLOB_RECURSE ZMQ_LIBRARIES "${ZMQ_INSTALL}/lib/libzmq-${CMAKE_VS_PLATFORM_TOOLSET}*.lib") - #set(ZMQ_LIBRARIES ${ZMQ_INSTALL}/lib/ZMQ.lib ${CMAKE_THREAD_LIBS_INIT}) - else() - FILE(GLOB_RECURSE ZMQ_LIBRARIES "${ZMQ_INSTALL}/lib/libzmq-*.a") - #set(ZMQ_LIBRARIES ${ZMQ_INSTALL}/lib/libZMQ.a ${CMAKE_THREAD_LIBS_INIT}) - endif() - set(ZMQ_LIBRARY_DIRS ${ZMQ_INSTALL}/lib) - set(ZMQ_EXTERNAL TRUE) - - list(APPEND external_project_dependencies ZMQ) - endif() - -endif() diff --git a/cmake/ProtoBuf.cmake b/cmake/ProtoBuf.cmake deleted file mode 100644 index b22d1910..00000000 --- a/cmake/ProtoBuf.cmake +++ /dev/null @@ -1,86 +0,0 @@ -# Finds Google Protocol Buffers library and compilers and extends -# the standard cmake script with version and python generation support - -find_package( Protobuf REQUIRED ) -include_directories(SYSTEM ${PROTOBUF_INCLUDE_DIR}) - - -# As of Ubuntu 14.04 protoc is no longer a part of libprotobuf-dev package -# and should be installed separately as in: sudo apt-get install protobuf-compiler -if(EXISTS ${PROTOBUF_PROTOC_EXECUTABLE}) - message(STATUS "Found PROTOBUF Compiler: ${PROTOBUF_PROTOC_EXECUTABLE}") -else() - message(FATAL_ERROR "Could not find PROTOBUF Compiler") -endif() - - -# place where to generate protobuf sources -set(proto_gen_folder "${PROJECT_BINARY_DIR}/include/pslite/proto") -include_directories(SYSTEM "${PROJECT_BINARY_DIR}/include") - -set(PROTOBUF_GENERATE_CPP_APPEND_PATH TRUE) - -################################################################################################ -# Modification of standard 'protobuf_generate_cpp()' with output dir parameter and python support -# Usage: -# pslite_protobuf_generate_cpp_py( ) -function(pslite_protobuf_generate_cpp_py output_dir srcs_var hdrs_var python_var work_path proto_path) - if(NOT ARGN) - message(SEND_ERROR "Error: pslite_protobuf_generate_cpp_py() called without any proto files") - return() - endif() - - if(PROTOBUF_GENERATE_CPP_APPEND_PATH) - # Create an include path for each file specified - foreach(fil ${ARGN}) - get_filename_component(abs_fil ${fil} ABSOLUTE) - get_filename_component(abs_path ${abs_fil} PATH) - list(FIND _protoc_include ${abs_path} _contains_already) - if(${_contains_already} EQUAL -1) - list(APPEND _protoc_include -I ${abs_path}) - endif() - endforeach() - else() - set(_protoc_include -I ${CMAKE_CURRENT_SOURCE_DIR}) - endif() - - if(DEFINED PROTOBUF_IMPORT_DIRS) - foreach(dir ${PROTOBUF_IMPORT_DIRS}) - get_filename_component(abs_path ${dir} ABSOLUTE) - list(FIND _protoc_include ${abs_path} _contains_already) - if(${_contains_already} EQUAL -1) - list(APPEND _protoc_include -I ${abs_path}) - endif() - endforeach() - endif() - - set(${srcs_var}) - set(${hdrs_var}) - set(${python_var}) - foreach(fil ${ARGN}) - get_filename_component(abs_fil ${fil} ABSOLUTE) - get_filename_component(fil_we ${fil} NAME_WE) - string(REPLACE ${work_path}/ "" o_fil ${abs_fil}) - string(REPLACE "${fil_we}.proto" "" o_fil_path ${o_fil}) - - list(APPEND ${srcs_var} "${o_fil_path}/${fil_we}.pb.cc") - list(APPEND ${hdrs_var} "${o_fil_path}/${fil_we}.pb.h") - list(APPEND ${python_var} "${o_fil_path}/${fil_we}_pb2.py") - - add_custom_command( - OUTPUT "${o_fil_path}/${fil_we}.pb.cc" - "${o_fil_path}/${fil_we}.pb.h" - "${o_fil_path}/${fil_we}_pb2.py" - COMMAND ${CMAKE_COMMAND} -E make_directory "${output_dir}" - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --cpp_out ${output_dir} ${o_fil} --proto_path ${proto_path} - COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} --python_out ${output_dir} ${o_fil} --proto_path ${proto_path} - DEPENDS ${abs_fil} - WORKING_DIRECTORY ${work_path} - COMMENT "Running C++/Python protocol buffer compiler on ${o_fil}" VERBATIM ) - endforeach() - - set_source_files_properties(${${srcs_var}} ${${hdrs_var}} ${${python_var}} PROPERTIES GENERATED TRUE) - set(${srcs_var} ${${srcs_var}} PARENT_SCOPE) - set(${hdrs_var} ${${hdrs_var}} PARENT_SCOPE) - set(${python_var} ${${python_var}} PARENT_SCOPE) -endfunction()