Skip to content
Snippets Groups Projects
Commit b18d8818 authored by Alexandre Eberhardt's avatar Alexandre Eberhardt Committed by Adrien Béraud
Browse files

Build: clean CMakeList for Linux, Android and MacOS AutoAnswer

Change-Id: I7f483576273cce1141236cf528cee146f58d1431
parent ac7e3e7d
Branches
No related tags found
No related merge requests found
# Copyright (C) 2023-2024 Savoir-faire Linux Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
cmake_minimum_required (VERSION 3.10)
# set the project name
# Set the project name and version
set (ProjectName AutoAnswer)
set (Version 2.0.0)
project (${ProjectName} VERSION ${Version})
# Detect OS and architecture
if(NOT CMAKE_SIZEOF_VOID_P EQUAL 8)
message(FATAL_ERROR "Unsupported architecture. Only x64 or aarch64 (arm64) is supported.")
# Set default options
option (DEBUG "Build in debug mode" OFF)
# Set platform to build for
set (PLATFORM_TYPE $ENV{PLATFORM_TYPE}) # can be LINUX or ANDROID
if (PLATFORM_TYPE STREQUAL "ANDROID")
set (PLATFORM $ENV{ANDROID_ABI}) # can be arm64-v8a, armeabi-v7a or x86_64
elseif(PLATFORM_TYPE STREQUAL "LINUX")
set (PLATFORM x86_64-linux-gnu) # can be x86_64-linux-gnu
elseif(PLATFORM_TYPE STREQUAL "APPLE")
execute_process(
COMMAND sh -c "$(command -v cc || command -v gcc) -dumpmachine" # used to create the directory for daemon contribution, see daemon/contrib/bootstrap
OUTPUT_VARIABLE DUMP_MACHINE_RESULT
OUTPUT_STRIP_TRAILING_WHITESPACE
)
set (PLATFORM ${DUMP_MACHINE_RESULT})
execute_process(
COMMAND sh -c "uname -m"
OUTPUT_VARIABLE ARCH
OUTPUT_STRIP_TRAILING_WHITESPACE # remove the trailing "\n"
)
set (PLATFORM_LIB_DIR "${ARCH}-apple-darwin")
else()
set (ARCH $CMAKE_SYSTEM_PROCESSOR)
message(FATAL_ERROR "Platform type not supported for now")
endif ()
if(WIN32)
set(DISTRIBUTION "x64-windows")
elseif(APPLE)
set(DISTRIBUTION "${ARCH}-apple-darwin")
elseif(ANDROID)
set(DISTRIBUTION "android")
set(CMAKE_ANDROID_ARCH_ABI ${PLATFORM})
# set compilation flags based on platform
if (PLATFORM STREQUAL "x86_64-linux-gnu")
set (CONTRIB_PLATFORM x86_64-linux-gnu)
set (distribution x86_64-linux-gnu)
elseif (PLATFORM STREQUAL "arm64-v8a")
set (CONTRIB_PLATFORM aarch64-linux-android)
set (distribution android)
elseif (PLATFORM STREQUAL "armeabi-v7a")
set (CONTRIB_PLATFORM arm-linux-androideabi)
set (distribution android)
elseif (PLATFORM STREQUAL "x86_64")
set (CONTRIB_PLATFORM x86_64-linux-android)
set (distribution android)
elseif (PLATFORM STREQUAL "x86_64-apple-darwin23.6.0")
set (CONTRIB_PLATFORM x86_64-apple-darwin23.6.0)
set (distribution x86_64-apple-darwin23.6.0)
else()
set(DISTRIBUTION "x86_64-linux-gnu")
set (CONTRIB_PLATFORM ${PLATFORM})
set (dsitribution ${PLATFORM})
endif ()
# Paths setup
set (JAMI_PLUGINS_PATH ${PROJECT_SOURCE_DIR}/.. )
set (DAEMON ${JAMI_PLUGINS_PATH}/daemon)
set (DAEMON_SRC ${DAEMON}/src)
set (CONTRIB_PATH ${DAEMON}/contrib)
set (PLUGINS_LIB ${JAMI_PLUGINS_PATH}/lib)
set (JPL_DIRECTORY ${PROJECT_BINARY_DIR}/jpl)
set (JPL_FILE_NAME ${ProjectName}.jpl)
set (SDK_PATH ${JAMI_PLUGINS_PATH}/SDK)
set (PLUGIN_OUTPUT_DIR ${JPL_DIRECTORY}/lib/${DISTRIBUTION})
message(Distribution:\ ${DISTRIBUTION})
message(Building:\ ${ProjectName} ${Version})
message(Build\ path:\ ${PROJECT_BINARY_DIR})
message(JPL\ assembling\ path:\ ${JPL_DIRECTORY})
message(JPL\ path:\ ${JAMI_PLUGINS_PATH}/build/${DISTRIBUTION}/${JPL_FILE_NAME})
if (PLATFORM_TYPE STREQUAL "ANDROID")
# should be removed and use the toolchain in env instead
set(CMAKE_ANDROID_ARCH_ABI ${PLATFORM}) # Set the desired ABI
set(CMAKE_ANDROID_STL_TYPE c++_shared) # Use C++ shared library
set(CMAKE_ANDROID_NDK_TOOLCHAIN_FILE /opt/android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake)
set(CMAKE_TOOLCHAIN_FILE=/opt/android/ndk/26.3.11579264/build/cmake/android.toolchain.cmake)
set(CMAKE_C_COMPILER /opt/android/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/${CONTRIB_PLATFORM}30-clang)
set(CMAKE_CXX_COMPILER /opt/android/ndk/26.3.11579264/toolchains/llvm/prebuilt/linux-x86_64/bin/${CONTRIB_PLATFORM}30-clang++)
endif()
message ("PLATFORM_TYPE: ${PLATFORM_TYPE}")
message ("PLATFORM: ${PLATFORM}")
message ("CONTRIB_PLATFORM: ${CONTRIB_PLATFORM}")
message ("distribution: ${distribution}")
# Set variables
set (CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /DMSGPACK_NO_BOOST /MT")
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /DMSGPACK_NO_BOOST /MTd")
set (DAEMON ${PROJECT_SOURCE_DIR}/../daemon)
set (CONTRIB_PATH ${DAEMON}/contrib)
set (PLUGINS_LIB ${PROJECT_SOURCE_DIR}/../lib)
set (CONTRIB_ROOT_PATH ${CONTRIB_PATH}/${CONTRIB_PLATFORM})
set (CMAKE_BUILD_RPATH "$ORIGIN")
set (SDK_PATH ${PROJECT_SOURCE_DIR}/../SDK)
set (CMAKE_POSITION_INDEPENDENT_CODE ON)
# Set platform specific variables
if (PLATFORM_TYPE STREQUAL "ANDROID")
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")
elseif (PLATFORM_TYPE STREQUAL "LINUX")
set (CMAKE_SHARED_LINKER_FLAGS "-Wl,-Bsymbolic")
elseif(PLATFORM_TYPE STREQUAL "APPLE")
set (CMAKE_SHARED_LINKER_FLAGS "-Wl")
endif ()
list (APPEND CMAKE_FIND_ROOT_PATH ${CONTRIB_ROOT_PATH})
set (CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH)
list (APPEND CMAKE_PREFIX_PATH ${CONTRIB_ROOT_PATH})
add_definitions (-DMSGPACK_NO_BOOST)
if (DEBUG)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -fsanitize=address -Wall -Wextra -Wno-unused-parameter")
add_definitions (-D__DEBUG__)
else ()
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -Wall -Wextra -Wno-unused-parameter")
endif ()
if(PLATEFORM_TYPE STREQUAL "APPLE")
find_library (COREFOUNDATION CoreFoundation)
find_library (COREMEDIA CoreMedia)
find_library (COREVIDEO CoreVideo)
find_library (CORESERVICES CoreServices)
find_library (FOUNDATION Foundation)
find_library (AVFOUNDATION AVFoundation)
find_library (COREGRAPHICS CoreGraphics)
set (MACOS_LIBS
${COREFOUNDATION}
${COREMEDIA}
${COREVIDEO}
${CORESERVICES}
${FOUNDATION}
${AVFOUNDATION}
${COREGRAPHICS}
)
endif()
# Source files
set (plugin_SRC
main.cpp
BotChatHandler.cpp
BotPeerChatSubscriber.cpp
PluginPreferenceHandler.cpp
${PLUGINS_LIB}/frameUtils.cpp
${PLUGINS_LIB}/frameFilter.cpp
)
set(plugin_HDR
BotChatHandler.h
BotPeerChatSubscriber.h
PluginPreferenceHandler.h
${PLUGINS_LIB}/frameUtils.h
${PLUGINS_LIB}/pluglog.h
${PLUGINS_LIB}/frameFilter.h
)
# Create shared library
add_library(${ProjectName} SHARED ${plugin_SRC} ${plugin_HDR})
find_package(Python3 3.6 REQUIRED COMPONENTS Interpreter)
add_library (${ProjectName} SHARED ${plugin_SRC})
# Include directories
target_include_directories (${ProjectName} PUBLIC
${PROJECT_BINARY_DIR}
${PROJECT_SOURCE_DIR}
${DAEMON}/src
${CONTRIB_PATH}/${CONTRIB_PLATFORM}/include
${PLUGINS_LIB}
${DAEMON_SRC}
${CONTRIB_PATH}
${CONTRIB_PATH}/build/fmt/include
${CONTRIB_PATH}/build/opendht/include
${CONTRIB_PATH}/build/msgpack-c/include
)
# Link directories and libraries
target_link_directories(${ProjectName} PUBLIC
${CONTRIB_PATH}
${CONTRIB_PATH}/build/fmt/msvc/Release
# Link directories
link_directories (
${CONTRIB_PATH}/${CONTRIB_PLATFORM}/lib
)
target_link_libraries(${ProjectName} PUBLIC )
# Link libraries to the target
target_link_libraries (${ProjectName} PUBLIC ${MACOS_LIBS} ${LINK_LIBS}) # if the platform is not APPLE, MACOS_LIBS will be empty and will not affect the build
# Android-specific flags
if(ANDROID)
set(CMAKE_ANDROID_ARCH_ABI arm64-v8a) # Set the desired ABI
set(CMAKE_ANDROID_STL_TYPE c++_shared) # Use C++ shared library
set(CMAKE_ANDROID_NDK_TOOLCHAIN_FILE ${CONTRIB_PATH}/build/cmake/android.toolchain.cmake)
set(CMAKE_ANDROID_STL_INCLUDE_DIR ${CONTRIB_PATH}/sysroot/usr/include)
set(CMAKE_ANDROID_STL_LIBRARIES ${CONTRIB_PATH}/sysroot/usr/lib)
endif()
if(CMAKE_CXX_FLAGS_DEBUG)
set(OUTPUT "${ProjectName}")
set(CLANG_OPTS "-g -fsanitize=address")
set(EXTRA_DEBUG_LIBRARIES "-lyaml-cpp")
set(EXTRA_DEFINES "-D__DEBUG__")
if(PLATFORM_TYPE STREQUAL "APPLE")
set_target_properties (${ProjectName} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/jpl/lib/${PLATFORM_LIB_DIR}"
)
else ()
add_custom_command(
TARGET ${ProjectName}
PRE_BUILD
COMMAND ${Python3_EXECUTABLE} ${SDK_PATH}/jplManipulation.py --preassemble --plugin=${ProjectName}
COMMENT "Assembling Plugin files"
set_target_properties (${ProjectName} PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${PROJECT_BINARY_DIR}/jpl/lib/${PLATFORM}"
)
endif ()
add_custom_command (
TARGET ${ProjectName}
PRE_BUILD
COMMAND ${Python3_EXECUTABLE} ${SDK_PATH}/jplManipulation.py --preassemble --plugin=${ProjectName}
COMMAND ${Python3_EXECUTABLE} ${SDK_PATH}/jplManipulation.py --preassemble --plugin=${ProjectName} --distribution=${distribution} --arch=${ARCH}
COMMENT "Assembling Plugin files"
)
# Copy shared library to jpl directory
add_custom_command(
TARGET ${ProjectName}
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${ProjectName}> ${PLUGIN_OUTPUT_DIR}
COMMENT "Copying output file to jpl directory"
)
add_custom_command (
TARGET ${ProjectName}
POST_BUILD
COMMAND ${Python3_EXECUTABLE} ${SDK_PATH}/jplManipulation.py --assemble --plugin=${ProjectName}
COMMAND ${Python3_EXECUTABLE} ${SDK_PATH}/jplManipulation.py --assemble --plugin=${ProjectName} --distribution=${distribution}
COMMENT "Generating JPL archive"
)
\ No newline at end of file
# To build AutoAnswer, follow these steps:
## Go to the AutoAnswer folder and create a build directory:
build the folowing daemon contributions :
- fmt
- opendht
```
mkdir build-local
cd build-local
## from jami-plugins/ run:
### Linux:
```bash
PLATFORM_TYPE="LINUX" python3 build-plugin.py --projects='AutoAnswer'
```
## Run the following commands to build the project:
### Android:
```bash
PLATFORM_TYPE="ANDROID" ANDROID_ABI="{Android ABI}" python3 build-plugin.py --projects='AutoAnswer'
```
cmake ..
cmake --build .
### MacOS
```bash
PLATFORM_TYPE="MACOS" python3 build-plugin.py --projects='AutoAnswer'
```
## Once the build is complete, you will find your unsigned `AutoAnswer.jpl` in:
```
jami-plugins/build/<your distribution>/
jami-plugins/build/{your distribution}/
```
## To install it on Jami, you need to sign the plugin. Refer to `sign.md` in the `jami-plugins/` directory for instructions on how to sign your plugin.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment