cmake_minimum_required(VERSION 3.22)

set(MSVCRT40_GENERATED_STUBS ${CMAKE_CURRENT_BINARY_DIR}/generated_stubs.c)
set(MSVCRT40_DEF ${CMAKE_CURRENT_BINARY_DIR}/msvcrt40.def)

add_custom_command(
    OUTPUT ${MSVCRT40_GENERATED_STUBS}
    COMMAND ${Python3_EXECUTABLE} ${GENERATE_STUBS_TOOL}
        --arch i386
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcrt40.spec
        ${MSVCRT40_GENERATED_STUBS}
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcrt40.spec
        ${GENERATE_STUBS_TOOL}
        ${SPEC_PARSER_LIB}
    COMMENT "Generating msvcrt40 stubs"
    VERBATIM
)

add_custom_command(
    OUTPUT ${MSVCRT40_DEF}
    COMMAND ${Python3_EXECUTABLE} ${GENERATE_DEF_TOOL}
        --arch i386
        --no-stdcall-suffix
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcrt40.spec
        ${MSVCRT40_DEF}
    DEPENDS
        ${CMAKE_CURRENT_SOURCE_DIR}/msvcrt40.spec
        ${GENERATE_DEF_TOOL}
        ${SPEC_PARSER_LIB}
    COMMENT "Generating msvcrt40.def"
    VERBATIM
)

add_library(msvcrt40 SHARED
    msvcrt40.c
    ${MSVCRT40_GENERATED_STUBS}
    ../winecrt0/crt_dllmain.c
    ${MSVCRT40_DEF}
)

set_target_properties(msvcrt40 PROPERTIES
    PREFIX ""
    OUTPUT_NAME msvcrt40
)

target_compile_definitions(msvcrt40
    PRIVATE
        _CRTIMP=
        _NTSYSTEM_
        __WINE_PE_BUILD
)

target_compile_options(msvcrt40
    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(msvcrt40
    PRIVATE
        -Wl,--enable-stdcall-fixup
)

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