Skip to content

Commit

Permalink
Add support flags for export all symbols and platform defines from Re…
Browse files Browse the repository at this point in the history
…solver module (#11)
  • Loading branch information
kachsheev committed Jul 21, 2024
1 parent 3107ff9 commit a7dbe1c
Show file tree
Hide file tree
Showing 13 changed files with 326 additions and 66 deletions.
14 changes: 10 additions & 4 deletions cmake/CmakeFlameResolver.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@ include(Options)
include(Properties)
include(Variables)
include(Functions)
include(Compilers)
include(Platform)

include(Checks)

# Public API:

# Options:
Expand All @@ -35,6 +34,8 @@ endfunction(flame_header_library)
# MAKE_SHARED -
# NOT_MAKE_POSITION_DEPENDENT_OBJECTS -
# NOT_MAKE_POSITION_INDEPENDENT_OBJECTS -
# EXPORT_ALL -
# USE_RESOLVER_DEFINES -
# Values:
# NAME -
# OBJECT_ALIAS_NAME -
Expand All @@ -45,7 +46,10 @@ endfunction(flame_header_library)
# SHARED_INSTALL_PATH -
# Lists:
# INCLUDE_PATHS -
# DEFINES -
# SOURCE_LIST -
# SOURCE_LIST_STATIC -
# SOURCE_LIST_SHARED -
# COMMPILE_FLAGS -
# LINK_FLAGS -
# DEPENDENCY_HEADER_TARGETS -
Expand All @@ -58,15 +62,17 @@ function(flame_compile_library)
endfunction(flame_compile_library)

# Options:
# DEBUG -
# HELP -
# DEBUG -
# HELP -
# USE_RESOLVER_DEFINES -
# Values:
# NAME -
# ALIAS_NAME -
# INSTALL_PATH -
# Lists:
# INCLUDE_PATHS -
# SOURCE_LIST -
# DEFINES -
# COMPILE_FLAGS -
# LINK_FLAGS -
# DEPENDENCY_HEADER_TARGETS -
Expand Down
73 changes: 73 additions & 0 deletions cmake/Compilers.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
if((NOT CMAKE_CXX_COMPILER) AND (NOT CMAKE_C_COMPILER))
message(FATAL_ERROR "Only for C and/or C++")
endif()

include(Compilers/Gcc)
include(Compilers/Clang)
include(Compilers/Msvc)

if(NOT CMAKE_RESOLVER_COMPILER_CURRENT_ID)
message(FATAL_ERROR "Compiler is not supported")
endif()

set(FLAME_DEFINE_COMPILER_CURRENT
CMAKE_RESOLVER_COMPILER_CURRENT=${CMAKE_RESOLVER_COMPILER_CURRENT_ID})

set(FLAME_FLAGS
${FLAME_CXX_FLAG_NO_RTTI}
${FLAME_CXX_FLAG_RTTI}
${FLAME_CXX_FLAG_NO_EXCEPTIONS}
${FLAME_CXX_FLAG_EXCEPTIONS}
)
foreach(flag ${FLAME_FLAGS})
string(REPLACE "${flag}" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
endforeach()

function(flame_shared_set_export_symbols TARGET_NAME)
if(CMAKE_RESOLVER_COMPILER_CURRENT_ID EQUAL CMAKE_RESOLVER_COMPILER_GCC_ID)
flame_shared_set_export_symbols_gcc(${TARGET_NAME})
elseif(CMAKE_RESOLVER_COMPILER_CURRENT_ID EQUAL CMAKE_RESOLVER_COMPILER_CLANG_ID)
flame_shared_set_export_symbols_clang(${TARGET_NAME})
elseif(CMAKE_RESOLVER_COMPILER_CURRENT_ID EQUAL CMAKE_RESOLVER_COMPILER_MSVC_ID)
flame_shared_set_export_symbols_msvc(${TARGET_NAME})
endif()
endfunction()

function(flame_get_platform_defines OUT_LIST)
set(FLAME_PLATFORM_FLAGS
${FLAME_DEFINE_COMPILER_CURRENT}
${FLAME_DEFINE_COMPILER_GCC}
${FLAME_DEFINE_COMPILER_CLANG}
${FLAME_DEFINE_COMPILER_MSVC}
${FLAME_DEFINE_EXPORT}
)
set(${OUT_LIST} ${FLAME_PLATFORM_FLAGS} PARENT_SCOPE)
endfunction()

function(flame_get_rtti_defines RTTI_ON OUT_LIST)
if(RTTI_ON)
set(DEFINE_RTTI
CMAKE_RESOLVER_RTTI_ENABLED=1
CMAKE_RESOLVER_RTTI_DISABLED=0)
else()
set(DEFINE_RTTI
CMAKE_RESOLVER_RTTI_ENABLED=0
CMAKE_RESOLVER_RTTI_DISABLED=1)
endif()

set(${OUT_LIST} ${DEFINE_RTTI} PARENT_SCOPE)
endfunction()

function(flame_get_exception_defines EXCEPTIONS_ON OUT_LIST)
if(EXCEPTIONS_ON)
set(DEFINE_EXCEPTIONS
CMAKE_RESOLVER_EXCEPTIONS_ENABLED=1
CMAKE_RESOLVER_EXCEPTIONS_DISABLED=0)
else()
set(DEFINE_EXCEPTIONS
CMAKE_RESOLVER_EXCEPTIONS_ENABLED=0
CMAKE_RESOLVER_EXCEPTIONS_DISABLED=1)
endif()

set(${OUT_LIST} ${DEFINE_EXCEPTIONS} PARENT_SCOPE)
endfunction()
28 changes: 28 additions & 0 deletions cmake/Compilers/Clang.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
generate_random_id(CMAKE_RESOLVER_COMPILER_CLANG_ID)

set(FLAME_DEFINE_COMPILER_CLANG
CMAKE_RESOLVER_COMPILER_CLANG=${CMAKE_RESOLVER_COMPILER_CLANG_ID})

if(("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang"))
message(STATUS "Detect clang")

set(FLAME_DEFINE_EXPORT "CMAKE_RESOLVER_EXPORT=__attribute__((visibility(default)))")

set(CMAKE_RESOLVER_COMPILER_CURRENT_ID ${CMAKE_RESOLVER_COMPILER_CLANG_ID})

set(FLAME_FLAG_ALL_EXPORT "-fvisibility=default")
set(FLAME_FLAG_NO_EXPORT "-fvisibility=hidden")

if(CMAKE_CXX_COMPILER)
set(FLAME_CXX_FLAG_NO_RTTI "-fno-rtti")
set(FLAME_CXX_FLAG_RTTI "-frtti")

set(FLAME_CXX_FLAG_NO_EXCEPTIONS "-fno-cxx-exceptions")
set(FLAME_CXX_FLAG_EXCEPTIONS "-fcxx-exceptions")
endif()
endif()

function(flame_shared_set_export_symbols_clang TARGET_NAME)
flame_shared_set_export_symbols_gcc(${TARGET_NAME})
endfunction()
28 changes: 28 additions & 0 deletions cmake/Compilers/Gcc.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
generate_random_id(CMAKE_RESOLVER_COMPILER_GCC_ID)

set(FLAME_DEFINE_COMPILER_GCC
CMAKE_RESOLVER_COMPILER_GCC=${CMAKE_RESOLVER_COMPILER_GCC_ID})

if(("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU")
OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU"))
message(STATUS "Detect GCC")

set(FLAME_DEFINE_EXPORT "CMAKE_RESOLVER_EXPORT=__attribute__((visibility(\"default\")))")

set(CMAKE_RESOLVER_COMPILER_CURRENT_ID ${CMAKE_RESOLVER_COMPILER_GCC_ID})

set(FLAME_FLAG_ALL_EXPORT "-fvisibility=default")
set(FLAME_FLAG_NO_EXPORT "-fvisibility=hidden")

if(CMAKE_CXX_COMPILER)
set(FLAME_CXX_FLAG_NO_RTTI "-fno-rtti")
set(FLAME_CXX_FLAG_RTTI "")

set(FLAME_CXX_FLAG_NO_EXCEPTIONS "-fno-exceptions")
set(FLAME_CXX_FLAG_EXCEPTIONS "-fexceptions")
endif()
endif()

function(flame_shared_set_export_symbols_gcc TARGET_NAME)
target_compile_options(${TARGET_NAME} PRIVATE ${FLAME_FLAG_ALL_EXPORT})
endfunction()
30 changes: 30 additions & 0 deletions cmake/Compilers/Msvc.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
generate_random_id(CMAKE_RESOLVER_COMPILER_MSVC_ID)

set(FLAME_DEFINE_COMPILER_MSVC
CMAKE_RESOLVER_COMPILER_MSVC=${CMAKE_RESOLVER_COMPILER_MSVC_ID})

if(("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC")
OR ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC"))
message(STATUS "Detect CL.EXE")

set(FLAME_DEFINE_EXPORT "CMAKE_RESOLVER_EXPORT=__declspec(dllexport)")

set(CMAKE_RESOLVER_COMPILER_CURRENT_ID ${CMAKE_RESOLVER_COMPILER_MSVC_ID})

set(FLAME_FLAG_BIG_OBJECT "/bigobj")

if(CMAKE_CXX_COMPILER)
set(FLAME_CXX_FLAG_NO_RTTI "/GR")
set(FLAME_CXX_FLAG_RTTI "/GR-")

set(FLAME_CXX_FLAG_NO_EXCEPTIONS "/EHsc-")
set(FLAME_CXX_FLAG_EXCEPTIONS "/EHsc")
endif()
endif()

function(flame_shared_set_export_symbols_msvc TARGET_NAME)
target_compile_options(${TARGET_NAME} PRIVATE ${FLAME_FLAG_BIG_OBJECT})
set_target_properties(${TARGET_NAME}
PROPERTIES
WINDOWS_EXPORT_ALL_SYMBOLS ON)
endfunction()
32 changes: 30 additions & 2 deletions cmake/Functions/CompileBinaryFunctions.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
function(internal_compile_binary)
check_internal_use()

set(OPTIONS "DEBUG" "TEST" "RTTI" "NO_RTTI" "EXCEPTIONS" "NO_EXCEPTIONS")
set(OPTIONS "DEBUG" "TEST" "RTTI" "NO_RTTI" "EXCEPTIONS" "NO_EXCEPTIONS"
"USE_RESOLVER_DEFINES")
set(VALUES "NAME" "ALIAS_NAME" "INSTALL_PATH")
set(LISTS "INCLUDE_PATHS" "SOURCE_LIST" "COMPILE_FLAGS" "LINK_FLAGS"
set(LISTS "DEFINES" "INCLUDE_PATHS" "SOURCE_LIST" "COMPILE_FLAGS" "LINK_FLAGS"
"DEPENDENCY_TARGET_LIST" "TEST_ARGUMENTS")
cmake_parse_arguments("BINARY" "${OPTIONS}" "${VALUES}" "${LISTS}" "${ARGN}")

Expand Down Expand Up @@ -60,6 +61,12 @@ macro(internal_compile_binary_print_parse_result)
print_debug_function_oneline("BINARY_INSTALL_PATH = ")
print_debug_value_newline(${BINARY_INSTALL_PATH})

print_debug_function_oneline("BINARY_USE_RESOLVER_DEFINES = ")
print_debug_value_newline(${BINARY_USE_RESOLVER_DEFINES})

print_debug_function_oneline("BINARY_DEFINES = ")
print_debug_value_newline(${BINARY_DEFINES})

print_debug_function_oneline("BINARY_INCLUDE_PATHS = ")
print_debug_value_newline(${BINARY_INCLUDE_PATHS})

Expand Down Expand Up @@ -111,9 +118,11 @@ macro(internal_compile_binary_process_parameters)
if((NOT BINARY_RTTI) AND (NOT BINARY_NO_RTTI))
if(FLAME_CXX_NO_RTTI)
set(MESSAGE_OPTION "NO_RTTI")
set(BINARY_RTTI OFF)
list(APPEND BINARY_COMPILE_FLAGS "${FLAME_CXX_FLAG_NO_RTTI}")
else()
set(MESSAGE_OPTION "RTTI")
set(BINARY_RTTI ON)
list(APPEND BINARY_COMPILE_FLAGS "${FLAME_CXX_FLAG_RTTI}")
endif()
set(MESSAGE_STRING "not set 'RTTI' or 'NO_RTTI'. Used '${MESSAGE_OPTION}'")
Expand All @@ -136,9 +145,11 @@ macro(internal_compile_binary_process_parameters)
if((NOT BINARY_EXCEPTIONS) AND (NOT BINARY_NO_EXCEPTIONS))
if(FLAME_CXX_NO_EXCEPTIONS)
set(MESSAGE_OPTION "NO_EXCEPTIONS")
set(BINARY_EXCEPTIONS OFF)
list(APPEND BINARY_COMPILE_FLAGS "${FLAME_CXX_FLAG_NO_EXCEPTIONS}")
else()
set(MESSAGE_OPTION "EXCEPTIONS")
set(BINARY_EXCEPTIONS ON)
list(APPEND BINARY_COMPILE_FLAGS "${FLAME_CXX_FLAG_EXCEPTIONS}")
endif()

Expand All @@ -152,6 +163,22 @@ macro(internal_compile_binary_process_parameters)
elseif(BINARY_NO_EXCEPTIONS)
list(APPEND BINARY_COMPILE_FLAGS "${FLAME_CXX_FLAG_NO_EXCEPTIONS}")
endif()

if(BINARY_USE_RESOLVER_DEFINES)
flame_get_platform_defines(PLATFORM_DEFINES)
list(APPEND BINARY_DEFINES ${PLATFORM_DEFINES})

if(CMAKE_CXX_COMPILER)
flame_get_rtti_defines(${BINARY_RTTI} DEFINE_RTTI)
flame_get_exception_defines(${BINARY_EXCEPTIONS} DEFINE_EXCEPTIONS)
list(APPEND BINARY_DEFINES ${DEFINE_RTTI} ${DEFINE_EXCEPTIONS})

unset(DEFINE_RTTI)
unset(DEFINE_EXCEPTIONS)
endif()

unset(PLATFORM_DEFINES)
endif()
endmacro(internal_compile_binary_process_parameters)

macro(internal_compile_binary_add)
Expand Down Expand Up @@ -180,6 +207,7 @@ macro(internal_compile_binary_add)
DEPENDENCY_LIBRARIES "${BINARY_DEPENDENCY_TARGET_LIST}"
#LINK_FLAGS "${BINARY_LINK_FLAGS}"
INCLUDE_PATHS "${BINARY_INCLUDE_PATHS}"
DEFINES "${BINARY_DEFINES}"

${BINARY_TEST}
TEST_ARGUMENTS "${BINARY_TEST_ARGUMENTS}"
Expand Down
Loading

0 comments on commit a7dbe1c

Please sign in to comment.