cmake_minimum_required(VERSION 2.6)

project(lpcie_driver C)

set(LPCIE_DRIVER_VER_MAJOR 1)
set(LPCIE_DRIVER_VER_MINOR 0)
set(LPCIE_DRIVER_VER_REV   12)
set(LPCIE_DRIVER_VER_BUILD 0)
set(LPCIE_DRIVER_VERSION ${LPCIE_DRIVER_VER_MAJOR}.${LPCIE_DRIVER_VER_MINOR}.${LPCIE_DRIVER_VER_REV})





set(SOURCES    
    lpcie_streams.c
    lpcie_eeprom.c
    fast_crc.c
    )

set(HEADERS
    inc/lpcie_ioctls.h
    inc/lpcie_streams.h
    inc/lpcie_eeprom.h
    inc/l502_fpga_regs.h
    inc/lpcie_drv.h
    inc/fast_crc.h
    inc/fast_crc_cfg.h
    )

if(UNIX)
    set(SOURCES ${SOURCES}
        linux/lpcie_files.c
        linux/lpcie_init.c
        linux/lpcie_ioctls.c
    )
    set(HEADERS ${HEADERS}
        linux/lpcie_trace.h
    )

    set(EXTRA_FILES
        linux/Makefile.in
        linux/dkms-postinst.sh.in
        linux/dkms-postrem.sh.in
        linux/dkms-preinst.sh.in
    )
endif(UNIX)

if(WIN32)
    set(SOURCES ${SOURCES}
        win/lpcie.c
        win/lpcie_ioctls.c
        win/lpcie_files.c
    )
    set(HEADERS ${HEADERS}
        win/lpcie_trace.h)

    set(EXTRA_FILES
        win/makefile
        win/makefile.inc
        win/sources
        win/lpcie.inx
        win/lpcie.rc
    )
endif(WIN32)




