1if (NOT TARGET pico_divider) 2 # library to be depended on - we make this depend on particular implementations using per target generator expressions 3 pico_add_impl_library(pico_divider) 4 5 # no custom implementation; falls thru to compiler 6 pico_add_library(pico_divider_compiler) 7 target_sources(pico_divider_compiler INTERFACE 8 ${CMAKE_CURRENT_LIST_DIR}/divider_compiler.c 9 ) 10 target_link_libraries(pico_divider_compiler_headers INTERFACE pico_divider_headers) 11 12 # add alias "default" which is hardware for RP2040 and compiler for RP2350 13 add_library(pico_divider_default INTERFACE) 14 if (PICO_RP2040) 15 target_link_libraries(pico_divider_default INTERFACE pico_divider_hardware) 16 else() 17 target_link_libraries(pico_divider_default INTERFACE pico_divider_compiler) 18 endif() 19 20 set(PICO_DEFAULT_DIVIDER_IMPL pico_divider_default) 21 22 target_link_libraries(pico_divider INTERFACE 23 $<IF:$<BOOL:$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>>,$<TARGET_PROPERTY:PICO_TARGET_DIVIDER_IMPL>,${PICO_DEFAULT_DIVIDER_IMPL}>) 24 25 pico_add_library(pico_divider_hardware_explicit NOFLAG) 26 target_sources(pico_divider_hardware_explicit INTERFACE 27 ${CMAKE_CURRENT_LIST_DIR}/divider_hardware.S 28 ) 29 30 target_link_libraries(pico_divider_hardware_explicit_headers INTERFACE 31 pico_divider_headers 32 hardware_divider_headers 33 hardware_regs 34 ) 35 36 pico_add_library(pico_divider_hardware) 37 38 target_link_libraries(pico_divider_hardware INTERFACE pico_divider_hardware_explicit) 39 40 pico_wrap_function(pico_divider_hardware __aeabi_idiv) 41 pico_wrap_function(pico_divider_hardware __aeabi_idivmod) 42 pico_wrap_function(pico_divider_hardware __aeabi_ldivmod) 43 pico_wrap_function(pico_divider_hardware __aeabi_uidiv) 44 pico_wrap_function(pico_divider_hardware __aeabi_uidivmod) 45 pico_wrap_function(pico_divider_hardware __aeabi_uldivmod) 46 47 macro(pico_set_divider_implementation TARGET IMPL) 48 get_target_property(target_type ${TARGET} TYPE) 49 if ("EXECUTABLE" STREQUAL "${target_type}") 50 set_target_properties(${TARGET} PROPERTIES PICO_TARGET_DIVIDER_IMPL "pico_divider_${IMPL}") 51 else() 52 message(FATAL_ERROR "divider implementation must be set on executable not library") 53 endif() 54 endmacro() 55endif() 56