project(rasqal)

cmake_minimum_required(VERSION 2.8)

set(RASQAL_VERSION_MAJOR 0)
set(RASQAL_VERSION_MINOR 9)
set(RASQAL_VERSION_RELEASE 26)
set(VERSION ${RASQAL_VERSION_MAJOR}.${RASQAL_VERSION_MINOR}.${RASQAL_VERSION_RELEASE})
math(EXPR RASQAL_VERSION_DECIMAL "${RASQAL_VERSION_MAJOR} * 10000 + ${RASQAL_VERSION_MINOR} * 100 + ${RASQAL_VERSION_RELEASE}")

set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")

find_package(PCRE REQUIRED)
find_package(Raptor 2.0 REQUIRED)

option(BUILD_EXAMPLES "build the examples" ON)
option(BUILD_TOOLS "build commandline utilities" ON)
option(BUILD_TESTS "build test executables" ON)

if(BUILD_TESTS)
    enable_testing()
endif(BUILD_TESTS)

set(rasqal_SRCS
    src/rasqal_algebra.c
    src/rasqal_bindings.c
    src/rasqal_data_graph.c
    src/rasqal_dataset.c
    src/rasqal_datetime.c
    src/rasqal_decimal.c
    src/rasqal_digest.c
    src/rasqal_digest_md5.c
    src/rasqal_digest_sha1.c
    src/rasqal_engine_algebra.c
    src/rasqal_engine.c
    src/rasqal_engine_sort.c
    src/rasqal_expr.c
    src/rasqal_expr_datetimes.c
    src/rasqal_expr_evaluate.c
    src/rasqal_expr_numerics.c
    src/rasqal_expr_strings.c
    src/rasqal_feature.c
    src/rasqal_format_html.c
    src/rasqal_format_json.c
    src/rasqal_format_rdf.c
    src/rasqal_format_sparql_xml.c
    src/rasqal_format_sv.c
    src/rasqal_format_table.c
    src/rasqal_formula.c
    src/rasqal_general.c
    src/rasqal_graph_pattern.c
    src/rasqal_literal.c
    src/rasqal_map.c
    src/rasqal_prefix.c
    src/rasqal_projection.c
    src/rasqal_query.c
    src/rasqal_query_results.c
    src/rasqal_query_transform.c
    src/rasqal_query_write.c
    src/rasqal_random.c
    src/rasqal_raptor.c
    src/rasqal_result_formats.c
    src/rasqal_row.c
    src/rasqal_row_compatible.c
    src/rasqal_rowsource_aggregation.c
    src/rasqal_rowsource_assignment.c
    src/rasqal_rowsource.c
    src/rasqal_rowsource_distinct.c
    src/rasqal_rowsource_empty.c
    src/rasqal_rowsource_filter.c
    src/rasqal_rowsource_graph.c
    src/rasqal_rowsource_groupby.c
    src/rasqal_rowsource_having.c
    src/rasqal_rowsource_join.c
    src/rasqal_rowsource_project.c
    src/rasqal_rowsource_rowsequence.c
    src/rasqal_rowsource_sort.c
    src/rasqal_rowsource_triples.c
    src/rasqal_rowsource_union.c
    src/rasqal_service.c
    src/rasqal_solution_modifier.c
    src/rasqal_triple.c
    src/rasqal_triples_source.c
    src/rasqal_update.c
    src/rasqal_variable.c
    src/rasqal_xsd_datatypes.c
    src/rasqal_query_test.c
    src/rdql_lexer.c
    src/rdql_parser.c
    src/sparql_lexer.c
    src/sparql_parser.c
    src/strcasecmp.c
    src/timegm.c
)

include(ConfigureChecks.cmake)
configure_file(src/rasqal.h.in ${CMAKE_BINARY_DIR}/rasqal.h @ONLY)
configure_file(src/win32_rasqal_config.h.in ${CMAKE_BINARY_DIR}/win32_rasqal_config.h @ONLY)

set(rasqal_HDRS
    ${CMAKE_BINARY_DIR}/rasqal.h
)

if(WIN32)
    add_definitions(-DRASQAL_DECIMAL_NONE)
    if(MSVC)
        add_definitions(-D_CRT_SECURE_NO_WARNINGS -wd4996)
        list(APPEND rasqal_SRCS utils/gettimeofday.c)
    endif(MSVC)
