mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 14:00:16 +02:00
musl build fails due to access to internal glibc member:
```
FEX/Source/Tools/LinuxEmulation/LinuxSyscalls/SignalDelegator.cpp:655:39: error: no member named '__val' in '__sigset_t'
655 | .SigMask = _context->uc_sigmask.__val[0],
| ~~~~~~~~~~~~~~~~~~~~ ^
1 error generated.
```
add check to determine private glibc or musl member name or throw an error.
fixes: #5461
Signed-off-by: Pepper Gray <hello@peppergray.xyz>
193 lines
6.2 KiB
CMake
193 lines
6.2 KiB
CMake
# TODO: why is this add_compile_options instead of target?
|
|
add_compile_options(-fno-operator-names)
|
|
|
|
add_library(LinuxEmulation STATIC
|
|
VDSO_Emulation.cpp
|
|
Thunks.cpp
|
|
ArchHelpers/MContext.cpp
|
|
GdbServer/Info.cpp
|
|
LinuxSyscalls/GdbServer.cpp
|
|
LinuxSyscalls/EmulatedFiles/EmulatedFiles.cpp
|
|
LinuxSyscalls/FaultSafeUserMemAccess.cpp
|
|
LinuxSyscalls/FileManagement.cpp
|
|
LinuxSyscalls/LinuxAllocator.cpp
|
|
LinuxSyscalls/Seccomp/SeccompEmulator.cpp
|
|
LinuxSyscalls/Seccomp/BPFEmitter.cpp
|
|
LinuxSyscalls/Seccomp/Dumper.cpp
|
|
LinuxSyscalls/SignalDelegator.cpp
|
|
LinuxSyscalls/Syscalls.cpp
|
|
LinuxSyscalls/SyscallsSMCTracking.cpp
|
|
LinuxSyscalls/SyscallsVMATracking.cpp
|
|
LinuxSyscalls/ThreadManager.cpp
|
|
LinuxSyscalls/SignalDelegator/GuestFramesManagement.cpp
|
|
LinuxSyscalls/Utils/Threads.cpp
|
|
LinuxSyscalls/x32/Syscalls.cpp
|
|
LinuxSyscalls/x32/EPoll.cpp
|
|
LinuxSyscalls/x32/FD.cpp
|
|
LinuxSyscalls/x32/FS.cpp
|
|
LinuxSyscalls/x32/Info.cpp
|
|
LinuxSyscalls/x32/IO.cpp
|
|
LinuxSyscalls/x32/Memory.cpp
|
|
LinuxSyscalls/x32/Msg.cpp
|
|
LinuxSyscalls/x32/NotImplemented.cpp
|
|
LinuxSyscalls/x32/Semaphore.cpp
|
|
LinuxSyscalls/x32/Sched.cpp
|
|
LinuxSyscalls/x32/Signals.cpp
|
|
LinuxSyscalls/x32/Socket.cpp
|
|
LinuxSyscalls/x32/Stubs.cpp
|
|
LinuxSyscalls/x32/Thread.cpp
|
|
LinuxSyscalls/x32/Time.cpp
|
|
LinuxSyscalls/x32/Timer.cpp
|
|
LinuxSyscalls/x32/IoctlEmulation.cpp
|
|
LinuxSyscalls/x64/EPoll.cpp
|
|
LinuxSyscalls/x64/FD.cpp
|
|
LinuxSyscalls/x64/Info.cpp
|
|
LinuxSyscalls/x64/Memory.cpp
|
|
LinuxSyscalls/x64/NotImplemented.cpp
|
|
LinuxSyscalls/x64/Semaphore.cpp
|
|
LinuxSyscalls/x64/Signals.cpp
|
|
LinuxSyscalls/x64/Thread.cpp
|
|
LinuxSyscalls/x64/Syscalls.cpp
|
|
LinuxSyscalls/x64/Time.cpp
|
|
LinuxSyscalls/Syscalls/EPoll.cpp
|
|
LinuxSyscalls/Syscalls/FD.cpp
|
|
LinuxSyscalls/Syscalls/FS.cpp
|
|
LinuxSyscalls/Syscalls/Passthrough.cpp
|
|
LinuxSyscalls/Syscalls/Info.cpp
|
|
LinuxSyscalls/Syscalls/IO.cpp
|
|
LinuxSyscalls/Syscalls/Memory.cpp
|
|
LinuxSyscalls/Syscalls/Signals.cpp
|
|
LinuxSyscalls/Syscalls/Thread.cpp
|
|
LinuxSyscalls/Syscalls/Timer.cpp
|
|
LinuxSyscalls/Syscalls/NotImplemented.cpp
|
|
LinuxSyscalls/Syscalls/Stubs.cpp)
|
|
|
|
target_compile_options(LinuxEmulation PRIVATE
|
|
-Wall
|
|
-Werror=cast-qual
|
|
-Werror=ignored-qualifiers
|
|
-Werror=implicit-fallthrough
|
|
|
|
-Wno-trigraphs
|
|
-fwrapv)
|
|
|
|
set_target_properties(LinuxEmulation PROPERTIES
|
|
C_VISIBILITY_PRESET hidden
|
|
CXX_VISIBILITY_PRESET hidden
|
|
VISIBILITY_INLINES_HIDDEN TRUE)
|
|
|
|
target_include_directories(LinuxEmulation PRIVATE
|
|
${CMAKE_BINARY_DIR}/generated
|
|
${CMAKE_CURRENT_SOURCE_DIR}/
|
|
${PROJECT_SOURCE_DIR}/External/drm-headers/include/)
|
|
|
|
target_include_directories(LinuxEmulation INTERFACE
|
|
${CMAKE_CURRENT_SOURCE_DIR}/)
|
|
|
|
target_link_libraries(LinuxEmulation PRIVATE
|
|
Common
|
|
CommonTools)
|
|
|
|
target_link_libraries(LinuxEmulation INTERFACE FEXCore)
|
|
|
|
set(HEADERS_TO_VERIFY
|
|
# These need to match structs to 32bit structs
|
|
LinuxSyscalls/x32/Types.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/asound.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/drm.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/streams.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/usbdev.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/input.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/sockios.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/joystick.h x86_32
|
|
LinuxSyscalls/x32/Ioctl/v4l2.h x86_32
|
|
|
|
# This needs to match structs to 64bit structs
|
|
LinuxSyscalls/x64/Types.h x86_64)
|
|
|
|
list(LENGTH HEADERS_TO_VERIFY ARG_COUNT)
|
|
math(EXPR ARG_COUNT "${ARG_COUNT}-1")
|
|
|
|
set(ARGS
|
|
"-x" "c++"
|
|
"-std=c++20"
|
|
"-fno-operator-names"
|
|
"-I${PROJECT_SOURCE_DIR}/External/drm-headers/include/")
|
|
|
|
# Global include directories
|
|
get_directory_property (INC_DIRS INCLUDE_DIRECTORIES)
|
|
list(TRANSFORM INC_DIRS PREPEND "-I")
|
|
list(APPEND ARGS ${INC_DIRS})
|
|
|
|
# FEXCore directories
|
|
get_target_property(INC_DIRS FEXCore INTERFACE_INCLUDE_DIRECTORIES)
|
|
list(TRANSFORM INC_DIRS PREPEND "-I")
|
|
list(APPEND ARGS ${INC_DIRS})
|
|
|
|
get_target_property(INC_DIRS LinuxEmulation INTERFACE_INCLUDE_DIRECTORIES)
|
|
list(TRANSFORM INC_DIRS PREPEND "-I")
|
|
list(APPEND ARGS ${INC_DIRS})
|
|
|
|
foreach(Index RANGE 0 ${ARG_COUNT} 2)
|
|
math(EXPR TEST_TYPE_INDEX "${Index}+1")
|
|
|
|
list(GET HEADERS_TO_VERIFY ${Index} HEADER)
|
|
list(GET HEADERS_TO_VERIFY ${TEST_TYPE_INDEX} TEST_TYPE)
|
|
|
|
file(RELATIVE_PATH REL_HEADER ${CMAKE_BINARY_DIR} "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER}")
|
|
set(TEST_NAME "${TEST_DESC}/Test_verify_${HEADER}")
|
|
set(TEST_NAME_ARCH "${TEST_DESC}/Test_verify_arch_${HEADER}")
|
|
|
|
add_test(NAME ${TEST_NAME}_x86_64
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMAND "python3" "${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py" "-c1" "x86_64" "${REL_HEADER}" ${ARGS})
|
|
|
|
add_test(NAME ${TEST_NAME}_aarch64
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMAND "python3" "${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py" "-c1" "aarch64" "${REL_HEADER}" ${ARGS})
|
|
|
|
add_test(NAME ${TEST_NAME_ARCH}_x86_64
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMAND "python3" "${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py" "-c1" "x86_64" "-c2" "${TEST_TYPE}" "${REL_HEADER}" ${ARGS})
|
|
|
|
add_test(NAME ${TEST_NAME_ARCH}_aarch64
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
COMMAND "python3" "${CMAKE_SOURCE_DIR}/Scripts/StructPackVerifier.py" "-c1" "aarch64" "-c2" "${TEST_TYPE}" "${REL_HEADER}" ${ARGS})
|
|
|
|
set_property(TEST ${TEST_NAME}_x86_64 APPEND PROPERTY DEPENDS "${HEADER}")
|
|
set_property(TEST ${TEST_NAME}_aarch64 APPEND PROPERTY DEPENDS "${HEADER}")
|
|
set_property(TEST ${TEST_NAME_ARCH}_x86_64 APPEND PROPERTY DEPENDS "${HEADER}")
|
|
set_property(TEST ${TEST_NAME_ARCH}_aarch64 APPEND PROPERTY DEPENDS "${HEADER}")
|
|
endforeach()
|
|
|
|
add_custom_target(struct_verifier
|
|
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
|
|
USES_TERMINAL
|
|
COMMAND "ctest" "--output-on-failure" "--timeout" "302" ${TEST_JOB_FLAG} "-R" "Test_verify*")
|
|
|
|
include(CheckCSourceCompiles)
|
|
|
|
check_c_source_compiles("
|
|
#include <signal.h>
|
|
int main(void){
|
|
sigset_t s;
|
|
(void)sizeof(s.__val); // glibc
|
|
return 0;
|
|
}" SIGSET_HAS___VAL)
|
|
|
|
check_c_source_compiles("
|
|
#include <signal.h>
|
|
int main(void){
|
|
sigset_t s;
|
|
(void)sizeof(s.__bits); // musl
|
|
return 0;
|
|
}" SIGSET_HAS___BITS)
|
|
|
|
if(SIGSET_HAS___VAL)
|
|
add_compile_definitions("SIGSET_VAL=__val")
|
|
elseif(SIGSET_HAS___BITS)
|
|
add_compile_definitions("SIGSET_VAL=__bits")
|
|
else()
|
|
message(FATAL_ERROR "Unknown sigset_t layout!")
|
|
endif()
|