deepstreamIO / deepstream.io-client-cpp

deepstream.io C++ client library

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Fix MacOS build

jdmnd opened this issue · comments

I'm trying to build the client on OS X 10.11.6, using dependencies installed via Homebrew:

brew install openssl poco swig flex doxygen

According to the homebrew openssl package info

This formula is keg-only, which means it was not symlinked into /usr/local.
Apple has deprecated use of OpenSSL in favor of its own TLS and crypto libraries

As a result, openssl is installed into /usr/local/opt/openssl and isn't found by find_package so we set OPENSSL_ROOT_DIR.

$> OPENSSL_ROOT_DIR=/usr/local/opt/openssl/ cmake ..
... (succeeds)
$> make
[  1%] [FLEX][src] Building lexer with Flex 2.5.35
Scanning dependencies of target libdeepstream
[  3%] Building CXX object src/CMakeFiles/libdeepstream.dir/client.cpp.o
[  5%] Building CXX object src/CMakeFiles/libdeepstream.dir/deepstream.cpp.o
[  7%] Building CXX object src/CMakeFiles/libdeepstream.dir/event.cpp.o
[  9%] Building CXX object src/CMakeFiles/libdeepstream.dir/exception.cpp.o
[ 11%] Building CXX object src/CMakeFiles/libdeepstream.dir/impl.cpp.o
[ 13%] Building CXX object src/CMakeFiles/libdeepstream.dir/message.cpp.o
[ 15%] Building CXX object src/CMakeFiles/libdeepstream.dir/message_builder.cpp.o
[ 17%] Building CXX object src/CMakeFiles/libdeepstream.dir/message_proxy.cpp.o
[ 19%] Building CXX object src/CMakeFiles/libdeepstream.dir/parser.cpp.o
[ 21%] Building CXX object src/CMakeFiles/libdeepstream.dir/presence.cpp.o
[ 23%] Building CXX object src/CMakeFiles/libdeepstream.dir/random.cpp.o
[ 25%] Building CXX object src/CMakeFiles/libdeepstream.dir/websockets.cpp.o
[ 27%] Building CXX object src/CMakeFiles/libdeepstream.dir/websockets/poco.cpp.o
In file included from /Users/dmnd/ds/git/deepstream.io-client-cpp/src/websockets/poco.cpp:23:
In file included from /usr/local/include/Poco/Net/AcceptCertificateHandler.h:24:
In file included from /usr/local/include/Poco/Net/InvalidCertificateHandler.h:24:
In file included from /usr/local/include/Poco/Net/VerificationErrorArgs.h:24:
In file included from /usr/local/include/Poco/Net/X509Certificate.h:25:
In file included from /usr/local/include/Poco/Crypto/X509Certificate.h:24:
/usr/local/include/Poco/Crypto/OpenSSLInitializer.h:26:10: fatal error: 'openssl/crypto.h' file not found
#include <openssl/crypto.h>
         ^
1 error generated.
make[2]: *** [src/CMakeFiles/libdeepstream.dir/websockets/poco.cpp.o] Error 1
make[1]: *** [src/CMakeFiles/libdeepstream.dir/all] Error 2
make: *** [all] Error 2

This appears to be the proper openSSL includes so I added the following lines to src/CMakeLists.txt:

 find_package(OpenSSL REQUIRED)
+include_directories(/usr/local/opt/openssl/include/)
+link_directories(/usr/local/opt/openssl/lib/)

Now more errors...

$> make VERBOSE=1
/usr/local/Cellar/cmake/3.7.2/bin/cmake -H/Users/dmnd/ds/git/deepstream.io-client-cpp -B/Users/dmnd/ds/git/deepstream.io-client-cpp/build --check-build-system CMakeFiles/Makefile.cmake 0
Re-run cmake file: Makefile older than: ../src/CMakeLists.txt
-- using ccache
-- Boost version: 1.63.0
-- Found the following Boost libraries:
--   unit_test_framework
-- CMAKE_SYSTEM=Darwin-15.6.0
-- CMAKE_SYSTEM_NAME=Darwin
-- CMAKE_SYSTEM_PROCESSOR=x86_64
-- CMAKE_GENERATOR=Unix Makefiles
-- CMAKE_BUILD_TYPE=
-- CMAKE_C_COMPILER=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc
-- CMAKE_CXX_COMPILER=/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++
-- BUILD_TESTING=ON
-- BUILD_COVERAGE=
-- BUILD_POCO=
-- Poco_LIBRARIES=
-- Configuring done
CMake Warning (dev):
  Policy CMP0042 is not set: MACOSX_RPATH is enabled by default.  Run "cmake
  --help-policy CMP0042" for policy details.  Use the cmake_policy command to
  set the policy and suppress this warning.

  MACOSX_RPATH is not specified for the following targets:

   libdeepstream

This warning is for project developers.  Use -Wno-dev to suppress it.

-- Generating done
-- Build files have been written to: /Users/dmnd/ds/git/deepstream.io-client-cpp/build
/usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_progress_start /Users/dmnd/ds/git/deepstream.io-client-cpp/build/CMakeFiles /Users/dmnd/ds/git/deepstream.io-client-cpp/build/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f src/CMakeFiles/libdeepstream.dir/build.make src/CMakeFiles/libdeepstream.dir/depend
cd /Users/dmnd/ds/git/deepstream.io-client-cpp/build && /usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_depends "Unix Makefiles" /Users/dmnd/ds/git/deepstream.io-client-cpp /Users/dmnd/ds/git/deepstream.io-client-cpp/src /Users/dmnd/ds/git/deepstream.io-client-cpp/build /Users/dmnd/ds/git/deepstream.io-client-cpp/build/src /Users/dmnd/ds/git/deepstream.io-client-cpp/build/src/CMakeFiles/libdeepstream.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f src/CMakeFiles/libdeepstream.dir/build.make src/CMakeFiles/libdeepstream.dir/build
[  1%] Linking CXX shared library ../lib/libdeepstream.dylib
cd /Users/dmnd/ds/git/deepstream.io-client-cpp/build/src && /usr/local/Cellar/cmake/3.7.2/bin/cmake -E cmake_link_script CMakeFiles/libdeepstream.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++   -std=c++11 -Wextra -Wall -pedantic -dynamiclib -Wl,-headerpad_max_install_names  -o ../lib/libdeepstream.dylib -install_name /Users/dmnd/ds/git/deepstream.io-client-cpp/build/lib/libdeepstream.dylib CMakeFiles/libdeepstream.dir/client.cpp.o CMakeFiles/libdeepstream.dir/deepstream.cpp.o CMakeFiles/libdeepstream.dir/event.cpp.o CMakeFiles/libdeepstream.dir/exception.cpp.o CMakeFiles/libdeepstream.dir/impl.cpp.o CMakeFiles/libdeepstream.dir/message.cpp.o CMakeFiles/libdeepstream.dir/message_builder.cpp.o CMakeFiles/libdeepstream.dir/message_proxy.cpp.o CMakeFiles/libdeepstream.dir/parser.cpp.o CMakeFiles/libdeepstream.dir/presence.cpp.o CMakeFiles/libdeepstream.dir/random.cpp.o CMakeFiles/libdeepstream.dir/websockets.cpp.o CMakeFiles/libdeepstream.dir/websockets/poco.cpp.o CMakeFiles/libdeepstream.dir/websockets/pseudo.cpp.o CMakeFiles/libdeepstream.dir/lexer.c.o  -L/usr/local/opt/openssl/lib -Wl,-rpath,/usr/local/opt/openssl/lib /usr/local/opt/openssl/lib/libssl.dylib /usr/local/opt/openssl/lib/libcrypto.dylib
Undefined symbols for architecture x86_64:
  "Poco::AtomicCounter::AtomicCounter(int)", referenced from:
      Poco::ReferenceCounter::ReferenceCounter() in poco.cpp.o
  "Poco::AtomicCounter::~AtomicCounter()", referenced from:
      Poco::ReferenceCounter::~ReferenceCounter() in poco.cpp.o
  "Poco::Net::SSLManager::initializeClient(Poco::SharedPtr<Poco::Net::PrivateKeyPassphraseHandler, Poco::ReferenceCounter, Poco::ReleasePolicy<Poco::Net::PrivateKeyPassphraseHandler> >, Poco::SharedPtr<Poco::Net::InvalidCertificateHandler, Poco::ReferenceCounter, Poco::ReleasePolicy<Poco::Net::InvalidCertificateHandler> >, Poco::AutoPtr<Poco::Net::Context>)", referenced from:
      deepstream::websockets::poco::SSLManager::SSLManager() in poco.cpp.o
  "Poco::Net::SSLManager::instance()", referenced from: 
...

Seems like there's something I'm forgetting to link against. Any ideas @frobware?

OK I managed to make it work with the following

cmake .. -DOPENSSL_ROOT_DIR=/usr/local/opt/openssl/ -DPoco_LIBRARIES='/usr/local/opt/poco/lib/libPocoFoundation.dylib;/usr/local/opt/poco/lib/libPocoCrypto.dylib;/usr/local/opt/poco/lib/libPocoNet.dylib;/usr/local/opt/poco/lib/libPocoNetSSL.dylib'

Not really sure how to change CMakeLists to work this out on its own

@frobware any insight?