project(ajantv2)

if(CMAKE_CXX_STANDARD LESS 11)
    remove_definitions(
        -DAJA_USE_CPLUSPLUS11
        -DNTV2_USE_CPLUSPLUS11)
endif()

remove_definitions(
    -DUNICODE
    -D_UNICODE
    -DQT_LARGEFILE_SUPPORT)

set(AJANTV2_TARGET_INCLUDE_DIRS
    includes
    ${AJA_LIB_ANC_ROOT}/includes
    ${AJA_LIBRARIES_ROOT}
    ${AJA_LIB_BASE_ROOT}
    ${CMAKE_CURRENT_BINARY_DIR})

# ajantv2
set(AJANTV2_HEADERS
    includes/ajaexport.h
    includes/ajatypes.h
    includes/basemachinecontrol.h
    includes/ntv2audiodefines.h
    includes/ntv2bft.h
    includes/ntv2bitfile.h
    includes/ntv2bitfilemanager.h
    includes/ntv2boardfeatures.h
    includes/ntv2boardscan.h
    includes/ntv2card.h
    includes/ntv2choosableboard.h
    includes/ntv2config2022.h
    includes/ntv2config2110.h
    includes/ntv2configts2022.h
    includes/ntv2cscmatrix.h
    includes/ntv2debug.h
    includes/ntv2debugmacros.h
    includes/ntv2devicefeatures.h
    includes/ntv2devicefeatures.hh # generated by sdkgen
    src/ntv2devicefeatures.hpp # generated by sdkgen
    includes/ntv2devicescanner.h
    includes/ntv2discover.h
    includes/ntv2driverinterface.h
    includes/ntv2endian.h
    includes/ntv2enhancedcsc.h
    includes/ntv2enums.h
    includes/ntv2fixed.h
    includes/ntv2formatdescriptor.h
    includes/ntv2konaflashprogram.h
    includes/ntv2m31enums.h
    includes/ntv2m31publicinterface.h
    includes/ntv2mailbox.h
    includes/ntv2mbcontroller.h
    includes/ntv2mcsfile.h
    includes/ntv2nubaccess.h
    includes/ntv2nubpktcom.h
    includes/ntv2nubtypes.h
    includes/ntv2publicinterface.h
    includes/ntv2registerexpert.h
    includes/ntv2registers2022.h
    includes/ntv2registers2110.h
    includes/ntv2registersmb.h
    includes/ntv2resample.h
    includes/ntv2routingexpert.h
    includes/ntv2rp188.h
    includes/ntv2rp215.h
    includes/ntv2serialcontrol.h
    includes/ntv2signalrouter.h
    includes/ntv2spiinterface.h
    includes/ntv2supportlogger.h
    includes/ntv2task.h
    includes/ntv2testpatterngen.h
    includes/ntv2transcode.h
    includes/ntv2tshelper.h
    includes/ntv2utf8.h
    includes/ntv2utils.h
    includes/ntv2verticalfilter.h
    includes/ntv2videodefines.h
    includes/ntv2virtualregisters.h
    includes/ntv2vpid.h
    includes/ntv2vpidfromspec.h)
