1# 2# Copyright (c) Huawei Technologies Co., Ltd. 2019-2020. All rights reserved. 3# Description: This script contains builds shared libraries for the engine 4# Author: Jani Kattelus 5# Create: 2020-01-28 6# 7# NOTE: this will not currently work standalone, since it fetches the library names from targets. could be fixed easily if needed. 8# also the names and dll options are kind of arbitrary at the moment. 9# also the resulting targets from here are referenced by the sample apps also. 10cmake_minimum_required(VERSION 3.18) 11project(AGPDLL) 12 13#this include file should actually come from engine. (usually one directory up from current dir) 14set(CORE_ROOT_DIRECTORY ".." CACHE PATH "Path engine sdk root dir") 15if (NOT EXISTS "${CORE_ROOT_DIRECTORY}/cmake/cmake_tools.cmake") 16 message(FATAL_ERROR "Engine core root directory not found") 17endif() 18 19list(APPEND CMAKE_MODULE_PATH "${CORE_ROOT_DIRECTORY}/cmake") 20 21if (NOT TARGET AGPBase::AGPBaseAPI) 22 find_package(AGPBaseAPI REQUIRED) 23endif() 24if (NOT TARGET AGPEngine::AGPEngineAPI) 25 find_package(AGPEngineAPI REQUIRED) 26endif() 27if (NOT TARGET AGPEngine::AGPEngine) 28 find_package(AGPEngine REQUIRED) 29endif() 30 31#1. generation of public symbol lists for def / linkerscripts. 32#2. "conversion" of libs to dll/so. 33 34#construct exports*.def with dumpsyms.bat (or shell script) 35#construct agpengine.version with dumpelf.bat (or shell script) 36#or build the GenerateDefines* targets. (which use cmake) (these targets are excluded from all, since they are supposed to be built manually when needed) 37add_custom_target(GenerateAllDefines COMMAND echo "Generated all defs / linker scripts.") 38set_target_properties(GenerateAllDefines PROPERTIES FOLDER Tools) 39#NOTE: we are explicitly setting the EXCLUDE_FROM_ALL and EXCLUDE_FROM_DEFAULT_BUILD (vsonly) properties to all generatedefine targets 40#since we do not want it to be built automatically. (custom targets should be automatically excluded, but in this case only the master target was correctly excluded.) 41set_target_properties(GenerateAllDefines PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 42 43if (${CMAKE_SIZEOF_VOID_P} EQUAL "4") 44 set(CORE_BITS 32) 45elseif (${CMAKE_SIZEOF_VOID_P} EQUAL "8") 46 set(CORE_BITS 64) 47endif() 48if(WIN32) 49 set(CORE_SYM_EXT _${CORE_BITS}.def) 50elseif(UNIX) 51 set(CORE_SYM_EXT _${CORE_BITS}.ld) 52elseif(OHOS) 53 set(CORE_SYM_EXT _${CORE_BITS}.ld) 54endif() 55 56add_custom_target(GenerateDefinesEngine 57 COMMAND ${CMAKE_COMMAND} 58 -DCMAKE_SYSTEM_NAME=${CMAKE_SYSTEM_NAME} -DANDROID_TOOLCHAIN_PREFIX=${ANDROID_TOOLCHAIN_PREFIX} -DVERSION_CODE=AGPEngineDLL_1.0 59 -P ${CORE_ROOT_DIRECTORY}/cmake/define.cmake ${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT} $<TARGET_FILE:AGPEngine::AGPEngine>) 60set_target_properties(GenerateDefinesEngine PROPERTIES FOLDER Tools) 61add_dependencies(GenerateAllDefines AGPEngine::AGPEngine GenerateDefinesEngine) 62set_target_properties(GenerateDefinesEngine PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) 63set_source_files_properties(${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT} PROPERTIES GENERATED true ) 64 65set(dll_sources src/exports.cpp) 66 67# collect build type flags.. 68unset(build_flags) 69if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") 70 set(build_flags ${build_flags} "CORE_PUBLIC=__declspec(dllimport)") 71else() 72 set(build_flags ${build_flags} "CORE_PUBLIC=") 73endif() 74 75#Link core engine.dll 76 77add_library(AGPEngineDLL SHARED 78 $<$<PLATFORM_ID:Windows>:${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT}> 79 ${dll_sources} 80) 81 82target_link_libraries(AGPEngineDLL INTERFACE AGPEngine::AGPEngineAPI 83 PRIVATE 84 $<$<PLATFORM_ID:Linux>:-Wl,${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT}> 85 $<$<PLATFORM_ID:Android>:-Wl,${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT}> 86 $<$<PLATFORM_ID:OHOS>:-Wl,${CMAKE_CURRENT_LIST_DIR}/src/agpengine${CORE_SYM_EXT}> 87 $<$<PLATFORM_ID:Darwin>:-Wl,-exported_symbols_list> 88 $<$<PLATFORM_ID:Darwin>:-Wl,${CMAKE_CURRENT_LIST_DIR}/src/agpengine.exports> 89 AGPEngine::AGPEngine 90) 91 92target_compile_definitions(AGPEngineDLL INTERFACE ${build_flags}) 93 94add_library(AGPEngine::AGPEngineDLL ALIAS AGPEngineDLL) 95 96append_link_flags(AGPEngineDLL "${BASE_SO_LINK_FLAGS}") 97 98setup_warnings(AGPEngineDLL) 99 100# Disable RTTI 101disable_rtti(AGPEngineDLL) 102 103# Sanitizers for unit tests 104if(CORE_UNIT_TESTS_ENABLED AND CORE_UNIT_TESTS_WITH_SANITIZERS AND ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") AND NOT ANDROID AND NOT OHOS) 105 target_compile_options(AGPEngineDLL PRIVATE -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fsanitize-recover=address) 106 target_link_options(AGPEngineDLL PRIVATE -fsanitize=address -fsanitize=undefined) 107endif() 108 109set_target_properties(AGPEngineDLL PROPERTIES FOLDER DLLs) 110 111include(CMakePackageConfigHelpers) 112 113configure_package_config_file( 114 "${PROJECT_SOURCE_DIR}/../cmake/AGPEngineDLLConfig.cmake.in" 115 "${PROJECT_BINARY_DIR}/cmake/AGPEngineDLLConfig.cmake" 116 INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/AGPEngineDLL 117) 118 119install( 120 TARGETS AGPEngineDLL 121 EXPORT AGPEngineDLLTargets 122 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/$<CONFIG> 123 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}/$<CONFIG> 124 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}/$<CONFIG> 125 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 126) 127 128install( 129 EXPORT AGPEngineDLLTargets 130 FILE AGPEngineDLLTargets.cmake 131 NAMESPACE AGPEngine:: 132 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/AGPEngineDLL 133) 134 135install(FILES "${PROJECT_BINARY_DIR}/cmake/AGPEngineDLLConfig.cmake" 136 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/AGPEngineDLL 137) 138 139export(EXPORT AGPEngineDLLTargets 140 FILE "${CMAKE_CURRENT_BINARY_DIR}/cmake/AGPEngineDLLTargets.cmake" 141 NAMESPACE AGPEngine:: 142) 143