138 lines
4.8 KiB
CMake
138 lines
4.8 KiB
CMake
cmake_minimum_required(VERSION 3.16)
|
|
project(StgSharp.Native LANGUAGES C)
|
|
|
|
include(${CMAKE_CURRENT_LIST_DIR}/ExternalLibs.cmake OPTIONAL)
|
|
|
|
set(SN_TARGET_OS "auto" CACHE STRING "Target OS identifier: auto, windows, linux, macos, ios, android, unknown")
|
|
set_property(CACHE SN_TARGET_OS PROPERTY STRINGS auto windows linux macos ios android unknown)
|
|
|
|
set(SN_TARGET_ARCH "auto" CACHE STRING "Target ISA identifier: auto, x86_64, arm64, riscv64, ppc64le")
|
|
set_property(CACHE SN_TARGET_ARCH PROPERTY STRINGS auto x86_64 arm64 riscv64 ppc64le)
|
|
|
|
sn_resolve_target_identifiers(
|
|
"${SN_TARGET_OS}"
|
|
"${SN_TARGET_ARCH}"
|
|
SN_RESOLVED_OS_NAME
|
|
SN_RESOLVED_OS_DEFINE
|
|
SN_RESOLVED_ARCH_NAME
|
|
SN_RESOLVED_ARCH_DEFINE)
|
|
|
|
file(GLOB STGSHARP_NATIVE_SOURCES CONFIGURE_DEPENDS
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-src/*.c)
|
|
|
|
file(GLOB STGSHARP_NATIVE_HEADERS CONFIGURE_DEPENDS
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-head/*.h)
|
|
|
|
file(GLOB STGSHARP_NATIVE_TEMPLATES CONFIGURE_DEPENDS
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-template/*.h
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-template/*.inl
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-template/*.inc
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-template/*.ipp)
|
|
|
|
if(NOT STGSHARP_NATIVE_SOURCES)
|
|
message(FATAL_ERROR "No source files found under sn-src/.")
|
|
endif()
|
|
|
|
get_filename_component(STGSHARP_SOLUTION_ROOT ${CMAKE_CURRENT_LIST_DIR} DIRECTORY)
|
|
|
|
if(SN_RESOLVED_OS_NAME STREQUAL "windows")
|
|
set(STGSHARP_OS_TAG win)
|
|
elseif(SN_RESOLVED_OS_NAME STREQUAL "linux")
|
|
set(STGSHARP_OS_TAG linux)
|
|
else()
|
|
set(STGSHARP_OS_TAG unknown)
|
|
endif()
|
|
|
|
if(SN_RESOLVED_ARCH_NAME STREQUAL "x86_64")
|
|
set(STGSHARP_ARCH_TAG x64)
|
|
else()
|
|
set(STGSHARP_ARCH_TAG ${SN_RESOLVED_ARCH_NAME})
|
|
endif()
|
|
|
|
set(STGSHARP_BUILD_OUTPUT_DIR ${STGSHARP_SOLUTION_ROOT}/cmake_build/${STGSHARP_OS_TAG}_${STGSHARP_ARCH_TAG})
|
|
set(STGSHARP_OBJECT_ROOT_DIR ${STGSHARP_SOLUTION_ROOT}/obj/${PROJECT_NAME})
|
|
set(STGSHARP_NATIVE_PROJECT_FILES
|
|
${STGSHARP_NATIVE_SOURCES}
|
|
${STGSHARP_NATIVE_HEADERS}
|
|
${STGSHARP_NATIVE_TEMPLATES})
|
|
|
|
add_library(${PROJECT_NAME} SHARED ${STGSHARP_NATIVE_PROJECT_FILES})
|
|
|
|
source_group(TREE ${CMAKE_CURRENT_LIST_DIR} FILES ${STGSHARP_NATIVE_PROJECT_FILES})
|
|
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
C_STANDARD 11
|
|
C_STANDARD_REQUIRED ON
|
|
RUNTIME_OUTPUT_DIRECTORY ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
LIBRARY_OUTPUT_DIRECTORY ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
ARCHIVE_OUTPUT_DIRECTORY ${STGSHARP_BUILD_OUTPUT_DIR})
|
|
|
|
foreach(_config Debug Release RelWithDebInfo MinSizeRel)
|
|
string(TOUPPER ${_config} _config_upper)
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
RUNTIME_OUTPUT_DIRECTORY_${_config_upper} ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
LIBRARY_OUTPUT_DIRECTORY_${_config_upper} ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
ARCHIVE_OUTPUT_DIRECTORY_${_config_upper} ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
PDB_OUTPUT_DIRECTORY_${_config_upper} ${STGSHARP_BUILD_OUTPUT_DIR}
|
|
COMPILE_PDB_OUTPUT_DIRECTORY_${_config_upper} ${STGSHARP_OBJECT_ROOT_DIR}/${_config}/${STGSHARP_ARCH_TAG})
|
|
endforeach()
|
|
|
|
set_target_properties(${PROJECT_NAME} PROPERTIES
|
|
COMPILE_PDB_OUTPUT_DIRECTORY ${STGSHARP_OBJECT_ROOT_DIR}/$<CONFIG>/${STGSHARP_ARCH_TAG})
|
|
|
|
if(MSVC OR (CMAKE_C_COMPILER_ID STREQUAL "Clang" AND CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC"))
|
|
target_compile_options(${PROJECT_NAME} PRIVATE
|
|
/Fd${STGSHARP_OBJECT_ROOT_DIR}/$<CONFIG>/${STGSHARP_ARCH_TAG}/)
|
|
endif()
|
|
|
|
if(CMAKE_C_COMPILER_ID STREQUAL "Clang" AND SN_RESOLVED_ARCH_NAME STREQUAL "x86_64")
|
|
# Keep the intrinsic type system and builtin declarations visible to all TUs.
|
|
# The runtime dispatch contract still follows T_arch/T_feature at the function level.
|
|
if(CMAKE_C_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
|
target_compile_options(${PROJECT_NAME} PRIVATE
|
|
/clang:-mavx
|
|
/clang:-mavx2
|
|
/clang:-mfma
|
|
/clang:-mf16c
|
|
/clang:-mavx512f
|
|
/clang:-mavx512cd
|
|
/clang:-mavx512dq
|
|
/clang:-mavx512bw
|
|
/clang:-mavx512vl)
|
|
else()
|
|
target_compile_options(${PROJECT_NAME} PRIVATE
|
|
-mavx
|
|
-mavx2
|
|
-mfma
|
|
-mf16c
|
|
-mavx512f
|
|
-mavx512cd
|
|
-mavx512dq
|
|
-mavx512bw
|
|
-mavx512vl)
|
|
endif()
|
|
endif()
|
|
|
|
target_include_directories(${PROJECT_NAME}
|
|
PRIVATE
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-head
|
|
${CMAKE_CURRENT_LIST_DIR}/sn-template
|
|
${CMAKE_CURRENT_LIST_DIR}/lib)
|
|
|
|
target_compile_definitions(${PROJECT_NAME}
|
|
PRIVATE
|
|
SN_EXTERN_TARGET
|
|
SN_OS_TARGET=${SN_RESOLVED_OS_DEFINE}
|
|
SN_ARCH_TARGET=${SN_RESOLVED_ARCH_DEFINE})
|
|
|
|
set(STGSHARP_NATIVE_EXTERNAL_TARGET ${PROJECT_NAME})
|
|
add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/lib)
|
|
|
|
if(WIN32)
|
|
target_link_libraries(${PROJECT_NAME} PRIVATE opengl32)
|
|
endif()
|
|
|
|
message(STATUS "StgSharp.Native target OS: ${SN_RESOLVED_OS_NAME} (${SN_RESOLVED_OS_DEFINE})")
|
|
message(STATUS "StgSharp.Native target ISA: ${SN_RESOLVED_ARCH_NAME} (${SN_RESOLVED_ARCH_DEFINE})")
|
|
message(STATUS "StgSharp.Native output dir: ${STGSHARP_BUILD_OUTPUT_DIR}")
|