project(librdf)

cmake_minimum_required(VERSION 2.8)

set(REDLAND_VERSION_MAJOR 1)
set(REDLAND_VERSION_MINOR 0)
set(REDLAND_VERSION_RELEASE 14)
set(VERSION ${REDLAND_VERSION_MAJOR}.${REDLAND_VERSION_MINOR}.${REDLAND_VERSION_RELEASE})
math(EXPR REDLAND_VERSION_DECIMAL "${REDLAND_VERSION_MAJOR} * 10000 + ${REDLAND_VERSION_MINOR} * 100 + ${REDLAND_VERSION_RELEASE}")


set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/modules)
find_package(Threads REQUIRED)
if(CMAKE_USE_PTHREADS_INIT)
    set(PTHREADS_WIN32_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
    set(PTHREADS_WIN32_INCLUDE_DIR .)
else(CMAKE_USE_PTHREADS_INIT)
    find_package(PThreadsWin32 REQUIRED)
endif(CMAKE_USE_PTHREADS_INIT)
find_package(Raptor 2.0 REQUIRED)
find_package(Rasqal REQUIRED)
find_package(Sqlite REQUIRED)

option(BUILD_STATIC "build a static librdf" OFF)
option(BUILD_TESTS "build test executables for rdf" ON)
option(BUILD_TOOLS "build tools for librdf" ON)

if(BUILD_TESTS)
    enable_testing()
endif(BUILD_TESTS)

if(MSVC)
    add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
endif(MSVC)

add_definitions(-DSTORAGE_FILE=1 -DSTORAGE_HASHES=1 -DSTORAGE_TREES=1 -DSTORAGE_MEMORY=1)

include_directories(
    src
    utils
    ${PTHREADS_WIN32_INCLUDE_DIR}
    ${RAPTOR_INCLUDE_DIR}
    ${RASQAL_INCLUDE_DIR}
    ${SQLITE_INCLUDE_DIR}
)

set(librdf_SRCS
    src/rdf_init.c
    src/rdf_raptor.c
    src/rdf_uri.c
    src/rdf_digest.c
    src/rdf_hash.c
    src/rdf_hash_cursor.c
    src/rdf_hash_memory.c
    src/rdf_model.c
    src/rdf_model_storage.c
    src/rdf_iterator.c
    src/rdf_concepts.c
    src/rdf_list.c
    src/rdf_storage.c
    src/rdf_storage_sql.c
    src/rdf_stream.c
    src/rdf_parser.c
    src/rdf_parser_raptor.c
    src/rdf_heuristics.c
    src/rdf_files.c
    src/rdf_utf8.c
    src/rdf_query.c
    src/rdf_query_results.c
    src/rdf_query_rasqal.c
    src/rdf_serializer.c
    src/rdf_serializer_raptor.c
    src/rdf_log.c
    src/rdf_node_common.c
    src/rdf_statement_common.c
    src/rdf_node.c
    src/rdf_statement.c
    src/rdf_digest_md5.c
    src/rdf_digest_sha1.c
    src/rdf_parser_raptor.c
    src/rdf_storage_list.c
    src/rdf_storage_hashes.c
    src/rdf_storage_trees.c
    src/rdf_storage_file.c
# theoretically it should be possible to build all storages, but we don't care I think
    src/rdf_storage_sqlite.c
)
#    src/rdf_hash_bdb.c

set(rdf_HDRS 
    src/redland.h
    src/librdf.h
    src/rdf_init.h
    src/rdf_raptor.h
    src/rdf_uri.h
    src/rdf_node.h
    src/rdf_statement.h
    src/rdf_concepts.h
    src/rdf_model.h
    src/rdf_iterator.h
    src/rdf_storage.h
    src/rdf_storage_module.h
    src/rdf_stream.h
    src/rdf_parser.h
    src/rdf_utf8.h
    src/rdf_query.h
    src/rdf_serializer.h
    src/rdf_log.h
    src/rdf_digest.h
    src/rdf_hash.h
    src/rdf_list.h
)

add_definitions(-DPKGDATADIR="\"\"" -DLIBRDF_INTERNAL)

if(BUILD_STATIC)
    set(_SHARED STATIC)
    add_definitions(-DREDLAND_STATIC)
else(BUILD_STATIC)
    set(_SHARED SHARED)
endif(BUILD_STATIC)

add_library(rdf ${_SHARED} ${librdf_SRCS})
set_target_properties(rdf PROPERTIES DEFINE_SYMBOL LIBRDF_EXPORTS)
target_link_libraries(rdf ${PTHREADS_WIN32_LIBRARIES} ${RAPTOR_LIBRARIES} ${RASQAL_LIBRARIES} ${SQLITE_LIBRARIES})

# Dummy redland config is necessary for several find redland scripts
set(PROGRAMM redland)
add_definitions(-Dredland_version_string="${VERSION}" -Dredland_version_decimal=${REDLAND_VERSION_DECIMAL})
configure_file(${CMAKE_SOURCE_DIR}/cmake/config.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/redland-config.cpp)
add_executable(redland-config ${CMAKE_CURRENT_BINARY_DIR}/redland-config.cpp)
target_link_libraries(redland-config rdf)

set(_TARGETS
   rdf
   redland-config)

###############################################################################
if(BUILD_TESTS OR BUILD_TOOLS)
    add_library(rdf_static STATIC ${librdf_SRCS})
    set_target_properties(rdf_static PROPERTIES COMPILE_FLAGS -DREDLAND_STATIC)
endif(BUILD_TESTS OR BUILD_TOOLS)

if(BUILD_TOOLS)
    set(rdfproc_SRCS
        utils/rdfproc.c
    )
    if(MSVC)
        list(APPEND rdfproc_SRCS utils/getopt.c)
    endif(MSVC)
    add_executable(rdfproc ${rdfproc_SRCS})
    set_target_properties(rdfproc PROPERTIES COMPILE_FLAGS "-DREDLAND_STATIC")
    target_link_libraries(rdfproc rdf_static ${PTHREADS_WIN32_LIBRARIES} ${RAPTOR_LIBRARIES} ${RASQAL_LIBRARIES} ${SQLITE_LIBRARIES})

    set(redland_db_upgrade_SRCS
        utils/db_upgrade.c
    )
    if(MSVC)
        list(APPEND redland_db_upgrade_SRCS utils/getopt.c)
    endif(MSVC)
    add_executable(redland-db-upgrade ${redland_db_upgrade_SRCS})
    set_target_properties(redland-db-upgrade PROPERTIES COMPILE_FLAGS "-DREDLAND_STATIC")
    target_link_libraries(redland-db-upgrade rdf_static ${PTHREADS_WIN32_LIBRARIES} ${RAPTOR_LIBRARIES} ${RASQAL_LIBRARIES} ${SQLITE_LIBRARIES})
    list(APPEND _TARGETS rdfproc redland-db-upgrade)
endif(BUILD_TOOLS)

if(BUILD_TESTS)
    set(rdf_TESTS
        rdf_node
        rdf_digest
        rdf_hash
        rdf_uri
        rdf_statement
        rdf_model
        rdf_storage
        rdf_parser
        rdf_files
        rdf_heuristics
        rdf_utf8
        rdf_concepts
        rdf_query
        rdf_serializer
        rdf_stream
        rdf_iterator
        rdf_init
    )
    
    foreach(_test ${rdf_TESTS})
        add_executable(${_test} src/${_test}.c)
        set_target_properties(${_test} PROPERTIES COMPILE_FLAGS "-DSTANDALONE -DREDLAND_STATIC")
        target_link_libraries(${_test} rdf_static ${PTHREADS_WIN32_LIBRARIES} ${RAPTOR_LIBRARIES} ${RASQAL_LIBRARIES} ${SQLITE_LIBRARIES})
        add_test(${_test} ${_test})
    endforeach(_test ${rdf_TESTS})
endif(BUILD_TESTS)
###############################################################################
install(TARGETS ${_TARGETS} RUNTIME DESTINATION bin
                            LIBRARY DESTINATION lib
                            ARCHIVE DESTINATION lib)
install(FILES ${rdf_HDRS} DESTINATION include/redland)
