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

    # no custom implementation; falls thru to compiler
    add_library(pico_divider_compiler INTERFACE)
    target_compile_definitions(pico_divider_compiler INTERFACE
            PICO_DIVIDER_COMPILER=1
    )

    # add alias "default" which is just hardware.
    add_library(pico_divider_default INTERFACE)
    target_link_libraries(pico_divider_default INTERFACE pico_divider_hardware)

    set(PICO_DEFAULT_DIVIDER_IMPL pico_divider_default)

    target_link_libraries(pico_divider INTERFACE
            $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>,${PICO_DEFAULT_DIVIDER_IMPL}>)

    add_library(pico_divider_hardware_explicit INTERFACE)
    target_sources(pico_divider_hardware_explicit INTERFACE
            ${CMAKE_CURRENT_LIST_DIR}/divider.S
            )

    target_link_libraries(pico_divider_hardware_explicit INTERFACE
            pico_divider_headers
            hardware_regs
            )

    add_library(pico_divider_hardware INTERFACE)
    target_compile_definitions(pico_divider_hardware INTERFACE
            PICO_DIVIDER_HARDWARE=1
            )

    target_link_libraries(pico_divider_hardware INTERFACE pico_divider_hardware_explicit)

    pico_wrap_function(pico_divider_hardware __aeabi_idiv)
    pico_wrap_function(pico_divider_hardware __aeabi_idivmod)
    pico_wrap_function(pico_divider_hardware __aeabi_ldivmod)
    pico_wrap_function(pico_divider_hardware __aeabi_uidiv)
    pico_wrap_function(pico_divider_hardware __aeabi_uidivmod)
    pico_wrap_function(pico_divider_hardware __aeabi_uldivmod)

    macro(pico_set_divider_implementation TARGET IMPL)
        get_target_property(target_type ${TARGET} TYPE)
        if ("EXECUTABLE" STREQUAL "${target_type}")
            set_target_properties(${TARGET} PROPERTIES PICO_TARGET_DIVIDER_IMPL "pico_divider_${IMPL}")
        else()
            message(FATAL_ERROR "divider implementation must be set on executable not library")
        endif()
    endmacro()
endif()
