TeaSpeak-Client/native/CMakeLists.txt
2021-02-07 14:58:59 +01:00

187 lines
5.6 KiB
CMake

cmake_minimum_required(VERSION 3.1)
project(TeaClient-Natives VERSION 1.0.0)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# set(CMAKE_VERBOSE_MAKEFILE ON)
if (CMAKE_INCLUDE_FILE AND NOT CMAKE_INCLUDE_FILE STREQUAL "")
message("Include file ${CMAKE_INCLUDE_FILE}")
include("${CMAKE_INCLUDE_FILE}")
endif ()
if(CMAKE_PLATFORM_INCLUDE AND NOT CMAKE_PLATFORM_INCLUDE STREQUAL "")
message("Include file ${CMAKE_PLATFORM_INCLUDE}")
include("${CMAKE_PLATFORM_INCLUDE}")
endif()
message("Library path: ${LIBRARY_PATH}")
message("Module path: ${CMAKE_MODULE_PATH}")
#Setup NodeJS
function(setup_nodejs)
set(NodeJS_DIR "${CMAKE_CURRENT_SOURCE_DIR}/cmake/")
set(NODEJS_URL "https://atom.io/download/atom-shell")
set(NODEJS_VERSION "v8.0.0")
#set(NODEJS_URL "https://nodejs.org/download/release/")
#set(NODEJS_VERSION "v12.13.0")
find_package(NodeJS REQUIRED)
set(NODEJS_NAN_DIR "node_modules/nan")
nodejs_init()
#Fix nan include headers
set(NAN_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../node_modules/nan")
if(NOT EXISTS "${NAN_INCLUDE_DIR}")
message(FATAL_ERROR "Failed to find nan headers.")
endif()
list(APPEND NODEJS_INCLUDE_DIRS ${NAN_INCLUDE_DIR})
set(EXE_DIRECTORY "${CMAKE_SOURCE_DIR}/build/exe/" PARENT_SCOPE)
if (MSVC)
set(NODE_LIB_DIRECTORY "${CMAKE_SOURCE_DIR}/build/win32_x64/" PARENT_SCOPE)
set(NODE_PDB_DIRECTORY "${CMAKE_SOURCE_DIR}/build/symbols/" PARENT_SCOPE)
else()
set(NODE_LIB_DIRECTORY "${CMAKE_SOURCE_DIR}/build/linux_x64/" PARENT_SCOPE)
endif()
#Set some more variables
set(NODEJS_INCLUDE_DIRS "${NODEJS_INCLUDE_DIRS}" PARENT_SCOPE)
set(NODEJS_INIT ${NODEJS_INIT} PARENT_SCOPE)
include_directories("dist/ext_nan")
function(add_nodejs_module NAME)
message("Registering module ${NAME}")
_add_nodejs_module(${NAME} ${ARGN})
if(MSVC)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17")
else()
target_compile_features(${NAME} PUBLIC cxx_std_17)
endif()
set_target_properties(${NAME}
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${NODE_LIB_DIRECTORY}/"
)
target_include_directories(${NAME} PUBLIC ${NODEJS_INCLUDE_DIRS})
set_target_properties(${NAME} PROPERTIES CXX_STANDARD 17) #Needs to be overridden after _add_nodejs_module sets it to 11
if(MSVC)
add_custom_command(TARGET ${NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "$<TARGET_FILE:${NAME}>" "${NODE_LIB_DIRECTORY}/${NAME}.node"
)
add_custom_command(TARGET ${NAME} POST_BUILD
COMMAND ${CMAKE_COMMAND} -E
copy "$<TARGET_PDB_FILE:${NAME}>" "${NODE_PDB_DIRECTORY}/${NAME}.pdb"
)
else()
set_target_properties(${NAME}
PROPERTIES
LIBRARY_OUTPUT_DIRECTORY "${NODE_LIB_DIRECTORY}/"
)
endif()
endfunction()
#Forward parameters to global scope
set(NODEJS_VERSION ${NODEJS_VERSION} PARENT_SCOPE)
set(NODEJS_SOURCES ${NODEJS_SOURCES} PARENT_SCOPE)
set(NODEJS_INCLUDE_DIRS ${NODEJS_INCLUDE_DIRS} PARENT_SCOPE)
set(NODEJS_LIBRARIES ${NODEJS_LIBRARIES} PARENT_SCOPE)
set(NODEJS_LINK_FLAGS ${NODEJS_LINK_FLAGS} PARENT_SCOPE)
set(NODEJS_DEFINITIONS ${NODEJS_DEFINITIONS} PARENT_SCOPE)
# Prevents this function from executing more than once
set(NODEJS_INIT TRUE PARENT_SCOPE)
endfunction()
#Setup the compiler (Cant be done within a function!)
if (MSVC)
set(CompilerFlags
CMAKE_C_FLAGS_DEBUG
CMAKE_C_FLAGS_MINSIZEREL
CMAKE_C_FLAGS_RELEASE
CMAKE_C_FLAGS_RELWITHDEBINFO
CMAKE_CXX_FLAGS_DEBUG
CMAKE_CXX_FLAGS_MINSIZEREL
CMAKE_CXX_FLAGS_RELEASE
CMAKE_CXX_FLAGS_RELWITHDEBINFO
)
foreach(CompilerFlag ${CompilerFlags})
string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}")
string(REGEX REPLACE "/O\\S+($| )" "/02" ${CompilerFlag} "${${CompilerFlag}}")
endforeach()
#add_compile_options("/MTd")
add_compile_options("/EHsc") #We require exception handling
add_compile_options(/wd4275) # needs to have dll-interface to be used by clients of class
add_compile_options(/wd4251) # needs to have dll-interface to be used by clients of class
else()
#This is a bad thing here!
function(resolve_library VARIABLE FALLBACK PATHS)
set( _PATHS ${PATHS} ${ARGN} ) # Merge them together
foreach(PATH IN ITEMS ${_PATHS})
message(STATUS "Try to use path ${PATH} for ${VARIABLE}")
if(EXISTS ${PATH})
message(STATUS "Setting ${VARIABLE} to ${PATH}")
set(${VARIABLE} ${PATH} PARENT_SCOPE)
return()
endif()
endforeach()
if(FALLBACK)
message(WARNING "Failed to resolve library path for ${VARIABLE}. Using default ${VARIABLE}")
else()
message(FATAL_ERROR "Failed to find requited library. Variable: ${VARIABLE} Paths: ${_PATHS}")
endif()
endfunction()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++17 -static-libgcc -static-libstdc++")
set(CMAKE_SHARED_LIBRARY_CXX_FLAGS "") # Disable -fPIC (We dont want any relonking with build in electron libraries
endif()
setup_nodejs()
if(NOT NODEJS_INCLUDE_DIRS OR NODEJS_INCLUDE_DIRS STREQUAL "")
message(FATAL_ERROR "Failed to find node headers")
else()
message("Including NodeJS headers: ${NODEJS_INCLUDE_DIRS}")
endif()
include_directories(${NODEJS_INCLUDE_DIRS})
add_subdirectory(dist/ext_nan/)
function(build_update_installer)
add_subdirectory(updater)
endfunction()
build_update_installer()
function(build_codec)
add_subdirectory(codec)
endfunction()
#build_codec()
function(build_ppt)
add_subdirectory(ppt)
endfunction()
build_ppt()
function(build_connection)
add_subdirectory(serverconnection)
endfunction()
build_connection()
function(build_crash_handler)
add_subdirectory(crash_handler)
endfunction()
build_crash_handler()
function(build_dns)
add_subdirectory(dns)
endfunction()
build_dns()