diff --git a/CMakeLists.txt b/CMakeLists.txt index e9b58ae296b8575332f7cc888d6f761b98ce8dbd..6f7b90a54157877037e442999541b4e324f7d59c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -14,6 +14,7 @@ set(PROJECT_LABEL "libjami") option(JAMI_NATPMP "Build with NAT-PMP" ON) option(JAMI_PUPNP "Build with PUPNP" ON) option(JAMI_PLUGIN "Build with plugin support" ON) +option(JAMI_NODEJS "Build the NODEJS binding" OFF) option(JAMI_JNI "Build the JNI binding" OFF) option(JAMI_DBUS "Build the DBUS binding" OFF) option(JAMI_VIDEO "Build with video support" ON) @@ -36,6 +37,11 @@ endif() include(CTest) +if(JAMI_NODEJS) + # Required for nodejs binding + set(CMAKE_POSITION_INDEPENDENT_CODE ON) +endif() + if(NOT MSVC) ################################################################################ # Contrib @@ -623,6 +629,72 @@ else() install (TARGETS ${PROJECT_NAME}) + if (JAMI_NODEJS) + # Build nodejs binding + include (UseSWIG) + find_package(SWIG 4.2 COMPONENTS javascript REQUIRED) + file(GLOB NODEJS_INTERFACE_FILES ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/*.i) + add_custom_command( + OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/jami_wrapper.cpp + COMMAND ${SWIG_EXECUTABLE} -v -c++ -javascript -node -o jami_wrapper.cpp nodejs_interface.i + DEPENDS + ${NODEJS_INTERFACE_FILES} + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs + ) + + # Generate binding.gyp + # We need to pass the link flags to node-gyp + set(_gyp_flags "") + get_target_property(_linked_libs ${PROJECT_NAME} LINK_LIBRARIES) + foreach(LIB IN LISTS _linked_libs) + if ("${LIB}" MATCHES "^PkgConfig::") + string(REPLACE "PkgConfig::" "" PKG_NAME ${LIB}) + string(APPEND _gyp_flags " ${${PKG_NAME}_LDFLAGS}") + elseif ("${LIB}" MATCHES ".so$") + get_filename_component(LIB_DIRECTORY ${LIB} DIRECTORY) + get_filename_component(LIB_NAME_WE ${LIB} NAME_WE) + string(REPLACE "lib" "" LIB_NAME_WE ${LIB_NAME_WE}) + string(APPEND _gyp_flags " -L${LIB_DIRECTORY} -l${LIB_NAME_WE}") + elseif (TARGET ${LIB}) + # TODO generate cmake targets automatically + #string(APPEND _gyp_flags " $<TARGET_FILE:${LIB}>") + else() + string(APPEND _gyp_flags " -l${LIB}") + endif() + endforeach() + + list(REVERSE _gyp_flags) + list(REMOVE_DUPLICATES _gyp_flags) + list(REVERSE _gyp_flags) + + foreach(item ${_gyp_flags}) + if (NOT "${QUOTED_JSON_LIST}" STREQUAL "") + set(QUOTED_JSON_LIST "${QUOTED_JSON_LIST},") + endif() + set(QUOTED_JSON_LIST "${QUOTED_JSON_LIST}\"${item}\"") + endforeach() + string(REPLACE ";" "," _gyp_flags_str ${QUOTED_JSON_LIST}) + + set(JAMI_LINK_LIBRARIES ${_gyp_flags_str}) + set(JAMI_LINK_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}) + configure_file( + ${CMAKE_SOURCE_DIR}/bin/nodejs/binding.gyp.in + ${CMAKE_SOURCE_DIR}/bin/nodejs/binding.gyp + ) + + # Build nodejs binding + add_custom_target(jamid + ALL + COMMAND node-gyp rebuild --target=v18.19.1 --arch=x64 + DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/binding.gyp + ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/callback.h + ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs/jami_wrapper.cpp + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin/nodejs + ) + add_dependencies(jamid ${PROJECT_NAME}) + endif() + if (JAMI_JNI) # Build jni binding add_library(${PROJECT_NAME}-jni SHARED ${CMAKE_CURRENT_SOURCE_DIR}/bin/jni/jami_wrapper.cpp) diff --git a/Dockerfile b/Dockerfile index 24dfa9cd5713eeac55f33b71595b53c1c82921c2..60986c057cfd944d9df7b2f30c6fad53e1ac0f69 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM ubuntu:22.04 AS jami-daemon ARG DEBIAN_FRONTEND=noninteractive -ARG config_args +ARG cmake_args RUN apt-get update && apt-get install -y \ autoconf \ automake \ @@ -45,14 +45,16 @@ RUN apt-get update && apt-get install -y \ guile-3.0-dev \ nasm \ pkg-config \ - yasm + yasm \ + libcppunit-dev \ + sip-tester # Install Node -RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - && \ +RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - && \ apt-get install -y nodejs && \ npm install -g node-gyp -# Install latest Swig (4.1) +# Install latest Swig (4.2) WORKDIR /swig RUN git clone https://github.com/swig/swig.git && \ cd swig && \ @@ -62,17 +64,11 @@ RUN git clone https://github.com/swig/swig.git && \ make install WORKDIR /daemon -COPY contrib/ contrib/ - -# Build daemon dependencies -RUN mkdir -p contrib/native && \ - cd contrib/native && \ - ../bootstrap && \ - make -j$(nproc) COPY . . # Build the daemon -RUN ./autogen.sh && \ - ./configure $config_args && \ +RUN mkdir -p build && \ + cd build && \ + cmake .. $cmake_args && \ make -j$(nproc) diff --git a/README.md b/README.md index 1e931393efe1b28ffbea76e26527e95869c95f57..b6f1fe4d5aa58036c324607968773171e1511ebc 100644 --- a/README.md +++ b/README.md @@ -198,7 +198,7 @@ docker build --tag jami-daemon . # To build with custom build args ```bash -docker build --tag jami-daemon --build-arg config_args="--with-nodejs" . +docker build --tag jami-daemon --build-arg cmake_args="-DJAMI_NODEJS=On" . ``` Common Issues diff --git a/bin/nodejs/.gitignore b/bin/nodejs/.gitignore index e83f9a84346328c49f9259cc55150a298c9ee758..2a02fa22ddbc7837dbe81679e0b4f2eb172395d5 100644 --- a/bin/nodejs/.gitignore +++ b/bin/nodejs/.gitignore @@ -1,2 +1,3 @@ jami_wrapper.cpp +binding.gyp build/ \ No newline at end of file diff --git a/bin/nodejs/binding.gyp b/bin/nodejs/binding.gyp.in similarity index 53% rename from bin/nodejs/binding.gyp rename to bin/nodejs/binding.gyp.in index 7e2f7d87b48d32c324758d90d044ca3ff079085b..23f3b0d1c913aa4ca9faa1975f2bafea4b052c44 100644 --- a/bin/nodejs/binding.gyp +++ b/bin/nodejs/binding.gyp.in @@ -4,10 +4,12 @@ "target_name": "jamid", "sources": [ "jami_wrapper.cpp" ], 'include_dirs': ['../../src/'], - 'libraries': ['-L<(module_root_dir)/../../src/.libs', '-ljami'], + "ldflags": ["-Wl,-Bsymbolic"], + 'libraries': ['-L@JAMI_LINK_DIRECTORIES@', '-ljami-core', '-lyaml-cpp', @JAMI_LINK_LIBRARIES@], 'cflags!': [ '-fno-exceptions' ], 'cflags_cc!': [ '-fno-exceptions', '-fno-rtti', '-std=gnu++1y' ], - 'cflags_cc': [ '-std=gnu++17' ] + 'cflags_cc': [ '-std=gnu++17' ], } - ] + ], + 'variables' : { 'openssl_fips': '' } } \ No newline at end of file