204 lines
8.5 KiB
CMake
204 lines
8.5 KiB
CMake
|
cmake_minimum_required(VERSION 2.8)
|
||
|
|
||
|
###################################################################################
|
||
|
project(libgo)
|
||
|
|
||
|
enable_language(C ASM)
|
||
|
|
||
|
if (CMAKE_BUILD_TYPE)
|
||
|
else()
|
||
|
set(CMAKE_BUILD_TYPE RELEASE)
|
||
|
#set(CMAKE_BUILD_TYPE DEBUG)
|
||
|
endif()
|
||
|
|
||
|
message("------------ Options -------------")
|
||
|
message(" CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
|
||
|
message(" CMAKE_COMMAND: ${CMAKE_COMMAND}")
|
||
|
|
||
|
option(ENABLE_DEBUGGER "enable debugger" OFF)
|
||
|
if (ENABLE_DEBUGGER)
|
||
|
set(ENABLE_DEBUGGER 1)
|
||
|
message (" enable_debugger: yes")
|
||
|
else()
|
||
|
set(ENABLE_DEBUGGER 0)
|
||
|
message (" enable_debugger: no")
|
||
|
endif()
|
||
|
|
||
|
option(DISABLE_HOOK "disable hook" OFF)
|
||
|
if (DISABLE_HOOK)
|
||
|
set(ENABLE_HOOK 0)
|
||
|
message (" enable_hook: no")
|
||
|
else()
|
||
|
set(ENABLE_HOOK 1)
|
||
|
message (" enable_hook: yes")
|
||
|
endif()
|
||
|
|
||
|
if (BUILD_DYNAMIC)
|
||
|
message (" build dynamic lib: yes")
|
||
|
else()
|
||
|
message (" build dynamic lib: no")
|
||
|
endif()
|
||
|
|
||
|
message("-------------- Env ---------------")
|
||
|
message(" CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
|
||
|
message(" CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
|
||
|
message("----------------------------------")
|
||
|
|
||
|
configure_file(${PROJECT_SOURCE_DIR}/libgo/common/cmake_config.h.in ${PROJECT_SOURCE_DIR}/libgo/common/cmake_config.h)
|
||
|
message("----------------------------------")
|
||
|
|
||
|
if (UNIX)
|
||
|
set(CMAKE_CXX_FLAGS "-std=c++17 -fPIC -Wall ${CMAKE_CXX_FLAGS}")
|
||
|
set(CMAKE_CXX_FLAGS_DEBUG "-g")
|
||
|
set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -DNDEBUG")
|
||
|
|
||
|
set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS S)
|
||
|
if(CMAKE_CROSSCOMPILING)
|
||
|
message(STATUS "> CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
|
||
|
set(ASM_DIR "${PROJECT_SOURCE_DIR}/third_party/boost.context/libs/context/src/asm/")
|
||
|
|
||
|
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_arm_aapcs_elf_gas.S")
|
||
|
set(make_asm_file "${ASM_DIR}make_arm_aapcs_elf_gas.S")
|
||
|
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_arm64_aapcs_elf_gas.S")
|
||
|
set(make_asm_file "${ASM_DIR}make_arm64_aapcs_elf_gas.S")
|
||
|
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_x86_64_sysv_elf_gas.S")
|
||
|
set(make_asm_file "${ASM_DIR}make_x86_64_sysv_elf_gas.S")
|
||
|
endif()
|
||
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") # macOS
|
||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_arm64_aapcs_macho_gas.S")
|
||
|
set(make_asm_file "${ASM_DIR}make_arm64_aapcs_macho_gas.S")
|
||
|
endif()
|
||
|
elseif(CMAKE_SYSTEM_NAME STREQUAL "Windows")
|
||
|
if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_i386_ms_pe_gas.asm")
|
||
|
set(make_asm_file "${ASM_DIR}make_i386_ms_pe_gas.asm")
|
||
|
elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||
|
set(jump_asm_file "${ASM_DIR}jump_x86_64_ms_pe_gas.asm")
|
||
|
set(make_asm_file "${ASM_DIR}make_x86_64_ms_pe_gas.asm")
|
||
|
endif()
|
||
|
endif()
|
||
|
if (NOT jump_asm_file OR NOT make_asm_file)
|
||
|
message(FATAL_ERROR "--> select asm source file failed")
|
||
|
return()
|
||
|
endif()
|
||
|
file(COPY ${jump_asm_file} DESTINATION ${PROJECT_SOURCE_DIR}/libgo/context)
|
||
|
file(COPY ${make_asm_file} DESTINATION ${PROJECT_SOURCE_DIR}/libgo/context)
|
||
|
else()
|
||
|
message("--> select asm source file, please wait about 5 seconds ...")
|
||
|
execute_process(COMMAND "${PROJECT_SOURCE_DIR}/third_party/select_asm.sh" "${PROJECT_SOURCE_DIR}" "jump" OUTPUT_VARIABLE jump_asm_file)
|
||
|
execute_process(COMMAND "${PROJECT_SOURCE_DIR}/third_party/select_asm.sh" "${PROJECT_SOURCE_DIR}" "make" OUTPUT_VARIABLE make_asm_file)
|
||
|
endif()
|
||
|
|
||
|
# 输出选择的汇编文件路径
|
||
|
message(STATUS "Jump ASM File: ${jump_asm_file}")
|
||
|
message(STATUS "Make ASM File: ${make_asm_file}")
|
||
|
elseif (WIN32)
|
||
|
# windows platform
|
||
|
add_definitions(-D_CRT_SECURE_NO_WARNINGS)
|
||
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd /EHsc")
|
||
|
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MT /EHsc")
|
||
|
|
||
|
#set(CMAKE_ASM_SOURCE_FILE_EXTENSIONS asm)
|
||
|
#file(COPY ${PROJECT_SOURCE_DIR}/third_party/boost.context/libs/context/src/asm/make_x86_64_ms_pe_masm.asm DESTINATION ${PROJECT_SOURCE_DIR}/libgo/context)
|
||
|
#file(COPY ${PROJECT_SOURCE_DIR}/third_party/boost.context/libs/context/src/asm/jump_x86_64_ms_pe_masm.asm DESTINATION ${PROJECT_SOURCE_DIR}/libgo/context)
|
||
|
endif()
|
||
|
|
||
|
message("------------ Cxx flags -------------")
|
||
|
message(" CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}: ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}")
|
||
|
message("------------------------------------")
|
||
|
|
||
|
include_directories(${PROJECT_SOURCE_DIR})
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/common CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/context CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/task CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/scheduler CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/sync CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/timer CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/cls CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/defer CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/pool CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/debug CO_SRC_LIST)
|
||
|
|
||
|
if (NOT DISABLE_HOOK)
|
||
|
if (UNIX)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/netio/unix CO_SRC_LIST)
|
||
|
elseif (WIN32)
|
||
|
include_directories(${PROJECT_SOURCE_DIR}/libgo/netio/windows)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/netio/windows CO_SRC_LIST)
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/context/fiber CO_SRC_LIST)
|
||
|
list(APPEND CO_SRC_LIST ${PROJECT_SOURCE_DIR}/libgo/netio/windows/xhook/xhook.cpp)
|
||
|
endif()
|
||
|
else()
|
||
|
aux_source_directory(${PROJECT_SOURCE_DIR}/libgo/netio/disable_hook CO_SRC_LIST)
|
||
|
endif()
|
||
|
|
||
|
set(TARGET "libgo")
|
||
|
set(STATIC_T "libgo_static")
|
||
|
set(STATIC_HOOK "static_hook")
|
||
|
|
||
|
list(APPEND CO_SRC_LIST ${jump_asm_file})
|
||
|
list(APPEND CO_SRC_LIST ${make_asm_file})
|
||
|
add_library("${STATIC_T}" STATIC ${CO_SRC_LIST})
|
||
|
set_target_properties("${STATIC_T}" PROPERTIES OUTPUT_NAME "${TARGET}")
|
||
|
|
||
|
if (UNIX)
|
||
|
install(TARGETS ${STATIC_T} LIBRARY DESTINATION "lib" ARCHIVE DESTINATION "lib")
|
||
|
install(DIRECTORY ${PROJECT_SOURCE_DIR}/libgo/ DESTINATION "include/libgo" FILES_MATCHING PATTERN "*.h")
|
||
|
#PATTERN "windows" EXCLUDE
|
||
|
|
||
|
add_library("${STATIC_HOOK}" STATIC "${PROJECT_SOURCE_DIR}/libgo/netio/unix/static_hook/static_hook.cpp")
|
||
|
|
||
|
if (BUILD_DYNAMIC)
|
||
|
set(SHARED_T "libgo_dynamic")
|
||
|
add_library("${SHARED_T}" SHARED ${CO_SRC_LIST})
|
||
|
set_target_properties("${SHARED_T}" PROPERTIES OUTPUT_NAME "${TARGET}")
|
||
|
target_link_libraries("${SHARED_T}" ${LINK_LIBS} -ldl)
|
||
|
install(TARGETS ${SHARED_T} LIBRARY DESTINATION "lib" ARCHIVE DESTINATION "lib")
|
||
|
endif()
|
||
|
|
||
|
add_custom_target(debug
|
||
|
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=DEBUG ${CMAKE_SOURCE_DIR}
|
||
|
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMENT "Switch CMAKE_BUILD_TYPE to Debug"
|
||
|
)
|
||
|
|
||
|
add_custom_target(release
|
||
|
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=RELEASE ${CMAKE_SOURCE_DIR}
|
||
|
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMENT "Switch CMAKE_BUILD_TYPE to Release"
|
||
|
)
|
||
|
|
||
|
set(PROFILE_FLAGS "-pg ${CMAKE_CXX_FLAGS_${CMAKE_BUILD_TYPE}}")
|
||
|
|
||
|
#message("PROFILE_FLAGS: ${PROFILE_FLAGS}")
|
||
|
add_custom_target(profile
|
||
|
COMMAND ${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE=PROFILE -DCMAKE_CXX_FLAGS_PROFILE=\\'${PROFILE_FLAGS}\\' ${CMAKE_SOURCE_DIR}
|
||
|
COMMAND ${CMAKE_COMMAND} --build ${CMAKE_BINARY_DIR} --target all
|
||
|
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
|
||
|
COMMENT "Switch CMAKE_BUILD_TYPE to PROFILE"
|
||
|
)
|
||
|
|
||
|
add_custom_target(uninstall
|
||
|
COMMAND rm ${CMAKE_INSTALL_PREFIX}/lib/liblibgo.a ${CMAKE_INSTALL_PREFIX}/lib/liblibgo.so ${CMAKE_INSTALL_PREFIX}/lib/liblibgo_main.a -f
|
||
|
COMMAND rm ${CMAKE_INSTALL_PREFIX}/include/libgo -rf
|
||
|
)
|
||
|
|
||
|
elseif (WIN32)
|
||
|
set_target_properties("${STATIC_T}" PROPERTIES COMPILE_FLAGS "/wd4819 /wd4267")
|
||
|
endif()
|
||
|
|
||
|
if (WIN32)
|
||
|
if (BOOST_ROOT)
|
||
|
add_subdirectory(${PROJECT_SOURCE_DIR}/test/gtest_unit)
|
||
|
add_subdirectory(${PROJECT_SOURCE_DIR}/tutorial)
|
||
|
endif()
|
||
|
endif()
|