endif(WIN32)

include_directories(
    ${CMAKE_BINARY_DIR}
    src
    utils
    ${PCRE_INCLUDE_DIR}
    ${RAPTOR_INCLUDE_DIR}
)
add_library(rasqal SHARED ${rasqal_SRCS})
set_target_properties(rasqal PROPERTIES DEFINE_SYMBOL RASQAL_INTERNAL)
target_link_libraries(rasqal ${PCRE_LIBRARIES} ${RAPTOR_LIBRARIES})

if(BUILD_TOOLS OR BUILD_TESTS)
    add_library(rasqal_static STATIC ${rasqal_SRCS})
    set_target_properties(rasqal_static PROPERTIES COMPILE_FLAGS "-DRASQAL_STATIC -DRASQAL_INTERNAL")
endif(BUILD_TOOLS OR BUILD_TESTS)

#if(NOT MSVC)
#    target_link_libraries(rasqal gmp)
#endif(NOT MSVC)

set(PROGRAMM rasqal)

set(_targets
   rasqal
)
###############################################################################
# examples and commandline utility

if(BUILD_TOOLS)
    configure_file(${CMAKE_SOURCE_DIR}/cmake/config.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/rasqal-config.cpp)
    add_executable(rasqal-config ${CMAKE_CURRENT_BINARY_DIR}/rasqal-config.cpp)
    target_link_libraries(rasqal-config ${RAPTOR_LIBRARIES} rasqal)

    set(roqet_SRCS
        utils/roqet.c
    )
    if(MSVC)
        set(roqet_SRCS
            ${roqet_SRCS} 
            utils/getopt.c
        )
    endif(MSVC)
    add_executable(roqet ${roqet_SRCS})
    set_target_properties(roqet PROPERTIES COMPILE_FLAGS "-DRASQAL_STATIC -DRASQAL_INTERNAL")
    target_link_libraries(roqet rasqal_static ${PCRE_LIBRARIES} ${RAPTOR_LIBRARIES})
    list(APPEND _targets rasqal-config roqet)

    install(FILES utils/roqet.1 DESTINATION share/man/man1)
endif(BUILD_TOOLS)

if(BUILD_EXAMPLES)
    set(srxread_SRCS
        utils/srxread.c
    )
    add_executable(srxread ${srxread_SRCS})
    target_link_libraries(srxread rasqal)

    set(srxwrite_SRCS
        utils/srxwrite.c
    )
    add_executable(srxwrite ${srxwrite_SRCS})
    target_link_libraries(srxwrite rasqal)
endif(BUILD_EXAMPLES)

###############################################################################
if(BUILD_TESTS)
    add_definitions(-Dstrcasecmp=stricmp -Dstrncasecmp=strnicmp)
    set(test_SRCS
        rasqal_algebra
        rasqal_expr
        strcasecmp
        rasqal_xsd_datatypes
        rasqal_decimal
        rasqal_datetime
        rasqal_variable
        rasqal_rowsource_empty
        rasqal_rowsource_union
        rasqal_rowsource_rowsequence
        rasqal_rowsource_project
        rasqal_rowsource_join
        rasqal_rowsource_triples
        rasqal_row_compatible
        rasqal_rowsource_groupby
        rasqal_rowsource_aggregation
        rasqal_literal
        rasqal_query_test
    )
    foreach(_testname ${test_SRCS})
        add_executable(${_testname}_test src/${_testname}.c)
        target_link_libraries(${_testname}_test rasqal_static ${PCRE_LIBRARIES} ${RAPTOR_LIBRARIES})
        set_target_properties(${_testname}_test PROPERTIES COMPILE_FLAGS "-DRASQAL_STATIC -DRASQAL_INTERNAL -DSTANDALONE")
        add_test(${_testname} ${_testname}_test)
    endforeach(_testname ${test_SRCS})
endif(BUILD_TESTS)

###############################################################################
install(TARGETS ${_targets} RUNTIME DESTINATION bin
                            LIBRARY DESTINATION lib
                            ARCHIVE DESTINATION lib)

install(FILES ${rasqal_HDRS} DESTINATION include/rasqal)

install(FILES docs/librasqal.3 DESTINATION share/man/man3)
