diff --git a/.gitignore b/.gitignore index 99b84a13..a84c8945 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,11 @@ packages/ Debug/ Release/ out/ -build.debug/ -build.release/ +build.debug +build.release +build.ubuntu +build.iOS +build.RPi +build.android .vs/ *.vcxproj.user \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt index 7fc1730c..1c239a69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,15 +8,36 @@ project (signalrclient) include(CTest) -set(WERROR true CACHE BOOL "Enable warnings as errors.") +# set(WERROR true CACHE BOOL "Enable warnings as errors.") set(WALL true CACHE BOOL "Enable all warnings.") -if(NOT WIN32) +if (ANDROID OR IOS) set(EXTRA_FLAGS "-std=c++11 -fPIC -DNO_SIGNALRCLIENT_EXPORTS") +elseif(NOT WIN32) + set(EXTRA_FLAGS "-std=c++11 -fPIC -DNO_SIGNALRCLIENT_EXPORTS -ldl") else() set(EXTRA_FLAGS "-DSIGNALRCLIENT_EXPORTS") endif() +if(ANDROID) +set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -llog") +else() + if(NOT IOS) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s") + endif() + if(NOT SERCOMMSYSTEM) + set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-gc-section") + endif() +endif() + +if(IOS) + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/Binaries) +else() + set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ACPLATFORM}/${ANDROID_ABI}") + set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/lib/${ACPLATFORM}/${ANDROID_ABI}") +endif() + if(USE_CPPRESTSDK) string(APPEND EXTRA_FLAGS " -DUSE_CPPRESTSDK") endif() @@ -25,11 +46,14 @@ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${EXTRA_FLAGS}") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_LDFLAGS}") if(USE_CPPRESTSDK) - find_package(cpprestsdk REQUIRED) - set(CPPREST_LIB "cpprestsdk::cpprest") + add_library(cpprest_static STATIC IMPORTED) + set_property(TARGET cpprest_static PROPERTY IMPORTED_LOCATION + "${CPPREST_STATIC_LIBRARY_DIR}/libcpprest.a" + ) + set(CPPREST_LIB "cpprest_static") endif() -include_directories (include) +include_directories (include ${CPPREST_INCLUDE_DIR}) # TODO: We shouldn't use this, it makes the dll/lib export all symbols # We need this for testing, but we might just add all the files to the test project manually @@ -37,13 +61,22 @@ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) if(USE_CPPRESTSDK) if(NOT WIN32) - if(APPLE) - file(GLOB OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*) - list(REVERSE OPENSSL_ROOT_DIR) + if(IOS) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpprest_find_boost.cmake) + include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/cpprest_find_openssl.cmake) + cpprest_find_boost() + cpprest_find_openssl() + else() + if(APPLE) + file(GLOB OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*) + list(REVERSE OPENSSL_ROOT_DIR) + endif() + + find_package(OpenSSL 1.0.0 REQUIRED) + set(Boost_USE_STATIC_LIBS ON) + find_package(Boost REQUIRED COMPONENTS system thread chrono) endif() - find_package(OpenSSL 1.0.0 REQUIRED) - find_package(Boost REQUIRED COMPONENTS system thread chrono) endif() endif() @@ -62,4 +95,4 @@ if(BUILD_SAMPLES) add_subdirectory(samples/HubConnectionSample) endif() -install(DIRECTORY include/ DESTINATION include/) \ No newline at end of file +install(DIRECTORY include/ DESTINATION include/) diff --git a/build.RPi.sh b/build.RPi.sh new file mode 100644 index 00000000..f115d337 --- /dev/null +++ b/build.RPi.sh @@ -0,0 +1,47 @@ +#!/bin/bash +SIGNALRCLIENT_BUILD_DIR=build.$AC_PLATFORM +if [[ ! -d ${SIGNALRCLIENT_BUILD_DIR} ]]; then + mkdir ${SIGNALRCLIENT_BUILD_DIR} +fi +cd ${SIGNALRCLIENT_BUILD_DIR} +rm -rf * + + +PLATFORM_ROOT=$SIGNALR_ROOT/.build_RPi +BOOST_ROOT=${PLATFORM_ROOT}/boost-1.61-RPi +CPPRESDSDK_ROOT=${PLATFORM_ROOT}/accessapi-artifacts-RPi-ms/cpprest +OPENSSL_ROOT=${PLATFORM_ROOT}/openssl-1.0.2l-RPi + +command="cmake .. -DCMAKE_TOOLCHAIN_FILE=/opt/RPi/RPi.toolchain \ +-DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=false -DBUILD_SAMPLES=true \ +-DUSE_CPPRESTSDK=true \ +-DCMAKE_BUILD_TYPE=Debug \ +-DBUILD_SHARED_LIBS=0 +-DBoost_NO_BOOST_CMAKE=TRUE \ +-DBoost_NO_SYSTEM_PATHS=TRUE \ +-DBOOST_ROOT=${BOOST_ROOT} \ +-DBOOST_INCLUDEDIR=${BOOST_ROOT}/include \ +-DBoost_INCLUDE_DIR=${BOOST_ROOT}/include \ +-DBOOST_LIBRARYDIR=${BOOST_ROOT}/stage/lib \ +-DBoost_SYSTEM_LIBRARY=${BOOST_ROOT}/stage/lib \ +-DBoost_SYSTEM_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_system-gcc-mt-1_61.a \ +-DBoost_THREAD_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_thread-gcc-mt-1_61.a \ +-DBOOST_THREAD_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_thread-gcc-mt-1_61.a \ +-DBoost_ATOMIC_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_atomic-gcc-mt-1_61.a \ +-DBoost_CHRONO_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_chrono-gcc-mt-1_61.a \ +-DBoost_DATE_TIME_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_date_time-gcc-mt-1_61.a \ + +-DCPPREST_STATIC_LIBRARY_DIR=${CPPRESDSDK_ROOT}/lib \ +-DCPPREST_LIBRARY_DIR=${CPPRESDSDK_ROOT}/lib \ +-DCPPREST_INCLUDE_DIR=${CPPRESDSDK_ROOT}/include \ + +-DOPENSSL_ROOT_DIR=${OPENSSL_ROOT} \ +-DOPENSSL_INCLUDE_DIR=${OPENSSL_ROOT}/include \ +-DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_ROOT}/lib/libcrypto.a \ +-DOPENSSL_SSL_LIBRARY=${OPENSSL_ROOT}/lib/libssl.a \ +" + +echo $command +$command + +make -j$NCPU diff --git a/build.android.sh b/build.android.sh new file mode 100644 index 00000000..baf77924 --- /dev/null +++ b/build.android.sh @@ -0,0 +1,71 @@ +#!/bin/bash +SIGNALRCLIENT_BUILD_DIR=build.$AC_PLATFORM +if [[ ! -d ${SIGNALRCLIENT_BUILD_DIR} ]]; then + mkdir ${SIGNALRCLIENT_BUILD_DIR} +fi +cd ${SIGNALRCLIENT_BUILD_DIR} +rm -rf * + +ANDROID_NDK=$HOME/android-sdk/ndk-bundle + +if [[ ! -d $ANDROID_NDK ]]; then +echo "$ANDROID_NDK is NOT a valid direcotry" +exit -1 +fi +ROOT=$SIGNALR_ROOT/.build_${AC_PLATFORM} +OPENSSL_ROOT=${ROOT}/openssl-1.0.2l-${AC_PLATFORM} +CPPREST_ROOT=${ROOT}/accessapi-artifacts-android-ms/cpprest + +build_signalr() { + rm -rf lib/${AC_PLATFORM}/$1 + BOOST_ROOT=${ROOT}/boost-1.65-${AC_PLATFORM}/$2 + echo ${BOOST_ROOT}/include + COMMAND="/snap/bin/cmake .. \ + -DBUILD_TESTING=false -DBUILD_SAMPLES=false + -DCMAKE_TOOLCHAIN_FILE="${ANDROID_NDK}/build/cmake/android.toolchain.cmake" \ + -DANDROID_NDK="${ANDROID_NDK}" \ + -DANDROID_TOOLCHAIN=clang \ + -DANDROID_ABI=$2 \ + -DANDROID_PLATFORM=android-$4 \ + -DANDROID_NATIVE_API_LEVEL=$4 \ + + + + -DACPLATFORM:STRING=${AC_PLATFORM} \ + + -DCPPREST_INCLUDE_DIR=${CPPREST_ROOT}/include \ + -DCPPREST_STATIC_LIBRARY_DIR=${CPPREST_ROOT}/lib/$2 \ + -DUSE_CPPRESTSDK=true \ + + -DBOOST_ROOT=${BOOST_ROOT} \ + -DBOOST_INCLUDEDIR=${BOOST_ROOT}/include \ + -DBoost_INCLUDE_DIR=${BOOST_ROOT}/include \ + -DBOOST_LIBRARYDIR=${BOOST_ROOT}/lib \ + -DBoost_SYSTEM_LIBRARY=${BOOST_ROOT}/lib \ + -DBoost_SYSTEM_LIBRARY=${BOOST_ROOT}/lib/libboost_system-clang-mt-1_65_1.a \ + -DBoost_THREAD_LIBRARY=${BOOST_ROOT}/lib/libboost_thread-clang-mt-1_65_1.a \ + -DBoost_ATOMIC_LIBRARY=${BOOST_ROOT}/lib/libboost_atomic-clang-mt-1_65_1.a \ + -DBoost_CHRONO_LIBRARY=${BOOST_ROOT}/lib/libboost_chrono-clang-mt-1_65_1.a \ + -DBoost_DATE_TIME_LIBRARY=${BOOST_ROOT}/lib/libboost_date_time-clang-mt-1_65_1.a \ + + -DOPENSSL_ROOT_DIR=${OPENSSL_ROOT} \ + -DOPENSSL_INCLUDE_DIR=${OPENSSL_ROOT}/include \ + -DOPENSSL_CRYPTO_LIBRARY=${OPENSSL_ROOT}/lib/$2/libcrypto.a \ + -DOPENSSL_SSL_LIBRARY=${OPENSSL_ROOT}/lib/$2/libssl.a \ + -DCMAKE_BUILD_TYPE=$3 \ + -B $1" + # echo $COMMAND + $COMMAND + # find Number of CPU from /etc/proc cpu .. + MAKE_COMMAND="make -j$NCPU -C $1" + # echo $MAKE_COMMAND + $MAKE_COMMAND +} + +# Build the signalrclient for each target configuration + +# build_signalr build.armv7.debug armeabi-v7a Debug 18 +build_signalr armeabi-v7a armeabi-v7a Release 18 + +# build_signalr build.armv8.debug arm64-v8a Debug 23 +build_signalr arm64-v8a arm64-v8a Release 23 \ No newline at end of file diff --git a/build.sh b/build.sh new file mode 100644 index 00000000..b11add54 --- /dev/null +++ b/build.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# Usage example +# bash build.sh +# bash build.sh RPi /home/signalrclient + +if [ "$#" -ne 2 ]; then + echo "You must enter exactly 2 command line arguments" +fi + + + +AC_PLATFORM=$1 +SIGNALR_ROOT=$2 + +case $AC_PLATFORM in + iOS|ubuntu|RPi|android) echo "Platfrom found: $AC_PLATFORM";; + *) echo "Invlaid Platform name. Try iOS/ubuntu/RPi/android" ;; +esac + +export AC_PLATFORM=$AC_PLATFORM + +SIGNALR_ROOT=$(echo $SIGNALR_ROOT | sed 's:/*$::') +export SIGNALR_ROOT=$SIGNALR_ROOT +# signalrclient directory should contian include files and +# all the libraries (boost, openssl etc) for all platform +# are present With a dir structure as below + +# signalrclient/.build_RPi +# ├── boost-1.61-RPi +# │   ├── include +# │   └── stage +# ├── openssl-1.0.2l-RPi +# │   ├── include +# │   └── lib +# signalrclient/.build_ubuntu/ +# ├── boost-1.61-ubuntu +# │   ├── include +# │   └── stage +# ├── cpprest +# │   ├── include +# │   ├── lib +# signalrclient/.build_android/ +# ├── boost-1.65-android +# │   ├── arm64-v8a +# │   │   ├── include +# │   │   └── lib +# │   ├── armeabi-v7a +# │   │   ├── include +# │   │   └── lib +# ├── openssl-1.0.2l-android +# │ ├── include +# │ │   └── openssl +# │ └── lib +# │ ├── arm64-v8a +# │ ├── armeabi-v7a +# ├── cpprest +# │   ├── include +# │   ├── lib + +if [ -z "$NCPU" ]; then + NCPU=4 + if uname -s | grep -i "linux" > /dev/null ; then + NCPU=`cat /proc/cpuinfo | grep -c -i processor` + export NCPU=$(($NCPU-1)) + echo "Number of core: $NCPU" + fi +fi + +source build.$AC_PLATFORM.sh \ No newline at end of file diff --git a/build.ubuntu.sh b/build.ubuntu.sh new file mode 100644 index 00000000..f81d41db --- /dev/null +++ b/build.ubuntu.sh @@ -0,0 +1,31 @@ +#!/bin/bash +SIGNALRCLIENT_BUILD_DIR=build.$AC_PLATFORM +if [[ ! -d ${SIGNALRCLIENT_BUILD_DIR} ]]; then + mkdir ${SIGNALRCLIENT_BUILD_DIR} +fi +cd ${SIGNALRCLIENT_BUILD_DIR} +rm -rf * + + +PLATFORM_ROOT=$SIGNALR_ROOT/.build_ubuntu +BOOST_ROOT=${PLATFORM_ROOT}/boost-1.61-ubuntu +CPPRESDSDK_ROOT=${PLATFORM_ROOT}/cpprest + +command="cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTING=false -DBUILD_SAMPLES=true \ + -DUSE_CPPRESTSDK=true + -DBUILD_SHARED_LIBS=0 \ + -DBoost_NO_BOOST_CMAKE=TRUE \ + -DBoost_NO_SYSTEM_PATHS=TRUE \ + -DCPPREST_STATIC_LIBRARY_DIR=${CPPRESDSDK_ROOT}/lib \ + -DCPPREST_LIBRARY_DIR=${CPPRESDSDK_ROOT}/lib \ + -DCPPREST_INCLUDE_DIR=${CPPRESDSDK_ROOT}/include \ + -DBOOST_ROOT=${BOOST_ROOT} \ + -DBOOST_INCLUDEDIR=${BOOST_ROOT}/include \ + -DBoost_INCLUDE_DIR=${BOOST_ROOT}/include \ + -DBoost_SYSTEM_LIBRARY=${BOOST_ROOT}/stage/lib/libboost_system-gcc-mt-1_61.a \ + -DBOOST_LIBRARYDIR=${BOOST_ROOT}/stage/lib " + +echo $command +$command + +make -j$NCPU \ No newline at end of file diff --git a/cmake/cpprest_find_boost.cmake b/cmake/cpprest_find_boost.cmake new file mode 100644 index 00000000..74cc1426 --- /dev/null +++ b/cmake/cpprest_find_boost.cmake @@ -0,0 +1,109 @@ +macro(cpprestsdk_find_boost_android_package) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) + if(CMAKE_HOST_WIN32) + set(WIN32 1) + set(UNIX) + elseif(CMAKE_HOST_APPLE) + set(APPLE 1) + set(UNIX) + endif() + find_package(${ARGN}) + set(APPLE) + set(WIN32) + set(UNIX 1) + set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) + set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY) +endmacro() + +function(cpprest_find_boost) + if(TARGET cpprestsdk_boost_internal) + return() + endif() + + if(IOS) + if (EXISTS "${PROJECT_SOURCE_DIR}/../Build_iOS/boost") + set(IOS_SOURCE_DIR "${PROJECT_SOURCE_DIR}/../Build_iOS") + set(Boost_LIBRARIES "${IOS_SOURCE_DIR}/boost/lib" CACHE INTERNAL "") + set(Boost_INCLUDE_DIR "${IOS_SOURCE_DIR}/boost/include" CACHE INTERNAL "") + else() + set(IOS_SOURCE_DIR "${PROJECT_SOURCE_DIR}/Build_iOS") +message("------------- IOS SOURCE ${IOS_SOURCE_DIR} proj ${PROJECT_SOURCE_DIR}") + set(Boost_LIBRARIES "${IOS_SOURCE_DIR}/boost.framework/boost" CACHE INTERNAL "") + set(Boost_INCLUDE_DIR "${IOS_SOURCE_DIR}/boost.framework/Headers" CACHE INTERNAL "") + endif() + elseif(ANDROID) + set(Boost_COMPILER "-clang") + if(ANDROID_ABI STREQUAL "armeabi-v7a") + set(BOOST_ROOT "${CMAKE_BINARY_DIR}/../Boost-for-Android/build/out/armeabi-v7a" CACHE INTERNAL "") + set(BOOST_LIBRARYDIR "${CMAKE_BINARY_DIR}/../Boost-for-Android/build/out/armeabi-v7a/lib" CACHE INTERNAL "") + set(Boost_ARCHITECTURE "-a32" CACHE INTERNAL "") + else() + set(BOOST_ROOT "${CMAKE_BINARY_DIR}/../Boost-for-Android/build/out/x86" CACHE INTERNAL "") + set(BOOST_LIBRARYDIR "${CMAKE_BINARY_DIR}/../Boost-for-Android/build/out/x86/lib" CACHE INTERNAL "") + set(Boost_ARCHITECTURE "-x32" CACHE INTERNAL "") + endif() + cpprestsdk_find_boost_android_package(Boost ${BOOST_VERSION} EXACT REQUIRED COMPONENTS random system thread filesystem chrono atomic) + elseif(UNIX) + find_package(Boost REQUIRED COMPONENTS random system thread filesystem chrono atomic date_time regex) + else() + find_package(Boost REQUIRED COMPONENTS system date_time regex) + endif() + + add_library(cpprestsdk_boost_internal INTERFACE) + # FindBoost continually breaks imported targets whenever boost updates. + if(1) + target_include_directories(cpprestsdk_boost_internal INTERFACE "$") + set(_prev) + set(_libs) + foreach(_lib ${Boost_LIBRARIES}) + if(_lib STREQUAL "optimized" OR _lib STREQUAL "debug") + else() + if(_prev STREQUAL "optimized") + list(APPEND _libs "$<$>:${_lib}>") + elseif(_prev STREQUAL "debug") + list(APPEND _libs "$<$:${_lib}>") + else() + list(APPEND _libs "${_lib}") + endif() + endif() + set(_prev "${_lib}") + endforeach() + if (NOT IOS OR NOT EXISTS "${PROJECT_SOURCE_DIR}/../Build_iOS/boost") + target_link_libraries(cpprestsdk_boost_internal INTERFACE "$") + endif() + else() + if(ANDROID) + target_link_libraries(cpprestsdk_boost_internal INTERFACE + Boost::boost + Boost::random + Boost::system + Boost::thread + Boost::filesystem + Boost::chrono + Boost::atomic + ) + elseif(UNIX) + target_link_libraries(cpprestsdk_boost_internal INTERFACE + Boost::boost + Boost::random + Boost::system + Boost::thread + Boost::filesystem + Boost::chrono + Boost::atomic + Boost::date_time + Boost::regex + ) + else() + target_link_libraries(cpprestsdk_boost_internal INTERFACE + Boost::boost + Boost::system + Boost::date_time + Boost::regex + ) + endif() + endif() +endfunction() diff --git a/cmake/cpprest_find_openssl.cmake b/cmake/cpprest_find_openssl.cmake new file mode 100644 index 00000000..441554d6 --- /dev/null +++ b/cmake/cpprest_find_openssl.cmake @@ -0,0 +1,78 @@ +function(cpprest_find_openssl) + if(TARGET cpprestsdk_openssl_internal) + return() + endif() + + if(IOS) + set(IOS_SOURCE_DIR "${PROJECT_SOURCE_DIR}/Build_iOS") + + set(OPENSSL_INCLUDE_DIR "${IOS_SOURCE_DIR}/openssl/include" CACHE INTERNAL "") + set(OPENSSL_LIBRARIES + "${IOS_SOURCE_DIR}/openssl/lib/libcrypto.a" + "${IOS_SOURCE_DIR}/openssl/lib/libssl.a" + CACHE INTERNAL "" + ) + set(_SSL_LEAK_SUPPRESS_AVAILABLE ON CACHE INTERNAL "") + elseif(ANDROID) + if(ARM) + set(OPENSSL_INCLUDE_DIR "${CMAKE_BINARY_DIR}/../openssl/armeabi-v7a/include" CACHE INTERNAL "") + set(OPENSSL_LIBRARIES + "${CMAKE_BINARY_DIR}/../openssl/armeabi-v7a/lib/libssl.a" + "${CMAKE_BINARY_DIR}/../openssl/armeabi-v7a/lib/libcrypto.a" + CACHE INTERNAL "" + ) + else() + set(OPENSSL_INCLUDE_DIR "${CMAKE_BINARY_DIR}/../openssl/x86/include" CACHE INTERNAL "") + set(OPENSSL_LIBRARIES + "${CMAKE_BINARY_DIR}/../openssl/x86/lib/libssl.a" + "${CMAKE_BINARY_DIR}/../openssl/x86/lib/libcrypto.a" + CACHE INTERNAL "" + ) + endif() + set(_SSL_LEAK_SUPPRESS_AVAILABLE ON CACHE INTERNAL "") + else() + if(APPLE) + if(NOT DEFINED OPENSSL_ROOT_DIR) + # Prefer a homebrew version of OpenSSL over the one in /usr/lib + file(GLOB OPENSSL_ROOT_DIR /usr/local/Cellar/openssl/*) + # Prefer the latest (make the latest one first) + list(REVERSE OPENSSL_ROOT_DIR) + endif() + # This should prevent linking against the system provided 0.9.8y + set(_OPENSSL_VERSION "") + endif() + if(UNIX) + find_package(PkgConfig) + pkg_search_module(OPENSSL openssl) + endif() + if(OPENSSL_FOUND) + target_link_libraries(cpprest PRIVATE ${OPENSSL_LDFLAGS}) + else() + find_package(OpenSSL 1.0.0 REQUIRED) + endif() + + INCLUDE(CheckCXXSourceCompiles) + set(CMAKE_REQUIRED_INCLUDES "${OPENSSL_INCLUDE_DIR}") + set(CMAKE_REQUIRED_LIBRARIES "${OPENSSL_LIBRARIES}") + CHECK_CXX_SOURCE_COMPILES(" + #include + int main() + { + ::SSL_COMP_free_compression_methods(); + } + " _SSL_LEAK_SUPPRESS_AVAILABLE) + endif() + + add_library(cpprestsdk_openssl_internal INTERFACE) + if(TARGET OpenSSL::SSL) + target_link_libraries(cpprestsdk_openssl_internal INTERFACE OpenSSL::SSL) + else() + target_link_libraries(cpprestsdk_openssl_internal INTERFACE "$") + target_include_directories(cpprestsdk_openssl_internal INTERFACE "$") + endif() + + if (NOT _SSL_LEAK_SUPPRESS_AVAILABLE) + # libressl doesn't ship with the cleanup method being used in ws_client_wspp + target_compile_definitions(cpprestsdk_openssl_internal INTERFACE -DCPPREST_NO_SSL_LEAK_SUPPRESS) + endif() +endfunction() diff --git a/include/signalrclient/signalr_client_config.h b/include/signalrclient/signalr_client_config.h index 5337bb90..14c834a5 100644 --- a/include/signalrclient/signalr_client_config.h +++ b/include/signalrclient/signalr_client_config.h @@ -4,13 +4,13 @@ #pragma once -#ifdef USE_CPPRESTSDK +// #ifdef USE_CPPRESTSDK #pragma warning (push) #pragma warning (disable : 5204 4355 4625 4626 4868) #include #include #pragma warning (pop) -#endif +// #endif #include "_exports.h" #include @@ -21,7 +21,7 @@ namespace signalr class signalr_client_config { public: -#ifdef USE_CPPRESTSDK +// #ifdef USE_CPPRESTSDK SIGNALRCLIENT_API void __cdecl set_proxy(const web::web_proxy &proxy); // Please note that setting credentials does not work in all cases. // For example, Basic Authentication fails under Win32. @@ -34,17 +34,17 @@ namespace signalr SIGNALRCLIENT_API web::websockets::client::websocket_client_config __cdecl get_websocket_client_config() const noexcept; SIGNALRCLIENT_API void __cdecl set_websocket_client_config(const web::websockets::client::websocket_client_config& websocket_client_config); -#endif +// #endif SIGNALRCLIENT_API const std::map& __cdecl get_http_headers() const noexcept; SIGNALRCLIENT_API std::map& __cdecl get_http_headers() noexcept; SIGNALRCLIENT_API void __cdecl set_http_headers(const std::map& http_headers); private: -#ifdef USE_CPPRESTSDK +// #ifdef USE_CPPRESTSDK web::http::client::http_client_config m_http_client_config; web::websockets::client::websocket_client_config m_websocket_client_config; -#endif +// #endif std::map m_http_headers; }; } diff --git a/samples/HubConnectionSample/CMakeLists.txt b/samples/HubConnectionSample/CMakeLists.txt index b75653de..cf58c712 100644 --- a/samples/HubConnectionSample/CMakeLists.txt +++ b/samples/HubConnectionSample/CMakeLists.txt @@ -3,8 +3,33 @@ set (SOURCES ) include_directories( - ../../include/signalrclient) + ../../include/signalrclient + ../../third_party_code/cpprestsdk + ../../third_party_code/jsoncpp + ${CPPREST_INCLUDE_DIR} +) + +link_directories( + ${CPPREST_LIBRARY_DIR} +) add_executable (HubConnectionSample ${SOURCES}) +target_link_libraries(HubConnectionSample + ${CPPREST_LIB} + OpenSSL::SSL + OpenSSL::Crypto + Boost::boost + Boost::system + Boost::chrono + Boost::thread +) +message(${EXTRA_FLAGS}) + +# add_library(signalrclient_static STATIC IMPORTED) +# set_property(TARGET signalrclient_static PROPERTY IMPORTED_LOCATION +# "/home/anyconnect/projects/signalr/build.debug/bin/libsignalrclient.a" +# ) +# target_link_libraries(HubConnectionSample signalrclient_static) + target_link_libraries(HubConnectionSample signalrclient) diff --git a/src/signalrclient/CMakeLists.txt b/src/signalrclient/CMakeLists.txt index de8b7a54..63b331d3 100644 --- a/src/signalrclient/CMakeLists.txt +++ b/src/signalrclient/CMakeLists.txt @@ -29,7 +29,7 @@ include_directories( ../../third_party_code/cpprestsdk ../../third_party_code/jsoncpp) -add_library (signalrclient SHARED ${SOURCES}) +add_library (signalrclient STATIC ${SOURCES}) if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC") if(WERROR) @@ -68,7 +68,12 @@ endif() if(NOT USE_CPPRESTSDK) target_link_libraries(signalrclient) else() - if(APPLE) + if(IOS) + target_link_libraries(signalrclient + PUBLIC ${CPPREST_LIB} + PRIVATE cpprestsdk_boost_internal cpprestsdk_openssl_internal + ) + elseif(APPLE) target_link_libraries(signalrclient PUBLIC ${CPPREST_LIB} PRIVATE OpenSSL::SSL Boost::boost Boost::system Boost::chrono Boost::thread @@ -91,4 +96,4 @@ install(TARGETS signalrclient RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} -) \ No newline at end of file +) diff --git a/src/signalrclient/signalr_client_config.cpp b/src/signalrclient/signalr_client_config.cpp index 1e2c219a..dd1bfe27 100644 --- a/src/signalrclient/signalr_client_config.cpp +++ b/src/signalrclient/signalr_client_config.cpp @@ -7,7 +7,7 @@ namespace signalr { -#ifdef USE_CPPRESTSDK +// #ifdef USE_CPPRESTSDK void signalr_client_config::set_proxy(const web::web_proxy &proxy) { m_http_client_config.set_proxy(proxy); @@ -39,7 +39,7 @@ namespace signalr { m_websocket_client_config = websocket_client_config; } -#endif +// #endif const std::map& signalr_client_config::get_http_headers() const noexcept {