
set(INC
  ..
)
set(INC_SYS
)

# NOTE: LIBRARIES contains all the libraries which are common
# across release and debug build types, stored in a linking order.
set(LIBRARIES
  cycles_device
  cycles_kernel
  cycles_render
  cycles_bvh
  cycles_subd
  cycles_graph
  cycles_util
  ${BLENDER_GL_LIBRARIES}
  ${CYCLES_APP_GLEW_LIBRARY}
  ${PNG_LIBRARIES}
  ${JPEG_LIBRARIES}
  ${ZLIB_LIBRARIES}
  ${TIFF_LIBRARY}
  ${PTHREADS_LIBRARIES}
)

if(WITH_CUDA_DYNLOAD)
  list(APPEND LIBRARIES extern_cuew)
else()
  list(APPEND LIBRARIES ${CUDA_CUDA_LIBRARY})
endif()

if(WITH_CYCLES_OSL)
  list(APPEND LIBRARIES cycles_kernel_osl)
endif()

if(NOT CYCLES_STANDALONE_REPOSITORY)
  list(APPEND LIBRARIES bf_intern_glew_mx bf_intern_guardedalloc bf_intern_numaapi)
endif()

if(WITH_CYCLES_LOGGING)
  list(APPEND LIBRARIES
    ${GLOG_LIBRARIES}
    ${GFLAGS_LIBRARIES}
  )
endif()

if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
  list(APPEND LIBRARIES ${GLUT_LIBRARIES})
endif()

# Common configuration.

link_directories(${OPENIMAGEIO_LIBPATH}
                 ${BOOST_LIBPATH}
                 ${PNG_LIBPATH}
                 ${JPEG_LIBPATH}
                 ${ZLIB_LIBPATH}
                 ${TIFF_LIBPATH}
                 ${OPENEXR_LIBPATH}
                 ${OPENJPEG_LIBPATH})

if(WITH_OPENCOLORIO)
  link_directories(${OPENCOLORIO_LIBPATH})
endif()

add_definitions(${GL_DEFINITIONS})

include_directories(${INC})
include_directories(SYSTEM ${INC_SYS})

# Make sure given target is linked against proper libraries
# which varies across debug and release build types.
#
# This will also make sure dependencies of that libraries
# are sent to the linker after them.
#
# TODO(sergey): Think of a better place for this?
macro(cycles_target_link_libraries target)
  target_link_libraries(${target} ${LIBRARIES})
  if(WITH_CYCLES_OSL)
    target_link_libraries(${target} ${OSL_LIBRARIES} ${LLVM_LIBRARIES})
  endif()
  if(WITH_CYCLES_EMBREE)
    target_link_libraries(${target} ${EMBREE_LIBRARIES})
  endif()
  if(WITH_OPENSUBDIV)
    target_link_libraries(${target} ${OPENSUBDIV_LIBRARIES})
  endif()
  if(WITH_OPENCOLORIO)
    target_link_libraries(${target} ${OPENCOLORIO_LIBRARIES})
  endif()
  target_link_libraries(
    ${target}
    ${OPENIMAGEIO_LIBRARIES}
    ${OPENEXR_LIBRARIES}
    ${OPENJPEG_LIBRARIES}
    ${PUGIXML_LIBRARIES}
    ${BOOST_LIBRARIES}
    ${CMAKE_DL_LIBS}
    ${PLATFORM_LINKLIBS}
  )
endmacro()

# Application build targets

if(WITH_CYCLES_STANDALONE)
  set(SRC
    cycles_standalone.cpp
    cycles_xml.cpp
    cycles_xml.h
  )
  add_executable(cycles ${SRC})
  cycles_target_link_libraries(cycles)

  if(UNIX AND NOT APPLE)
    set_target_properties(cycles PROPERTIES INSTALL_RPATH $ORIGIN/lib)
  endif()
  unset(SRC)
endif()

if(WITH_CYCLES_NETWORK)
  set(SRC
    cycles_server.cpp
  )
  add_executable(cycles_server ${SRC})
  cycles_target_link_libraries(cycles_server)

  if(UNIX AND NOT APPLE)
    set_target_properties(cycles_server PROPERTIES INSTALL_RPATH $ORIGIN/lib)
  endif()
  unset(SRC)
endif()

if(WITH_CYCLES_CUBIN_COMPILER)
  # 32 bit windows is special, nvrtc is not supported on x86, so even
  # though we are building 32 bit blender a 64 bit cubin_cc will have
  # to be build to compile the cubins.
  if(MSVC AND NOT CMAKE_CL_64)
    message("Building with CUDA not supported on 32 bit, skipped")
    set(WITH_CYCLES_CUDA_BINARIES OFF CACHE BOOL "" FORCE)
  else()
    set(SRC
      cycles_cubin_cc.cpp
    )
    set(INC
      ../../../extern/cuew/include
    )
    add_executable(cycles_cubin_cc ${SRC})
    include_directories(${INC})
    target_link_libraries(cycles_cubin_cc
      extern_cuew
      ${OPENIMAGEIO_LIBRARIES}
      ${OPENEXR_LIBRARIES}
      ${OPENJPEG_LIBRARIES}
      ${PUGIXML_LIBRARIES}
      ${BOOST_LIBRARIES}
      ${PLATFORM_LINKLIBS}
    )
    if(NOT CYCLES_STANDALONE_REPOSITORY)
      target_link_libraries(cycles_cubin_cc bf_intern_guardedalloc)
    endif()
    unset(SRC)
    unset(INC)
  endif()
endif()
