diff --git a/.gitignore b/.gitignore index 84c048a..0842600 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /build/ + +.DS_Store diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..c60d87f --- /dev/null +++ b/.travis.yml @@ -0,0 +1,33 @@ +language: cpp +compiler: clang + +matrix: + include: + - os: linux + dist: trusty + env: PYTHON_BINDING=0 + - os: linux + dist: trusty + env: PYTHON_BINDING=1 + - os: osx + env: PYTHON_BINDING=0 + - os: osx + env: PYTHON_BINDING=1 + +install: travis/install.sh + +script: travis/script.sh + +before_deploy: travis/bundle.sh + +deploy: + provider: releases + api_key: + secure: UwuiE6SrjorpBr1CzTRadX1zq83hwbnur+MvzBueqEHM7Yyu5Y0xMkwchRlX41HzMuSkC0azM0S8GfqJT1E7pIrqgJGvFbXR3t9ZG8HtvrcM4PvTS8b0G0d8aWHfTP2Zv+PAK3MMnYtxmOFPs4IaqO1m+imjQWtpvCRG5tvc4DNIPAMh0S8LCjxUdz35BYAM4pwM7WB9Qt+YhbyP1h3oSQ7qtr1fZYCC0H4G1cjVBLeP9g66/tfg0MIQVf1wxU8KF3H6esilPhFDCnsBYcnYrKyJN9OkMXZvLoxsjqQvTlsSNO2wIQ32dW8fk+1VFebWjN3RnNUV2Zb3wdz2y6e6A08J8T/+QrJ003eUJAGassQEgsuQ85ldcbylbKCVdi+iA+W6pKSJoHIlyr2KQG77OZ+q3obvY09IMNX2qVnUJKG8g9vZHKk8TlvUtIDODUxqJ/XUVwG5aKiUPuE5UMeLnZlO7cWpABb28BjXGehLCDtqg2eu39n+N9hyEjmsJLcOuS03+C55YrjJHW09qZomorMyIa//4jxSAOU9Iah7cRzPGUl/eSwQ2kf0OGWfySd2PreOThWepH0ymvG9htlTUSMM4wRuKnNAmG7NY6TykttJY2KsTLpki+P4MFBlSvL0VvoHQintK69udSVeUrJaGx508w8V59AdZwJjMxhjOXw= + file_glob: true + file: $TRAVIS_BUILD_DIR/*.zip + overwrite: true + skip_cleanup: true + on: + tags: true + repo: CoatiSoftware/SourcetrailDB diff --git a/CMakeLists.txt b/CMakeLists.txt index 61f00b2..004a5b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,9 +6,48 @@ set(PROJECT_NAME "SourcetrailDB") project(${PROJECT_NAME}) -# configure default flags + +# --- Default Flags --- + set(CMAKE_BUILD_TYPE_INIT "Release") -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") + +if(UNIX) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread -fPIC") + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread -fPIC") +endif() + + +# --- Version --- + +if(EXISTS "${CMAKE_SOURCE_DIR}/.git") + find_package(Git) + + execute_process( + COMMAND ${GIT_EXECUTABLE} describe --long + WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + OUTPUT_VARIABLE GIT_VERSION_NUMBER + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +else() + set(GIT_VERSION_NUMBER "v0_db0_p0-0-a") +endif() + +string(REGEX REPLACE "v([0-9]+)_.*" "\\1" INTERFACE_VERSION "${GIT_VERSION_NUMBER}") +string(REGEX REPLACE "v[0-9]+_db([0-9]+)_.*" "\\1" DATABASE_VERSION "${GIT_VERSION_NUMBER}") +string(REGEX REPLACE "v[0-9]+_db[0-9]+_p([0-9])-.*" "\\1" PATCH_VERSION "${GIT_VERSION_NUMBER}") +set(VERSION_STRING "v${INTERFACE_VERSION}_db${DATABASE_VERSION}_p${PATCH_VERSION}") + +message(STATUS ${INTERFACE_VERSION}) +message(STATUS ${DATABASE_VERSION}) +message(STATUS ${PATCH_VERSION}) +message(STATUS ${VERSION_STRING}) + +configure_file( + ${CMAKE_CURRENT_SOURCE_DIR}/version.txt.in + "${CMAKE_CURRENT_BINARY_DIR}/version.txt" +) + + set(LIB_CORE "lib_core") set(CORE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/core") # can be accessed in subdirectory CMake files diff --git a/appveyor.yml b/appveyor.yml index 1f8cd58..470d9c3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -31,7 +31,7 @@ install: before_build: - mkdir build - cd build - - cmake -G "%CMAKE_GENERATOR%" ../ -DBUILD_BINDINGS_PYTHON=ON -DPYTHON_INCLUDE_DIRS="%PYTHON_PATH%/include" -DPYTHON_INCLUDE_DIRS="%PYTHON_PATH%/include" -DPYTHON_LIBRARIES="%PYTHON_PATH%/libs/python37.lib" + - cmake -G "%CMAKE_GENERATOR%" ../ -DBUILD_BINDINGS_PYTHON=ON -DPYTHON_LIBRARY="%PYTHON_PATH%/libs/python37.lib" - cd ../ @@ -62,7 +62,7 @@ after_build: - cd .. - ps: | copy build/bindings_python/release/_sourcetraildb.pyd artifacts_bindings_python/ - copy build/bindings_python/release/sourcetraildb.py artifacts_bindings_python/ + copy build/bindings_python/sourcetraildb.py artifacts_bindings_python/ copy LICENSE.txt artifacts_bindings_python/license/license_sourcetraildb.txt copy external/catch/license_catch.txt artifacts_bindings_python/license/ copy external/cpp_sqlite/license_cpp_sqlite.txt artifacts_bindings_python/license/ diff --git a/bindings_python/CMakeLists.txt b/bindings_python/CMakeLists.txt index 4d0faaa..9b4f351 100644 --- a/bindings_python/CMakeLists.txt +++ b/bindings_python/CMakeLists.txt @@ -1,80 +1,43 @@ cmake_minimum_required (VERSION 2.6) -set(LIB_BINDINGS_PYTHON "lib_bindings_python") set(PACKAGE_NAME "sourcetraildb") - -# --- Find Python --- - -if (NOT EXISTS "${PYTHON_INCLUDE_DIRS}") - message(STATUS "Python include dir \"${PYTHON_INCLUDE_DIRS}\" does not exist, trying to find Python automatically.") - find_package(PythonLibs REQUIRED) -else () - if (NOT EXISTS "${PYTHON_LIBRARIES}") - message(STATUS "Python library \"${PYTHON_LIBRARIES}\" does not exist, trying to find Python automatically.") - find_package(PythonLibs REQUIRED) - endif () -endif () - -message(STATUS "Found Python include dirs: ${PYTHON_INCLUDE_DIRS}") -message(STATUS "Found Python libraries: ${PYTHON_LIBRARIES}") - - # --- Setup Paths --- set(RESOURCES_SWIG_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../resources_swig") set(GENERATED_SRC_DIR "${CMAKE_CURRENT_BINARY_DIR}/src") set(SWIG_INTERFACE_FILE "${RESOURCES_SWIG_DIR}/interface/${PACKAGE_NAME}.i") -set(GENERATED_WRAPPER_FILE "${GENERATED_SRC_DIR}/${PACKAGE_NAME}_wrap.cxx") -file(WRITE ${GENERATED_WRAPPER_FILE} "") -set(SRC_FILES - "${RESOURCES_SWIG_DIR}/src/${PACKAGE_NAME}.cpp" - ${GENERATED_WRAPPER_FILE} -) +# --- Find Python --- -set(HDR_FILES - "${RESOURCES_SWIG_DIR}/include/${PACKAGE_NAME}.h" -) +find_package(PythonLibs) + + +# --- Find Swig --- + +find_package(SWIG REQUIRED) +include(${SWIG_USE_FILE}) # --- Configure Target --- -add_library(${LIB_BINDINGS_PYTHON} SHARED ${SRC_FILES} ${HDR_FILES} ${SWIG_INTERFACE_FILE}) +set_source_files_properties(${SWIG_INTERFACE_FILE} PROPERTIES CPLUSPLUS ON) -set_target_properties(${LIB_BINDINGS_PYTHON} PROPERTIES OUTPUT_NAME "_${PACKAGE_NAME}") - -if (WIN32) - set_target_properties(${LIB_BINDINGS_PYTHON} PROPERTIES SUFFIX ".pyd") -else() - # Remove 'lib' prefix - set_target_properties(${LIB_BINDINGS_PYTHON} PROPERTIES PREFIX "") - set_target_properties(${LIB_BINDINGS_PYTHON} PROPERTIES SUFFIX ".so") -endif() - -if (WIN32) - add_custom_command( - TARGET ${LIB_BINDINGS_PYTHON} - PRE_BUILD - COMMAND if not exist \"${GENERATED_SRC_DIR}\" mkdir \"${GENERATED_SRC_DIR}\" \n swig -c++ -python -I${RESOURCES_SWIG_DIR}/include -o ${GENERATED_WRAPPER_FILE} -outdir ${CMAKE_CURRENT_BINARY_DIR}/$(CONFIGURATION) ${SWIG_INTERFACE_FILE} - COMMENT "Generating wrapper code file." - ) -else() - add_custom_command( - TARGET ${LIB_BINDINGS_PYTHON} - PRE_BUILD - COMMAND swig -c++ -python -I${RESOURCES_SWIG_DIR}/include -o ${GENERATED_WRAPPER_FILE} -outdir ${CMAKE_CURRENT_BINARY_DIR} ${SWIG_INTERFACE_FILE} - COMMENT "Generating wrapper code file." - ) -endif() - - -target_include_directories(${LIB_BINDINGS_PYTHON} PUBLIC +include_directories( "${RESOURCES_SWIG_DIR}/include" "${CORE_SOURCE_DIR}/include" ${PYTHON_INCLUDE_DIRS} ) -target_link_libraries(${LIB_BINDINGS_PYTHON} ${PYTHON_LIBRARIES} ${LIB_CORE}) +swig_add_library( + ${PACKAGE_NAME} + TYPE SHARED + LANGUAGE python + OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR} + OUTFILE_DIR ${GENERATED_SRC_DIR} + SOURCES ${SWIG_INTERFACE_FILE} ${RESOURCES_SWIG_DIR}/src/${PACKAGE_NAME}.cpp +) + +swig_link_libraries(${PACKAGE_NAME} ${PYTHON_LIBRARIES} ${LIB_CORE}) diff --git a/core/CMakeLists.txt b/core/CMakeLists.txt index 590ab15..5061230 100644 --- a/core/CMakeLists.txt +++ b/core/CMakeLists.txt @@ -2,11 +2,6 @@ cmake_minimum_required (VERSION 2.6) set(TEST_CORE "test_core") -set(INTERFACE_VERSION 0) -set(DATABASE_VERSION 23) -set(COMMIT_VERSION 1) -set(VERSION_STRING "v${INTERFACE_VERSION}_db${DATABASE_VERSION}_c${COMMIT_VERSION}") - set(GENERATED_INCLUDE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") set(GENERATED_VERSION_FILE "${GENERATED_INCLUDE_DIRECTORY}/version.h") @@ -15,7 +10,7 @@ configure_file( ${GENERATED_VERSION_FILE} ) -set(LIB_SRC_FILES +set(LIB_SRC_FILES "${CMAKE_SOURCE_DIR}/external/cpp_sqlite/src/CppSQLite3.cpp" "${CMAKE_SOURCE_DIR}/external/cpp_sqlite/src/sqlite3.c" src/DatabaseStorage.cpp @@ -30,7 +25,7 @@ set(LIB_SRC_FILES src/utility.cpp ) -set(LIB_HDR_FILES +set(LIB_HDR_FILES "${CMAKE_SOURCE_DIR}/external/json/include/json.hpp" "${CMAKE_SOURCE_DIR}/external/cpp_sqlite/include/CppSQLite3.h" "${CMAKE_SOURCE_DIR}/external/cpp_sqlite/include/sqlite3.h" @@ -71,7 +66,7 @@ target_include_directories(${LIB_CORE} PUBLIC ) -set(TEST_SRC_FILES +set(TEST_SRC_FILES test/test.cpp ) @@ -85,4 +80,4 @@ target_include_directories(${TEST_CORE} PUBLIC "${GENERATED_INCLUDE_DIRECTORY}" ) -target_link_libraries(${TEST_CORE} ${LIB_CORE}) +target_link_libraries(${TEST_CORE} ${LIB_CORE} "-ldl") diff --git a/core/src/utility.cpp b/core/src/utility.cpp index 545ca7b..0b9d829 100644 --- a/core/src/utility.cpp +++ b/core/src/utility.cpp @@ -16,6 +16,7 @@ #include "utility.h" +#include #include #include diff --git a/core/version.h.in b/core/version.h.in index 576ca5e..97a894d 100644 --- a/core/version.h.in +++ b/core/version.h.in @@ -5,7 +5,7 @@ #define INTERFACE_VERSION @INTERFACE_VERSION@ #define DATABASE_VERSION @DATABASE_VERSION@ -#define COMMIT_VERSION @COMMIT_VERSION@ +#define PATCH_VERSION @PATCH_VERSION@ #define VERSION_STRING "@VERSION_STRING@" diff --git a/travis/bundle.sh b/travis/bundle.sh new file mode 100755 index 0000000..8f13c04 --- /dev/null +++ b/travis/bundle.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +cd $TRAVIS_BUILD_DIR + +VERSION=$(head -1 build/version.txt) + +if [[ "$PYTHON_BINDING" == "1" ]]; then + PYTHON_VERSION=$(python3 -c "import sys; sys.stdout.write(str(sys.version_info.major)); sys.stdout.write(str(sys.version_info.minor));") + BUNDLE_NAME=sourcetraildb_python${PYTHON_VERSION}_${VERSION}_${TRAVIS_OS_NAME}_64bit + + mkdir -p $BUNDLE_NAME + cp build/bindings_python/sourcetraildb.py $BUNDLE_NAME + cp build/bindings_python/_sourcetraildb* $BUNDLE_NAME/_sourcetraildb.so + + zip -r $BUNDLE_NAME $BUNDLE_NAME +else + BUNDLE_NAME=sourcetraildb_core_${VERSION}_${TRAVIS_OS_NAME}_64bit + + mkdir -p $BUNDLE_NAME/include + cp build/core/*.a $BUNDLE_NAME + cp core/include/* $BUNDLE_NAME/include + cp build/core/include/* $BUNDLE_NAME/include + + zip -r $BUNDLE_NAME $BUNDLE_NAME +fi diff --git a/travis/install.sh b/travis/install.sh new file mode 100755 index 0000000..acf7d3f --- /dev/null +++ b/travis/install.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew install swig + brew link --force swig +elif [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + sudo apt-get update + sudo apt-get install -qq python-dev swig + sudo apt-get update -qq +fi diff --git a/travis/script.sh b/travis/script.sh new file mode 100755 index 0000000..c4ce690 --- /dev/null +++ b/travis/script.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +mkdir build +cd build +cmake -DBUILD_BINDINGS_PYTHON=$PYTHON_BINDING .. +make +./core/test_core diff --git a/version.txt.in b/version.txt.in new file mode 100644 index 0000000..636ccfd --- /dev/null +++ b/version.txt.in @@ -0,0 +1 @@ +@VERSION_STRING@ \ No newline at end of file