cmake_minimum_required(VERSION 3.22)

set(MSVCR90_GENERATED_STUBS ${CMAKE_CURRENT_BINARY_DIR}/generated_stubs.c)
set(MSVCR90_DEF ${CMAKE_CURRENT_BINARY_DIR}/msvcr90.def)

# Generate stub implementations from spec
add_custom_command(
    OUTPUT ${MSVCR90_GENERATED_STUBS}
    COMMAND ${Python3_EXECUTABLE} ${GENERATE_STUBS_TOOL}
        --arch i386
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcr90.spec
        ${MSVCR90_GENERATED_STUBS}
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcr90.spec
        ${GENERATE_STUBS_TOOL}
        ${SPEC_PARSER_LIB}
    COMMENT "Generating msvcr90 stubs"
    VERBATIM
)

# Generate .def file from spec
add_custom_command(
    OUTPUT ${MSVCR90_DEF}
    COMMAND ${Python3_EXECUTABLE} ${GENERATE_DEF_TOOL}
        --arch i386
        --no-stdcall-suffix
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcr90.spec
        ${MSVCR90_DEF}
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcr90.spec
        ${GENERATE_DEF_TOOL}
        ${SPEC_PARSER_LIB}
    COMMENT "Generating msvcr90.def"
    VERBATIM
)

add_library(msvcr90 SHARED
    ../msvcrt/console.c
    ../msvcrt/cpp.c
    # ../msvcrt/crt_gccmain.c
    # ../msvcrt/crt_main.c
    # ../msvcrt/crt_winmain.c
    # ../msvcrt/crt_wmain.c
    # ../msvcrt/crt_wwinmain.c
    ../msvcrt/ctype.c
    ../msvcrt/data.c
    ../msvcrt/dir.c
    ../msvcrt/environ.c
    ../msvcrt/errno.c
    ../msvcrt/except.c
    ../msvcrt/except_i386.c
    ../msvcrt/exception_ptr.c
    ../msvcrt/exit.c
    ../msvcrt/file.c
    ../msvcrt/heap.c
    # ../msvcrt/iob.c
    ../msvcrt/locale.c
    ../msvcrt/lock.c
    ../msvcrt/main.c
    ../msvcrt/math.c
    ../msvcrt/mathf.c
    ../msvcrt/mbcs.c
    ../msvcrt/misc.c
    # ../msvcrt/onexit.c
    ../msvcrt/process.c
    ../msvcrt/scanf.c
    ../msvcrt/sincos.c
    ../msvcrt/string.c
    ../msvcrt/thread.c
    ../msvcrt/time.c
    ../msvcrt/undname.c
    ../msvcrt/wcs.c
    # msvcr90.rc
    ${MSVCR90_GENERATED_STUBS}
    ../winecrt0/crt_dllmain.c
    ../winecrt0/setjmp.c
    ../winecrt0/exception.c
    ${MSVCR90_DEF}
)

set_target_properties(msvcr90 PROPERTIES
    PREFIX ""
    OUTPUT_NAME msvcr90
)

target_compile_definitions(msvcr90
    PRIVATE
        _CRTIMP=
        _MSVCR_VER=90
        _NTSYSTEM_
        __WINE_PE_BUILD
)

target_compile_options(msvcr90
    PRIVATE
        -fno-builtin
        -fno-strict-aliasing
        -fno-omit-frame-pointer
        -Wno-deprecated-declarations
        -Wno-unused-parameter
        -Wno-missing-braces
        -Wno-ignored-qualifiers
)

target_link_options(msvcr90
    PRIVATE
        -Wl,--enable-stdcall-fixup
)

target_include_directories(msvcr90
    PRIVATE
        ${PROJECT_SOURCE_DIR}/dlls/msvcrt
        ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}/include/msvcrt
        ${PROJECT_SOURCE_DIR}/include/wine
)

target_link_libraries(msvcr90
    PRIVATE
        musl
        advapi32_import_lib
        kernel32_import_lib
        kernelbase_import_lib
        ntdll_import_lib
        user32_import_lib
)

if (CMAKE_C_COMPILER_ID MATCHES "Clang")
    target_link_libraries(msvcr90
        PRIVATE
            ${CMAKE_SOURCE_DIR}/vendor/libclang_rt.builtins-i386.a
    )
endif()
