function(add_psdr_library)
    list(GET ARGV 0 TARGET)
    list(REMOVE_AT ARGV 0)
    add_library(${TARGET} SHARED ${ARGV})
    set_property(TARGET ${TARGET} PROPERTY POSITION_INDEPENDENT_CODE ON)
    target_link_libraries(${TARGET} PRIVATE
        psdr-core
        psdr-render
        psdr-ext
        algorithm1
        OpenMP::OpenMP_CXX
        fmt::fmt
        -flto
    )
endfunction()

function(add_enzyme_library)
    list(GET ARGV 0 TARGET)
    list(REMOVE_AT ARGV 0)
    add_library(${TARGET} SHARED ${ARGV})
    set_property(TARGET ${TARGET} PROPERTY POSITION_INDEPENDENT_CODE ON)
    target_link_libraries(${TARGET} PRIVATE
        psdr-core-obj
        psdr-render-obj
        psdr-ext-obj
        OpenMP::OpenMP_CXX
        fmt::fmt
        -flto
    )
    target_link_options(${TARGET} PRIVATE 
        -fuse-ld=lld
        -flto
        -Wl,-mllvm=-load=/usr/local/lib/LLDEnzyme-12.so
    )
endfunction()

add_subdirectory(libcore)
add_subdirectory(librender)
add_subdirectory(bsdf)
add_subdirectory(emitter)
add_subdirectory(medium)
add_subdirectory(algorithm1)
add_subdirectory(integrator)

add_library(psdr-ext-obj INTERFACE)
target_sources(psdr-ext-obj INTERFACE 
    $<TARGET_OBJECTS:bsdf-obj> 
    $<TARGET_OBJECTS:emitter-obj> 
    $<TARGET_OBJECTS:medium-obj>
)
add_library(psdr-ext SHARED 
    $<TARGET_OBJECTS:bsdf-obj> 
    $<TARGET_OBJECTS:emitter-obj> 
    $<TARGET_OBJECTS:medium-obj>
)
target_link_libraries(psdr-ext PUBLIC
    bsdf-obj
    emitter-obj
    medium-obj
)

target_link_options(psdr-ext PUBLIC -flto)