if (NOT TARGET pico_double)
    # library to be depended on - we make this depend on particular implementations using per target generator expressions
    add_library(pico_double INTERFACE)

    # no custom implementation; falls thru to compiler
    add_library(pico_double_compiler INTERFACE)
    # PICO_BUILD_DEFINE: PICO_DOUBLE_COMPILER, whether compiler provided double support is being used, type=bool, default=0, but dependent on CMake options, group=pico_double
    target_compile_definitions(pico_double_compiler INTERFACE
            PICO_DOUBLE_COMPILER=1
    )

    add_library(pico_double_headers INTERFACE)
    target_include_directories(pico_double_headers INTERFACE ${CMAKE_CURRENT_LIST_DIR}/include)

    # add alias "default" which is just pico.
    add_library(pico_double_default INTERFACE)
    target_link_libraries(pico_double_default INTERFACE pico_double_pico)

    set(PICO_DEFAULT_DOUBLE_IMPL pico_double_default)

    target_link_libraries(pico_double INTERFACE
            $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_DOUBLE_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_DOUBLE_IMPL>,${PICO_DEFAULT_DOUBLE_IMPL}>)

    add_library(pico_double_pico INTERFACE)
    target_sources(pico_double_pico INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/double_aeabi.S
            ${CMAKE_CURRENT_LIST_DIR}/double_init_rom.c
            ${CMAKE_CURRENT_LIST_DIR}/double_math.c
            ${CMAKE_CURRENT_LIST_DIR}/double_v1_rom_shim.S
    )
    # PICO_BUILD_DEFINE: PICO_DOUBLE_PICO, whether optimized pico/bootrom provided double support is being used, type=bool, default=1, but dependent on CMake options, group=pico_double
    target_compile_definitions(pico_double_pico INTERFACE
            PICO_DOUBLE_PICO=1
            )

    target_link_libraries(pico_double_pico INTERFACE pico_bootrom pico_double_headers)

    add_library(pico_double_none INTERFACE)
    target_sources(pico_double_none INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/double_none.S
            )

    target_link_libraries(pico_double_none INTERFACE pico_double_headers)

    # PICO_BUILD_DEFINE: PICO_DOUBLE_NONE, whether double support is disabled and functions will panic, type=bool, default=0, but dependent on CMake options, group=pico_double
    target_compile_definitions(pico_double_none INTERFACE
            PICO_DOUBLE_NONE=1
            PICO_PRINTF_SUPPORT_FLOAT=0 # printing floats/doubles won't work, so we can save space by removing it
    )

    function(wrap_double_functions TARGET)
        pico_wrap_function(${TARGET} __aeabi_dadd)
        pico_wrap_function(${TARGET} __aeabi_ddiv)
        pico_wrap_function(${TARGET} __aeabi_dmul)
        pico_wrap_function(${TARGET} __aeabi_drsub)
        pico_wrap_function(${TARGET} __aeabi_dsub)
        pico_wrap_function(${TARGET} __aeabi_cdcmpeq)
        pico_wrap_function(${TARGET} __aeabi_cdrcmple)
        pico_wrap_function(${TARGET} __aeabi_cdcmple)
        pico_wrap_function(${TARGET} __aeabi_dcmpeq)
        pico_wrap_function(${TARGET} __aeabi_dcmplt)
        pico_wrap_function(${TARGET} __aeabi_dcmple)
        pico_wrap_function(${TARGET} __aeabi_dcmpge)
        pico_wrap_function(${TARGET} __aeabi_dcmpgt)
        pico_wrap_function(${TARGET} __aeabi_dcmpun)
        pico_wrap_function(${TARGET} __aeabi_i2d)
        pico_wrap_function(${TARGET} __aeabi_l2d)
        pico_wrap_function(${TARGET} __aeabi_ui2d)
        pico_wrap_function(${TARGET} __aeabi_ul2d)
        pico_wrap_function(${TARGET} __aeabi_d2iz)
        pico_wrap_function(${TARGET} __aeabi_d2lz)
        pico_wrap_function(${TARGET} __aeabi_d2uiz)
        pico_wrap_function(${TARGET} __aeabi_d2ulz)
        pico_wrap_function(${TARGET} __aeabi_d2f)
        pico_wrap_function(${TARGET} sqrt)
        pico_wrap_function(${TARGET} cos)
        pico_wrap_function(${TARGET} sin)
        pico_wrap_function(${TARGET} tan)
        pico_wrap_function(${TARGET} atan2)
        pico_wrap_function(${TARGET} exp)
        pico_wrap_function(${TARGET} log)

        pico_wrap_function(${TARGET} ldexp)
        pico_wrap_function(${TARGET} copysign)
        pico_wrap_function(${TARGET} trunc)
        pico_wrap_function(${TARGET} floor)
        pico_wrap_function(${TARGET} ceil)
        pico_wrap_function(${TARGET} round)
        pico_wrap_function(${TARGET} sincos) # gnu
        pico_wrap_function(${TARGET} asin)
        pico_wrap_function(${TARGET} acos)
        pico_wrap_function(${TARGET} atan)
        pico_wrap_function(${TARGET} sinh)
        pico_wrap_function(${TARGET} cosh)
        pico_wrap_function(${TARGET} tanh)
        pico_wrap_function(${TARGET} asinh)
        pico_wrap_function(${TARGET} acosh)
        pico_wrap_function(${TARGET} atanh)
        pico_wrap_function(${TARGET} exp2)
        pico_wrap_function(${TARGET} log2)
        pico_wrap_function(${TARGET} exp10)
        pico_wrap_function(${TARGET} log10)
        pico_wrap_function(${TARGET} pow)
        pico_wrap_function(${TARGET} powint) #gnu
        pico_wrap_function(${TARGET} hypot)
        pico_wrap_function(${TARGET} cbrt)
        pico_wrap_function(${TARGET} fmod)
        pico_wrap_function(${TARGET} drem)
        pico_wrap_function(${TARGET} remainder)
        pico_wrap_function(${TARGET} remquo)
        pico_wrap_function(${TARGET} expm1)
        pico_wrap_function(${TARGET} log1p)
        pico_wrap_function(${TARGET} fma)
    endfunction()

    wrap_double_functions(pico_double_pico)
    wrap_double_functions(pico_double_none)

    macro(pico_set_double_implementation TARGET IMPL)
        get_target_property(target_type ${TARGET} TYPE)
        if ("EXECUTABLE" STREQUAL "${target_type}")
            set_target_properties(${TARGET} PROPERTIES PICO_TARGET_DOUBLE_IMPL "pico_double_${IMPL}")
        else()
            message(FATAL_ERROR "double implementation must be set on executable not library")
        endif()
    endmacro()
endif()
