# Generate driver_config.h from the list of #defines
SET (driver_config_h "${CMAKE_CURRENT_BINARY_DIR}/driver_config.h")
FILE (WRITE ${driver_config_h} "// This file was automatically generated by the Player build system.\n")
FILE (APPEND ${driver_config_h} "// Any changes made to it will be overwritten.\n\n")
FILE (APPEND ${driver_config_h} "#define ON 1\n")
FOREACH (_define ${PLAYERDRIVER_DEFINES})
    # Blank line to keep things tidy
    FILE (APPEND ${driver_config_h} "\n")
    # Add the #define and its value if necessary
    IF (${_define})
        FILE (APPEND ${driver_config_h} "#define ${_define} ${${_define}}\n")
    ELSE (${_define})
        FILE (APPEND ${driver_config_h} "// #undef ${_define}\n")
    ENDIF (${_define})
ENDFOREACH (_define ${PLAYERDRIVER_DEFINES})
INCLUDE_DIRECTORIES (${CMAKE_CURRENT_BINARY_DIR})

# Generate the driver registry from the list of drivers
SET (driverregistry_cc "${CMAKE_CURRENT_BINARY_DIR}/driverregistry.cc")
FILE (WRITE ${driverregistry_cc} "// This file was automatically generated by the Player build system.\n")
FILE (APPEND ${driverregistry_cc} "// Any changes made to it will be overwritten.\n\n")
FILE (APPEND ${driverregistry_cc} "#include <libplayercore/playercore.h>\n\n")
FOREACH (driverName ${PLAYER_BUILT_DRIVERS})
    # Add the register function prototypes
    FILE (APPEND ${driverregistry_cc} "void ${driverName}_Register(DriverTable *table);\n")
ENDFOREACH (driverName ${PLAYER_BUILT_DRIVERS})
# Now call them
FILE (APPEND ${driverregistry_cc} "\nvoid player_register_drivers()\n{\n")
FOREACH (driverName ${PLAYER_BUILT_DRIVERS})
    FILE (APPEND ${driverregistry_cc} "  ${driverName}_Register(driverTable);\n")
ENDFOREACH (driverName ${PLAYER_BUILT_DRIVERS})
FILE (APPEND ${driverregistry_cc} "}\n")

# Create a list of the sources map
SET (allSourceNames ${PLAYER_BUILT_DRIVERS})
IF (PLAYER_BUILT_DRIVEREXTRAS)
    LIST (APPEND allSourceNames ${PLAYER_BUILT_DRIVEREXTRAS})
ENDIF (PLAYER_BUILT_DRIVEREXTRAS)
MAP_TO_LIST (driversSrcs "${allSourceNames}" PLAYER_DRIVERSLIB_SOURCES_MAP)
IF (NOT HAVE_CFMAKERAW)
  LIST (APPEND driversSrcs ${PROJECT_SOURCE_DIR}/replace/cfmakeraw.c)
ENDIF (NOT HAVE_CFMAKERAW)
IF (NOT HAVE_ROUND)
  LIST (APPEND driversSrcs ${PROJECT_SOURCE_DIR}/replace/round.c)
ENDIF (NOT HAVE_ROUND)

FILTER_DUPLICATES (driversSrcs "${driversSrcs}")

# Set lib-wide link and include directories
IF (PLAYER_DRIVERSLIB_INCLUDEDIRS)
    FILTER_EMPTY (driverIncludeDirs "${PLAYER_DRIVERSLIB_INCLUDEDIRS}")
    FILTER_DUPLICATES (driverIncludeDirs "${driverIncludeDirs}")
    INCLUDE_DIRECTORIES (${driverIncludeDirs})
ENDIF (PLAYER_DRIVERSLIB_INCLUDEDIRS)
IF (PLAYER_DRIVERSLIB_LIBDIRS)
    FILTER_EMPTY (driverLinkDirs "${PLAYER_DRIVERSLIB_LIBDIRS}")
    FILTER_DUPLICATES (driverLinkDirs "${driverLinkDirs}")
    LINK_DIRECTORIES (${driverLinkDirs})
ENDIF (PLAYER_DRIVERSLIB_LIBDIRS)

# Actually add the target
PLAYER_ADD_LIBRARY (playerdrivers ${driver_config_h} ${driverregistry_cc} ${driversSrcs})
TARGET_LINK_LIBRARIES (playerdrivers playercore playererror)
IF (HAVE_JPEG)
    TARGET_LINK_LIBRARIES (playerdrivers playerjpeg)
ENDIF (HAVE_JPEG)
IF (PLAYER_OS_SOLARIS)
    TARGET_LINK_LIBRARIES (playerdrivers rt)
ENDIF (PLAYER_OS_SOLARIS)

# Set C flags on source files that need them
FOREACH (driverName ${PLAYER_BUILT_DRIVERS})
    GET_FROM_GLOBAL_MAP (cFlags PLAYER_DRIVERSLIB_CFLAGS ${driverName})
    IF (cFlags)
        GET_FROM_GLOBAL_MAP (sourceFiles PLAYER_DRIVERSLIB_SOURCES_MAP ${driverName})
        SET_SOURCE_FILES_PROPERTIES (${sourceFiles} PROPERTIES
            COMPILE_FLAGS "${cFlags}")
    ENDIF (cFlags)
ENDFOREACH (driverName ${PLAYER_BUILT_DRIVERS})
FOREACH (extraName ${PLAYER_BUILT_DRIVEREXTRAS})
    GET_FROM_GLOBAL_MAP (cFlags PLAYER_DRIVERSLIB_CFLAGS ${extraName})
    IF (cFlags)
        GET_FROM_GLOBAL_MAP (sourceFiles PLAYER_DRIVERSLIB_SOURCES_MAP ${extraName})
        SET_SOURCE_FILES_PROPERTIES (${sourceFiles} PROPERTIES
            COMPILE_FLAGS "${cFlags}")
    ENDIF (cFlags)
ENDFOREACH (extraName ${PLAYER_BUILT_DRIVEREXTRAS})

# Set the link flags for the library appropriately
IF (PLAYER_DRIVERSLIB_LINKFLAGS)
    SET_TARGET_PROPERTIES(playerdrivers PROPERTIES
        LINK_FLAGS ${PLAYER_DRIVERSLIB_LINKFLAGS})
ENDIF (PLAYER_DRIVERSLIB_LINKFLAGS)

# Package config file for libplayerdrivers
PLAYER_MAKE_PKGCONFIG ("playerdrivers" "Player driver library - part of the Player Project" "playercore" "" "" "${PTHREAD_LIB}")

PLAYER_INSTALL_HEADERS (playerdrivers driverregistry.h)