set(AJANTV2_SOURCES
    src/ntv2anc.cpp
    src/ntv2audio.cpp
    src/ntv2autocirculate.cpp
    src/ntv2bitfile.cpp
    src/ntv2bitfilemanager.cpp
    src/ntv2card.cpp
    src/ntv2config2022.cpp
    src/ntv2config2110.cpp
    src/ntv2configts2022.cpp
    src/ntv2csclut.cpp
    src/ntv2cscmatrix.cpp
    src/ntv2debug.cpp
    src/ntv2devicefeatures.cpp
    src/ntv2devicescanner.cpp
    src/ntv2discover.cpp
    src/ntv2dma.cpp
    src/ntv2driverinterface.cpp
    src/ntv2dynamicdevice.cpp
    src/ntv2enhancedcsc.cpp
    src/ntv2formatdescriptor.cpp
    src/ntv2hdmi.cpp
    src/ntv2hevc.cpp
    src/ntv2interrupts.cpp
    src/ntv2konaflashprogram.cpp
    src/ntv2mailbox.cpp
    src/ntv2mbcontroller.cpp
    src/ntv2mcsfile.cpp
    src/ntv2nubaccess.cpp
    src/ntv2nubpktcom.cpp
    src/ntv2publicinterface.cpp
    src/ntv2register.cpp
    src/ntv2registerexpert.cpp
    src/ntv2resample.cpp
    src/ntv2routingexpert.cpp
    src/ntv2rp188.cpp
    src/ntv2rp215.cpp
    src/ntv2serialcontrol.cpp
    src/ntv2signalrouter.cpp
    src/ntv2spiinterface.cpp
    src/ntv2subscriptions.cpp
    src/ntv2supportlogger.cpp
    src/ntv2task.cpp
    src/ntv2testpatterngen.cpp
    src/ntv2transcode.cpp
    src/ntv2utf8.cpp
    src/ntv2utils.cpp
    src/ntv2verticalfilter.cpp
    src/ntv2vpid.cpp
    src/ntv2vpidfromspec.cpp)
# ntv2driverinterface/publicinterface
set(AJANTV2_WIN_HEADERS
    src/win/ntv2windriverinterface.h
    src/win/ntv2winpublicinterface.h)
set(AJANTV2_WIN_SOURCES
    # src/win/dllmain.cpp
    src/win/ntv2windriverinterface.cpp)
set(AJANTV2_MAC_HEADERS
    src/mac/ntv2macdriverinterface.h
    src/mac/ntv2macpublicinterface.h)
set(AJANTV2_MAC_SOURCES
    src/mac/ntv2macdriverinterface.cpp)
set(AJANTV2_LIN_HEADERS
    src/lin/ntv2linuxdriverinterface.h
    src/lin/ntv2linuxpublicinterface.h)
set(AJANTV2_LIN_SOURCES
    src/lin/ntv2linuxdriverinterface.cpp)
# ajantv2 utilityfiles
set(AJANTV2_UTILITY_PUBLIC_HEADERS
    utilityfiles/public/ntv2firmwareinstallerthread.h
    utilityfiles/public/ntv2hevcfirmwareinstallerthread.h)
set(AJANTV2_UTILITY_PUBLIC_SOURCES
    utilityfiles/public/ntv2firmwareinstallerthread.cpp
    utilityfiles/public/ntv2hevcfirmwareinstallerthread.cpp)