if(UNIX)

    #цели для сборки debian-пакетов
    set(PACKAGE_NAME     lpcie-dkms)
    set(MODULE_NAME      lpcie)
    set(PACKAGE_VERSION  ${LPCIE_DRIVER_VERSION})
    set(PACKAGE_SRC_DIR   ${CMAKE_CURRENT_SOURCE_DIR}/linux)
    set(PACKAGE_CUSTOM_SRC_PREPARE ON)
    set(PACKAGE_ARCH_INSTALL_FILE ${PACKAGE_NAME}.install)


    include(${CMAKE_EXT_INCLUDE_DIR}/packages/packages.cmake)


    #set(PACKAGE_VER_NAME ${PACKAGE_NAME}-${PACKAGE_VERSION})
    #set(PACKAGE_SRC_TAR_NAME     ${PACKAGE_NAME}_${PACKAGE_VERSION}.tar.gz)

    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/inc/lpcie_version.h.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/lpcie_version.h @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/dkms-postinst.sh.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/dkms-postinst.sh @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/dkms-preinst.sh.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/dkms-preinst.sh @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/dkms-postrem.sh.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/dkms-postrem.sh @ONLY)
    #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/debian/changelog.in
    #               ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/changelog @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/debian/rules.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/rules @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/dkms.conf.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/${PACKAGE_NAME}.dkms @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/dkms.conf.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/dkms.conf @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/Makefile.in
                   ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/Makefile @ONLY)
    #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/debian/control.in
    #               ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME}/debian/control @ONLY)
    #configure_file(${CMAKE_CURRENT_SOURCE_DIR}/linux/rpm/${PACKAGE_NAME}.spec
    #               ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_NAME}.spec @ONLY)


     add_custom_command(OUTPUT ${PACKAGE_SRC_TAR_NAME}
        COMMAND cp -r ${CMAKE_CURRENT_SOURCE_DIR}/linux/debian/* ${PACKAGE_VER_NAME}/debian
        COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/linux/*.c ${PACKAGE_VER_NAME}
        COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/linux/*.h ${PACKAGE_VER_NAME}
        COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/linux/*.rules ${PACKAGE_VER_NAME}
        COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/*.c ${PACKAGE_VER_NAME}
        COMMAND cp ${CMAKE_CURRENT_SOURCE_DIR}/inc/* ${PACKAGE_VER_NAME}
        COMMAND chmod 644 ${PACKAGE_VER_NAME}/*.h
        COMMAND chmod 644 ${PACKAGE_VER_NAME}/*.c
        COMMAND chmod 644 ${PACKAGE_VER_NAME}/*.conf
        COMMAND chmod 644 ${PACKAGE_VER_NAME}/*.rules
        COMMAND chmod 644 ${PACKAGE_VER_NAME}/Makefile
        COMMAND chmod +x ${PACKAGE_VER_NAME}/*.sh
        COMMAND chmod +x ${PACKAGE_VER_NAME}/debian/rules
        COMMAND rm ${PACKAGE_VER_NAME}/debian/*.in
        COMMAND tar -caf ${PACKAGE_SRC_TAR_NAME} ${PACKAGE_VER_NAME}
        DEPENDS ${SOURCES} ${HEADERS} ${EXTRA_FILES}
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
        )

    add_custom_target(${PACKAGE_NAME}-src-prepare
        #копируем исходники, чтобы не засорять исходную папку результатами
        DEPENDS ${PACKAGE_SRC_TAR_NAME}
        )

    #ручная сборка (без dkms)
    add_custom_target(lpcie-drv
        COMMAND make all
        DEPENDS ${PACKAGE_NAME}-src-prepare
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME})

    #ручная установка (без dkms)
    add_custom_target(lpcie-drv-install
        COMMAND make install-drv
        DEPENDS lpcie-drv
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME})
    #очистка результатов ручной сборки
    add_custom_target(lpcie-drv-clean
        COMMAND make clean
        DEPENDS lpcie-drv
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME})

    #сборка с dkms
    add_custom_target(lpcie-dkms-install
        COMMAND make install
        DEPENDS ${PACKAGE_NAME}-src-prepare
        WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/${PACKAGE_VER_NAME})


endif(UNIX)


if(WIN32)
    #так как часть команд в Windows (в частности cp) понимает только \, то
    #заменяем в критичных путях / на \\\\
    set(DRIVER_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR})
    set(DRIVER_SRC_DIR ${CMAKE_CURRENT_SOURCE_DIR})
    string(REGEX REPLACE "/" "\\\\" DRIVER_BUILD_DIR ${DRIVER_BUILD_DIR})
    string(REGEX REPLACE "/" "\\\\" DRIVER_SRC_DIR ${DRIVER_SRC_DIR})
    string(REGEX REPLACE "/" "\\\\" DDK_DIR ${DDK_DIR})
    string(REGEX REPLACE "/" "\\\\" SIGN_CERT_CONV ${SIGN_CERT})
    string(REGEX REPLACE "/" "\\\\" SIGNTOOL_CONV ${SIGNTOOL})


    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/win/sources.in
                   ${CMAKE_CURRENT_BINARY_DIR}/win/sources @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/win/makefile.inc.in
                   ${CMAKE_CURRENT_BINARY_DIR}/win/makefile.inc @ONLY)
    configure_file(${CMAKE_CURRENT_SOURCE_DIR}/inc/lpcie_version.h.in
                   ${CMAKE_CURRENT_BINARY_DIR}/win/lpcie_version.h @ONLY)

add_custom_target(driver_pci
    #создаем нужные директории для копирования исходников драйвера
    #чтобы отделить результаты компиляции от исходников
    #(утилита build не поддерживает сборку вне исходников)
    COMMAND cmd /c "if not exist inc mkdir inc"
    COMMAND cmd /c "if not exist win mkdir win"
    COMMAND cd ${CMAKE_CURRENT_BINARY_DIR}/win
    COMMAND cmd /c "if not exist installer mkdir installer"
    COMMAND copy ${DRIVER_SRC_DIR} ${DRIVER_BUILD_DIR}
    COMMAND copy "${DRIVER_SRC_DIR}\\\\win" "${DRIVER_BUILD_DIR}\\\\win"
    COMMAND copy "${DRIVER_SRC_DIR}\\\\inc" "${DRIVER_BUILD_DIR}\\\\inc"
    COMMAND copy "${DRIVER_SRC_DIR}\\\\win\\\\installer" "${DRIVER_BUILD_DIR}\\\\win\\\\installer"
    COMMAND set DDKDIR=${DDK_DIR}
    #собираем драйвера с помощью скрипта
    COMMAND ${CMAKE_CURRENT_BINARY_DIR}/win/makedrv.bat
    DEPENDS ${SOURCES}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    )
endif(WIN32)




