add_library(libSceLibcInternal SHARED EXCLUDE_FROM_ALL Export.cpp FileTime.cpp Getopt.cpp SignalList.cpp Spawn.cpp UserContext.cpp)
target_include_directories(libSceLibcInternal PRIVATE ${LIBS_INCLUDE_DIR})
target_link_libraries(libSceLibcInternal PRIVATE ${CMAKE_DL_LIBS})
target_sources(libSceLibcInternal PRIVATE Directory.cpp)
configure_windows_unwind(libSceLibcInternal)
target_sources(libSceLibcInternal PRIVATE FilesystemStatistics.cpp PathStatistics.cpp)

if(BUILD_TESTING)
    add_test_executable(guest_statvfs_tests ${LIBS_INCLUDE_DIR}/tests/GuestStatvfs.cpp)
    target_include_directories(guest_statvfs_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_statvfs_tests PRIVATE libSceLibcInternal libc)
    configure_windows_unwind(guest_statvfs_tests)
    add_test(NAME guest_statvfs COMMAND guest_statvfs_tests)
    set_tests_properties(guest_statvfs PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_statvfs PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_fstatvfs_conversion_tests ${LIBS_INCLUDE_DIR}/tests/GuestFstatvfsConversion.cpp FilesystemStatistics.cpp)
    target_include_directories(guest_fstatvfs_conversion_tests PRIVATE ${LIBS_INCLUDE_DIR})
    configure_windows_unwind(guest_fstatvfs_conversion_tests)
    add_test(NAME guest_fstatvfs_conversion COMMAND guest_fstatvfs_conversion_tests)
    set_tests_properties(guest_fstatvfs_conversion PROPERTIES TIMEOUT 20)
    add_test_executable(guest_fstatvfs_tests ${LIBS_INCLUDE_DIR}/tests/GuestFstatvfs.cpp)
    target_include_directories(guest_fstatvfs_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_fstatvfs_tests PRIVATE libSceLibcInternal libkernel libc)
    configure_windows_unwind(guest_fstatvfs_tests)
    add_test(NAME guest_fstatvfs COMMAND guest_fstatvfs_tests)
    set_tests_properties(guest_fstatvfs PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_fstatvfs PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_fdopendir_tests ${LIBS_INCLUDE_DIR}/tests/GuestFdopendir.cpp)
    target_include_directories(guest_fdopendir_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_fdopendir_tests PRIVATE libSceLibcInternal libkernel libc)
    configure_windows_unwind(guest_fdopendir_tests)
    add_test(NAME guest_fdopendir COMMAND guest_fdopendir_tests)
    if(WIN32)
        set_tests_properties(guest_fdopendir PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_utime_forwarding_tests ${LIBS_INCLUDE_DIR}/tests/GuestUtimeForwarding.cpp FileTime.cpp)
    target_include_directories(guest_utime_forwarding_tests PRIVATE ${LIBS_INCLUDE_DIR})
    configure_windows_unwind(guest_utime_forwarding_tests)
    add_test(NAME guest_utime_forwarding COMMAND guest_utime_forwarding_tests)
    set_tests_properties(guest_utime_forwarding PROPERTIES TIMEOUT 20)
    add_test_executable(guest_utime_tests ${LIBS_INCLUDE_DIR}/tests/GuestUtime.cpp)
    target_include_directories(guest_utime_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_utime_tests PRIVATE libSceLibcInternal libc)
    configure_windows_unwind(guest_utime_tests)
    add_test(NAME guest_utime COMMAND guest_utime_tests)
    set_tests_properties(guest_utime PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_utime PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_posix_spawn_tests ${LIBS_INCLUDE_DIR}/tests/GuestPosixSpawn.cpp)
    target_include_directories(guest_posix_spawn_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_posix_spawn_tests PRIVATE libSceLibcInternal libc)
    configure_windows_unwind(guest_posix_spawn_tests)
    add_test(NAME guest_posix_spawn COMMAND guest_posix_spawn_tests)
    set_tests_properties(guest_posix_spawn PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_posix_spawn PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_program_name_tests ${LIBS_INCLUDE_DIR}/tests/GuestProgramName.cpp)
    target_include_directories(guest_program_name_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_program_name_tests PRIVATE libSceLibcInternal libkernel libc)
    configure_windows_unwind(guest_program_name_tests)
    add_test(NAME guest_program_name COMMAND guest_program_name_tests)
    set_tests_properties(guest_program_name PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_program_name PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_thread_atexit_tests ${LIBS_INCLUDE_DIR}/tests/GuestThreadAtexit.cpp)
    target_include_directories(guest_thread_atexit_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_thread_atexit_tests PRIVATE libSceLibcInternal libkernel libc)
    configure_windows_unwind(guest_thread_atexit_tests)
    add_test(NAME guest_thread_atexit COMMAND guest_thread_atexit_tests)
    set_tests_properties(guest_thread_atexit PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_thread_atexit PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_getopt_tests ${LIBS_INCLUDE_DIR}/tests/GuestGetopt.cpp)
    target_include_directories(guest_getopt_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_getopt_tests PRIVATE libSceLibcInternal libkernel libc)
    configure_windows_unwind(guest_getopt_tests)
    add_test(NAME guest_getopt COMMAND guest_getopt_tests)
    set_tests_properties(guest_getopt PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_getopt PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_force_tls_destructor_tests ${LIBS_INCLUDE_DIR}/tests/GuestForceTlsDestructor.cpp)
    target_include_directories(guest_force_tls_destructor_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_force_tls_destructor_tests PRIVATE libSceLibcInternal libkernel libc ${CMAKE_DL_LIBS})
    configure_windows_unwind(guest_force_tls_destructor_tests)
    add_test(NAME guest_force_tls_destructor COMMAND guest_force_tls_destructor_tests)
    set_tests_properties(guest_force_tls_destructor PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_force_tls_destructor PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_fminf_tests ${LIBS_INCLUDE_DIR}/tests/GuestFminf.cpp)
    target_include_directories(guest_fminf_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_fminf_tests PRIVATE libSceLibcInternal libc)
    configure_windows_unwind(guest_fminf_tests)
    add_test(NAME guest_fminf COMMAND guest_fminf_tests)
    set_tests_properties(guest_fminf PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_fminf PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
    add_test_executable(guest_signal_list_tests ${LIBS_INCLUDE_DIR}/tests/GuestSignalList.cpp)
    target_include_directories(guest_signal_list_tests PRIVATE ${LIBS_INCLUDE_DIR})
    target_link_libraries(guest_signal_list_tests PRIVATE libSceLibcInternal)
    configure_windows_unwind(guest_signal_list_tests)
    add_test(NAME guest_signal_list COMMAND guest_signal_list_tests)
    set_tests_properties(guest_signal_list PROPERTIES TIMEOUT 20)
    if(WIN32)
        set_tests_properties(guest_signal_list PROPERTIES ENVIRONMENT_MODIFICATION
            "PATH=path_list_prepend:$<TARGET_FILE_DIR:libSceLibcInternal>")
    endif()
endif()