# ajantv2 hevc
if (NOT AJA_BUILD_OPENSOURCE)
    aja_message(STATUS "added ajantv2 HEVC/M31 codec")
    set(AJANTV2_HEVC_HEADERS
        codecs/hevc/m31/ntv2m31.h
        codecs/hevc/m31/ntv2m31cparam.h
        codecs/hevc/m31/ntv2m31ehparam.h
        codecs/hevc/m31/ntv2m31vaparam.h
        codecs/hevc/m31/ntv2m31vinparam.h
        codecs/hevc/m31/ntv2m31viparam.h)
    set(AJANTV2_HEVC_SOURCES
        codecs/hevc/m31/ntv2m31.cpp
        codecs/hevc/m31/ntv2m31cparam.cpp
        codecs/hevc/m31/ntv2m31ehparam.cpp
        codecs/hevc/m31/ntv2m31vaparam.cpp
        codecs/hevc/m31/ntv2m31vinparam.cpp
        codecs/hevc/m31/ntv2m31viparam.cpp)
    # `cmake --install` deployments
    if (AJA_INSTALL_HEADERS)
        install(FILES ${AJANTV2_HEVC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/codecs/hevc/m31)
    endif()
    if (AJA_INSTALL_SOURCES)
        install(FILES ${AJANTV2_HEVC_SOURCES} DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/codecs/hevc/m31)
    endif()
endif()

if (AJA_BUILDING_CMAKE)
    add_definitions(-DAJA_BUILDING_CMAKE)
    configure_file(includes/version.h.in includes/version.h @ONLY)
    install(FILES ${CMAKE_BINARY_DIR}/ajalibraries/ajantv2/includes/version.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/includes)
endif()

# ajaanc
set(AJAANC_HEADERS
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydatafactory.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_cea608.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_cea608_line21.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_cea608_vanc.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_cea708.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_framestatusinfo524D.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_framestatusinfo5251.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_hdr_hdr10.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_hdr_hlg.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_hdr_sdr.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_timecode.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_timecode_atc.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarydata_timecode_vitc.h
    ${AJA_LIB_ANC_ROOT}/includes/ancillarylist.h)
set(AJAANC_SOURCES
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydatafactory.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_cea608.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_cea608_line21.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_cea608_vanc.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_cea708.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_framestatusinfo524D.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_framestatusinfo5251.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_hdr_hdr10.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_hdr_hlg.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_hdr_sdr.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_timecode.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_timecode_atc.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarydata_timecode_vitc.cpp
    ${AJA_LIB_ANC_ROOT}/src/ancillarylist.cpp)

# ajabase
set(AJABASE_COMMON_HEADERS
    ${AJA_LIB_BASE_ROOT}/common/ajarefptr.h
    ${AJA_LIB_BASE_ROOT}/common/audioutilities.h
    ${AJA_LIB_BASE_ROOT}/common/buffer.h
    ${AJA_LIB_BASE_ROOT}/common/bytestream.h
    ${AJA_LIB_BASE_ROOT}/common/circularbuffer.h
    ${AJA_LIB_BASE_ROOT}/common/cli_utils.h
    ${AJA_LIB_BASE_ROOT}/common/common.h
    ${AJA_LIB_BASE_ROOT}/common/dpxfileio.h
    ${AJA_LIB_BASE_ROOT}/common/dpx_hdr.h
    ${AJA_LIB_BASE_ROOT}/common/export.h
    ${AJA_LIB_BASE_ROOT}/common/guid.h
    ${AJA_LIB_BASE_ROOT}/common/options_popt.h
    ${AJA_LIB_BASE_ROOT}/common/performance.h
    ${AJA_LIB_BASE_ROOT}/common/pixelformat.h
    ${AJA_LIB_BASE_ROOT}/common/public.h
    ${AJA_LIB_BASE_ROOT}/common/rawfile.h
    ${AJA_LIB_BASE_ROOT}/common/testpatterngen.h
    ${AJA_LIB_BASE_ROOT}/common/timebase.h
    ${AJA_LIB_BASE_ROOT}/common/timecode.h
    ${AJA_LIB_BASE_ROOT}/common/timecodeburn.h
    ${AJA_LIB_BASE_ROOT}/common/timer.h
    ${AJA_LIB_BASE_ROOT}/common/types.h
    ${AJA_LIB_BASE_ROOT}/common/videotypes.h
    ${AJA_LIB_BASE_ROOT}/common/videoutilities.h
    ${AJA_LIB_BASE_ROOT}/common/wavewriter.h)
set(AJABASE_NETWORK_HEADERS
    ${AJA_LIB_BASE_ROOT}/network/ip_socket.h
    ${AJA_LIB_BASE_ROOT}/network/tcp_socket.h
    ${AJA_LIB_BASE_ROOT}/network/udp_socket.h)
set(AJABASE_PERSISTENCE_HEADERS
    ${AJA_LIB_BASE_ROOT}/persistence/persistence.h
    ${AJA_LIB_BASE_ROOT}/persistence/sqlite3.h)
set(AJABASE_PNP_HEADERS
    ${AJA_LIB_BASE_ROOT}/pnp/pnp.h)
set(AJABASE_SYS_HEADERS
    ${AJA_LIB_BASE_ROOT}/system/atomic.h
    ${AJA_LIB_BASE_ROOT}/system/debug.h
    ${AJA_LIB_BASE_ROOT}/system/debugshare.h
    ${AJA_LIB_BASE_ROOT}/system/diskstatus.h
    ${AJA_LIB_BASE_ROOT}/system/event.h
    ${AJA_LIB_BASE_ROOT}/system/file_io.h
    ${AJA_LIB_BASE_ROOT}/system/info.h
    ${AJA_LIB_BASE_ROOT}/system/lock.h
    ${AJA_LIB_BASE_ROOT}/system/log.h
    ${AJA_LIB_BASE_ROOT}/system/make_unique_shim.h
    ${AJA_LIB_BASE_ROOT}/system/memory.h
    ${AJA_LIB_BASE_ROOT}/system/process.h
    ${AJA_LIB_BASE_ROOT}/system/system.h
    ${AJA_LIB_BASE_ROOT}/system/systemtime.h
    ${AJA_LIB_BASE_ROOT}/system/thread.h)
set(AJABASE_COMMON_SOURCES
    ${AJA_LIB_BASE_ROOT}/common/audioutilities.cpp
    ${AJA_LIB_BASE_ROOT}/common/buffer.cpp
    ${AJA_LIB_BASE_ROOT}/common/common.cpp
    ${AJA_LIB_BASE_ROOT}/common/dpxfileio.cpp
    ${AJA_LIB_BASE_ROOT}/common/dpx_hdr.cpp
    ${AJA_LIB_BASE_ROOT}/common/guid.cpp
    ${AJA_LIB_BASE_ROOT}/common/options_popt.cpp
    ${AJA_LIB_BASE_ROOT}/common/performance.cpp
    ${AJA_LIB_BASE_ROOT}/common/pixelformat.cpp
    ${AJA_LIB_BASE_ROOT}/common/testpatterngen.cpp
    ${AJA_LIB_BASE_ROOT}/common/timebase.cpp
    ${AJA_LIB_BASE_ROOT}/common/timecode.cpp
    ${AJA_LIB_BASE_ROOT}/common/timecodeburn.cpp
    ${AJA_LIB_BASE_ROOT}/common/timer.cpp
    ${AJA_LIB_BASE_ROOT}/common/videoutilities.cpp
    ${AJA_LIB_BASE_ROOT}/common/wavewriter.cpp)
set(AJABASE_NETWORK_SOURCES
    ${AJA_LIB_BASE_ROOT}/network/ip_socket.cpp
    ${AJA_LIB_BASE_ROOT}/network/tcp_socket.cpp
    ${AJA_LIB_BASE_ROOT}/network/udp_socket.cpp)
set(AJABASE_PERSISTENCE_SOURCES
    ${AJA_LIB_BASE_ROOT}/persistence/persistence.cpp
    ${AJA_LIB_BASE_ROOT}/persistence/sqlite3.c)
set(AJABASE_PNP_SOURCES
    ${AJA_LIB_BASE_ROOT}/pnp/pnp.cpp)
set(AJABASE_SYS_SOURCES
    ${AJA_LIB_BASE_ROOT}/system/atomic.cpp
    ${AJA_LIB_BASE_ROOT}/system/debug.cpp
    ${AJA_LIB_BASE_ROOT}/system/diskstatus.cpp
    ${AJA_LIB_BASE_ROOT}/system/event.cpp
    ${AJA_LIB_BASE_ROOT}/system/file_io.cpp
    ${AJA_LIB_BASE_ROOT}/system/info.cpp
    ${AJA_LIB_BASE_ROOT}/system/lock.cpp
    ${AJA_LIB_BASE_ROOT}/system/log.cpp
    ${AJA_LIB_BASE_ROOT}/system/memory.cpp
    ${AJA_LIB_BASE_ROOT}/system/process.cpp
    ${AJA_LIB_BASE_ROOT}/system/system.cpp
    ${AJA_LIB_BASE_ROOT}/system/systemtime.cpp
    ${AJA_LIB_BASE_ROOT}/system/thread.cpp)
# ajabase windows
set(AJABASE_PNP_WIN_HEADERS
    ${AJA_LIB_BASE_ROOT}/pnp/windows/pnpimpl.h)
set(AJABASE_PNP_WIN_SOURCES
    ${AJA_LIB_BASE_ROOT}/pnp/windows/pnpimpl.cpp)
set(AJABASE_SYS_WIN_HEADERS
    ${AJA_LIB_BASE_ROOT}/system/windows/eventimpl.h
    ${AJA_LIB_BASE_ROOT}/system/windows/infoimpl.h
    ${AJA_LIB_BASE_ROOT}/system/windows/lockimpl.h
    ${AJA_LIB_BASE_ROOT}/system/windows/processimpl.h
    ${AJA_LIB_BASE_ROOT}/system/windows/threadimpl.h)
set(AJABASE_SYS_WIN_SOURCES
    ${AJA_LIB_BASE_ROOT}/system/windows/eventimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/windows/infoimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/windows/lockimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/windows/processimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/windows/threadimpl.cpp)
# ajabase linux
set(AJABASE_PNP_LIN_HEADERS
    ${AJA_LIB_BASE_ROOT}/pnp/linux/pnpimpl.h)
set(AJABASE_PNP_LIN_SOURCES
    ${AJA_LIB_BASE_ROOT}/pnp/linux/pnpimpl.cpp)
set(AJABASE_SYS_LIN_HEADERS
    ${AJA_LIB_BASE_ROOT}/system/linux/eventimpl.h
    ${AJA_LIB_BASE_ROOT}/system/linux/infoimpl.h
    ${AJA_LIB_BASE_ROOT}/system/linux/lockimpl.h
    ${AJA_LIB_BASE_ROOT}/system/linux/processimpl.h
    ${AJA_LIB_BASE_ROOT}/system/linux/threadimpl.h)
set(AJABASE_SYS_LIN_SOURCES
    ${AJA_LIB_BASE_ROOT}/system/linux/eventimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/linux/infoimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/linux/lockimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/linux/processimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/linux/threadimpl.cpp)
# ajabase mac
set(AJABASE_PNP_MAC_HEADERS
    ${AJA_LIB_BASE_ROOT}/pnp/mac/devicenotifier.h
    ${AJA_LIB_BASE_ROOT}/pnp/mac/masterport.h
    ${AJA_LIB_BASE_ROOT}/pnp/mac/pnpimpl.h)
set(AJABASE_PNP_MAC_SOURCES
    ${AJA_LIB_BASE_ROOT}/pnp/mac/devicenotifier.cpp
    ${AJA_LIB_BASE_ROOT}/pnp/mac/masterport.cpp
    ${AJA_LIB_BASE_ROOT}/pnp/mac/pnpimpl.cpp)
set(AJABASE_SYS_MAC_HEADERS
    ${AJA_LIB_BASE_ROOT}/system/mac/eventimpl.h
    ${AJA_LIB_BASE_ROOT}/system/mac/infoimpl.h
    ${AJA_LIB_BASE_ROOT}/system/mac/lockimpl.h
    ${AJA_LIB_BASE_ROOT}/system/mac/processimpl.h
    ${AJA_LIB_BASE_ROOT}/system/mac/pthreadsextra.h
    ${AJA_LIB_BASE_ROOT}/system/mac/threadimpl.h)
set(AJABASE_SYS_MAC_SOURCES
    ${AJA_LIB_BASE_ROOT}/system/mac/eventimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/mac/infoimpl.mm
    ${AJA_LIB_BASE_ROOT}/system/mac/lockimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/mac/processimpl.cpp
    ${AJA_LIB_BASE_ROOT}/system/mac/pthreadsextra.cpp
    ${AJA_LIB_BASE_ROOT}/system/mac/threadimpl.cpp)
set(AJABASE_HEADERS
    ${AJABASE_COMMON_HEADERS}
    ${AJABASE_NETWORK_HEADERS}
    ${AJABASE_PERSISTENCE_HEADERS}
    ${AJABASE_PNP_HEADERS}
    ${AJABASE_SYS_HEADERS})
set(AJABASE_SOURCES
    ${AJABASE_COMMON_SOURCES}
    ${AJABASE_NETWORK_SOURCES}
    ${AJABASE_PERSISTENCE_SOURCES}
    ${AJABASE_PNP_SOURCES}
    ${AJABASE_SYS_SOURCES})

if (CMAKE_SYSTEM_NAME STREQUAL "Windows")
    remove_definitions(-DUNICODE -D_UNICODE)

    set(TARGET_COMPILE_DEFS
        -D_MBCS
        -DCRT_NONSTDC_DEPRECATE
        -D_WINSOCK_DEPRECATED_NO_WARNINGS
        -DAJA_NO_AUTOIMPORT)
    set(TARGET_COMPILE_DEFS_STATIC
        ${TARGET_COMPILE_DEFS}
        -DAJASTATIC)
    set(TARGET_COMPILE_DEFS_DYNAMIC
        ${TARGET_COMPILE_DEFS}
        -DAJADLL
        -DAJA_WINDLL
        -DAJADLL_BUILD)

    list(APPEND AJANTV2_TARGET_INCLUDE_DIRS
        src/win
        ${AJA_LIB_BASE_ROOT}/pnp/windows
        ${AJA_LIB_BASE_ROOT}/system/windows)

    set(AJANTV2_HEADERS
        ${AJANTV2_HEADERS}
        ${AJANTV2_WIN_HEADERS})
    set(AJABASE_HEADERS
        ${AJABASE_HEADERS}
        ${AJABASE_PNP_WIN_HEADERS}
        ${AJABASE_SYS_WIN_HEADERS})
    set(AJANTV2_SOURCES
        ${AJANTV2_SOURCES}
        ${AJANTV2_WIN_SOURCES})
    set(AJABASE_SOURCES
        ${AJABASE_SOURCES}
        ${AJABASE_PNP_WIN_SOURCES}
        ${AJABASE_SYS_WIN_SOURCES})

    set(TARGET_LINK_LIBS
        advapi32 comctl32 netapi32
        odbc32 psapi rpcrt4 setupapi shell32
        shlwapi user32 winmm ws2_32 wsock32)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Linux")
    set(TARGET_COMPILE_DEFS_STATIC
        -DAJASTATIC)
    set(TARGET_COMPILE_DEFS_DYNAMIC
        -DAJADLL_BUILD
        -DAJADLL_BUILD)

    list(APPEND AJANTV2_TARGET_INCLUDE_DIRS
        src/lin
        ${AJA_LIB_BASE_ROOT}/pnp/linux
        ${AJA_LIB_BASE_ROOT}/system/linux)

    set(AJANTV2_HEADERS
        ${AJANTV2_HEADERS}
        ${AJANTV2_LIN_HEADERS})
    set(AJABASE_HEADERS
        ${AJABASE_HEADERS}
        ${AJABASE_PNP_LIN_HEADERS}
        ${AJABASE_SYS_LIN_HEADERS})
    set(AJANTV2_SOURCES
        ${AJANTV2_SOURCES}
        ${AJANTV2_LIN_SOURCES})
    set(AJABASE_SOURCES
        ${AJABASE_SOURCES}
        ${AJABASE_PNP_LIN_SOURCES}
        ${AJABASE_SYS_LIN_SOURCES})

    set(TARGET_LINK_LIBS
        rt)
elseif (CMAKE_SYSTEM_NAME STREQUAL "Darwin")
    set(TARGET_COMPILE_DEFS_STATIC
        -DAJASTATIC)

    set(TARGET_COMPILE_DEFS_DYNAMIC
        -DAJADLL_BUILD
        -DAJADLL_BUILD)

    list(APPEND AJANTV2_TARGET_INCLUDE_DIRS
        src/mac
        ${AJA_LIB_BASE_ROOT}/pnp/mac
        ${AJA_LIB_BASE_ROOT}/system/mac
        /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include)

    set(AJANTV2_HEADERS
        ${AJANTV2_HEADERS}
        ${AJANTV2_MAC_HEADERS})
    set(AJABASE_HEADERS
        ${AJABASE_HEADERS}
        ${AJABASE_PNP_MAC_HEADERS}
        ${AJABASE_SYS_MAC_HEADERS})
    set(AJANTV2_SOURCES
        ${AJANTV2_SOURCES}
        ${AJANTV2_MAC_SOURCES})
    set(AJABASE_SOURCES
        ${AJABASE_SOURCES}
        ${AJABASE_PNP_MAC_SOURCES}
        ${AJABASE_SYS_MAC_SOURCES})

    find_library(CORE_FOUNDATION_FRAMEWORK CoreFoundation)
    find_library(FOUNDATION_FRAMEWORK Foundation)
    find_library(IOKIT_FRAMEWORK IoKit)

    set(TARGET_LINK_LIBS
        ${CORE_FOUNDATION_FRAMEWORK}
        ${IOKIT_FRAMEWORK}
        ${FOUNDATION_FRAMEWORK})
endif()

set(AJANTV2_TARGET_SOURCES
    ${AJAANC_SOURCES}
    ${AJAANC_HEADERS}
    ${AJABASE_SOURCES}
    ${AJABASE_HEADERS}
    ${AJANTV2_SOURCES}
    ${AJANTV2_HEADERS})
if (NOT AJA_BUILD_OPENSOURCE)
    set(AJANTV2_TARGET_SOURCES
        ${AJANTV2_TARGET_SOURCES}
        ${AJANTV2_HEVC_HEADERS}
        ${AJANTV2_HEVC_SOURCES})
endif()

# libajantv2
set(BUILD_TARGETS ajantv2)
add_library(ajantv2 STATIC ${AJANTV2_TARGET_SOURCES})
target_include_directories(ajantv2 PUBLIC ${AJANTV2_TARGET_INCLUDE_DIRS})
target_link_libraries(ajantv2 PUBLIC ${TARGET_LINK_LIBS})
target_compile_definitions(ajantv2 PUBLIC ${TARGET_COMPILE_DEFS_STATIC})
if (AJA_NTV2_SDK_GEN)
    aja_ntv2_sdk_gen(ajantv2)
endif()
if (AJA_BUILD_SHARED)
    list(APPEND BUILD_TARGETS ajantv2-dyn)
    add_library(ajantv2-dyn SHARED ${AJANTV2_TARGET_SOURCES})
    target_compile_definitions(ajantv2-dyn PUBLIC ${TARGET_COMPILE_DEFS_DYNAMIC})
    target_include_directories(ajantv2-dyn PUBLIC ${AJANTV2_TARGET_INCLUDE_DIRS})
    target_link_libraries(ajantv2-dyn PUBLIC ${TARGET_LINK_LIBS} ${EXTRA_DYNAMIC_LIBRARIES})
    set_target_properties(ajantv2-dyn PROPERTIES OUTPUT_NAME "${PROJECT_NAME}_${AJA_NTV2_SDK_VERSION_MAJOR}")
    if (AJA_NTV2_SDK_GEN)
        aja_ntv2_sdk_gen(ajantv2-dyn)
    endif()
endif()

add_library(ajabase INTERFACE)

# `cmake --install` deployments
if (AJA_INSTALL_HEADERS)
    list(REMOVE_ITEM AJANTV2_HEADERS src/ntv2devicefeatures.hpp)
    install(FILES ${AJABASE_COMMON_HEADERS}         DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/common)
    install(FILES ${AJABASE_NETWORK_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/network)
    install(FILES ${AJABASE_PERSISTENCE_HEADERS}    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/persistence)
    install(FILES ${AJABASE_PNP_HEADERS}            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/pnp)
    install(FILES ${AJABASE_PNP_WIN_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/pnp/windows)
    install(FILES ${AJABASE_PNP_MAC_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/pnp/mac)
    install(FILES ${AJABASE_PNP_LIN_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/pnp/linux)
    install(FILES ${AJABASE_SYS_HEADERS}            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/system)
    install(FILES ${AJABASE_SYS_WIN_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/system/windows)
    install(FILES ${AJABASE_SYS_MAC_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/system/mac)
    install(FILES ${AJABASE_SYS_LIN_HEADERS}        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajabase/system/linux)
    install(FILES ${AJAANC_HEADERS}                 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajaanc/includes)
    install(FILES ${AJANTV2_HEADERS}                DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/includes)
    install(FILES ${AJANTV2_WIN_HEADERS}            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/src/win)
    install(FILES ${AJANTV2_MAC_HEADERS}            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/src/mac)
    install(FILES ${AJANTV2_LIN_HEADERS}            DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/src/lin)
    install(FILES ${AJANTV2_UTILITY_PUBLIC_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/utilityfiles/public)
    if (AJA_BUILDING_CMAKE)
        install(FILES includes/version.h.in             DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/ajalibraries/ajantv2/includes)
    endif()
endif()
if (AJA_INSTALL_SOURCES)
    list(APPEND AJANTV2_SOURCES src/ntv2devicefeatures.hpp)
    list(APPEND AJANTV2_WIN_SOURCES src/win/dllmain.cpp)
    install(FILES CMakeLists.txt                    DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2)
    install(FILES ${AJABASE_COMMON_SOURCES}         DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/common)
    install(FILES ${AJABASE_NETWORK_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/network)
    install(FILES ${AJABASE_PERSISTENCE_SOURCES}    DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/persistence)
    install(FILES ${AJABASE_PNP_SOURCES}            DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/pnp)
    install(FILES ${AJABASE_PNP_WIN_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/pnp/windows)
    install(FILES ${AJABASE_PNP_MAC_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/pnp/mac)
    install(FILES ${AJABASE_PNP_LIN_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/pnp/linux)
    install(FILES ${AJABASE_SYS_SOURCES}            DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/system)
    install(FILES ${AJABASE_SYS_WIN_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/system/windows)
    install(FILES ${AJABASE_SYS_MAC_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/system/mac)
    install(FILES ${AJABASE_SYS_LIN_SOURCES}        DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajabase/system/linux)
    install(FILES ${AJAANC_SOURCES}                 DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajaanc/src)
    install(FILES ${AJANTV2_SOURCES}                DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/src)
    install(FILES ${AJANTV2_WIN_SOURCES}            DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/src/win)
    install(FILES ${AJANTV2_MAC_SOURCES}            DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/src/mac)
    install(FILES ${AJANTV2_LIN_SOURCES}            DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/src/lin)
    install(FILES ${AJANTV2_UTILITY_PUBLIC_SOURCES} DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/utilityfiles/public)
    # build stuff
    install(FILES ${AJA_CMAKE_DIR}/../ajalibraries/ajantv2/build/Makefile DESTINATION ${CMAKE_INSTALL_PREFIX}/ajalibraries/ajantv2/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/common.mk                     DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/configure.mk                  DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/internal.mk                   DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/qt.mk                         DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/sdkversion.mk                 DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
    install(FILES ${AJA_CMAKE_DIR}/../build/targets.mk                    DESTINATION ${CMAKE_INSTALL_PREFIX}/build)
endif()

install(TARGETS ${BUILD_TARGETS}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR}
    PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})

if (AJA_CODE_SIGN)
    aja_code_sign(ajantv2-dyn)
endif()
