file(GLOB_RECURSE HEADERS include/*.h)

set(SOURCES
    ${HEADERS}
    src/stdio.cpp
    src/stdlib.cpp
    src/unistd.cpp
    src/errno.cpp
    src/string.cpp
    src/strftime.cpp
    src/fcntl.cpp
    src/assert.cpp
    src/atexit.cpp
    src/ctype.cpp
    src/time.cpp
    src/init.cpp
    src/dirent.cpp
    src/setjmp.cpp
    src/env.cpp
    src/pwd.cpp
    src/grp.cpp
    src/locale.cpp
    src/scanf.cpp
    src/signal.cpp
    src/termios.cpp
    src/sys/stat.cpp
    src/sys/mman.cpp
    src/sys/wait.cpp
    src/sys/ioctl.cpp
    src/sys/utsname.cpp
    src/sys/mount.cpp
    src/sys/pstat.cpp
    src/sys/resource.cpp
    src/sys/socket.cpp
    src/sys/poll.cpp
)

if(${LUNA_ARCH} STREQUAL "x86_64")
    set(SOURCES
        ${SOURCES}
        src/arch/x86_64/syscall.S
        src/arch/x86_64/setjmp.S
        src/arch/x86_64/sigreturn.S
    )
endif()

add_library(crt0 STATIC src/arch/${LUNA_ARCH}/crt0.S)
add_custom_command(
    TARGET crt0
    COMMAND "${CMAKE_COMMAND}" -E copy $<TARGET_OBJECTS:crt0> ${LUNA_BASE}/usr/lib/crt0.o
)

add_library(bare_libc STATIC ${SOURCES})

target_link_libraries(bare_libc PUBLIC luna)

target_include_directories(bare_libc PUBLIC include/)

target_compile_options(bare_libc PRIVATE ${COMMON_FLAGS})

target_link_options(bare_libc PRIVATE -nostdlib)

set_target_properties(bare_libc PROPERTIES CXX_STANDARD 20)

add_custom_target(libc
    COMMAND ${CMAKE_AR} -x $<TARGET_FILE:bare_libc>
    COMMAND ${CMAKE_AR} -x $<TARGET_FILE:luna>
    COMMAND ${CMAKE_AR} -rcs ${CMAKE_CURRENT_BINARY_DIR}/libc.a *.o
    COMMAND /usr/bin/rm *.o
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    DEPENDS bare_libc luna crt0
)

add_custom_command(
    TARGET libc
    COMMAND "${CMAKE_COMMAND}" -E copy ${CMAKE_CURRENT_BINARY_DIR}/libc.a ${LUNA_BASE}/usr/lib/libc.a
)

file(WRITE "${LUNA_BASE}/usr/lib/libm.a" "INPUT(libc.a)")
file(WRITE "${LUNA_BASE}/usr/lib/libstdc++.a" "INPUT(libc.a)")