diff --git a/.gitexternals b/.gitexternals index 870fa06..b56a81b 100644 --- a/.gitexternals +++ b/.gitexternals @@ -1,3 +1,2 @@ # -*- mode: cmake -*- # Pydoxine https://github.com/BlueBrain/Pydoxine 0b62442 -# CMake/common https://github.com/Eyescale/CMake.git ea58baf diff --git a/.gitignore b/.gitignore index 0e8a820..7af6c4a 100644 --- a/.gitignore +++ b/.gitignore @@ -32,7 +32,6 @@ /Lunchbox/ /Servus/ /vmmlib/ -CMake/common/ CMakeLists.txt.user* Makefile build/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..caa337e --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "CMake/common"] + path = CMake/common + url = https://github.com/Eyescale/CMake diff --git a/.gitsubprojects b/.gitsubprojects index 623b993..234e931 100644 --- a/.gitsubprojects +++ b/.gitsubprojects @@ -1,6 +1,6 @@ # -*- mode: cmake -*- -git_subproject(Servus https://github.com/HBPVIS/Servus.git 36180b5) -git_subproject(Lunchbox https://github.com/Eyescale/Lunchbox.git 7933465) -git_subproject(Keyv https://github.com/BlueBrain/Keyv.git 3fe9927) -git_subproject(vmmlib https://github.com/Eyescale/vmmlib.git cfa6243) +git_subproject(Servus https://github.com/HBPVIS/Servus.git 6998512) +git_subproject(Lunchbox https://github.com/Eyescale/Lunchbox.git 867f8d9) +git_subproject(Keyv https://github.com/BlueBrain/Keyv.git 6387f84) +git_subproject(vmmlib https://github.com/Eyescale/vmmlib.git 2635f7f) git_subproject(MVDTool https://github.com/BlueBrain/MVDTool.git 4e2f0f4) diff --git a/.travis.yml b/.travis.yml index 226db82..db9c4fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -21,5 +21,5 @@ before_install: script: - mkdir $BUILD_TYPE - cd $BUILD_TYPE - - cmake -GNinja -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. + - cmake -GNinja -DCLONE_SUBPROJECTS=ON -DCMAKE_INSTALL_PREFIX=$PWD/install -DCMAKE_BUILD_TYPE=$BUILD_TYPE .. - ninja all && ninja $PROJECT_NAME-tests && ninja smoketests diff --git a/CMake/GitExternal.cmake b/CMake/GitExternal.cmake deleted file mode 100644 index 1063610..0000000 --- a/CMake/GitExternal.cmake +++ /dev/null @@ -1,325 +0,0 @@ -# Configures an external git repository -# -# Usage: -# * Automatically reads, parses and updates a .gitexternals file if it only -# contains lines in the form "# ". -# This function parses the file for this pattern and then calls -# git_external on each found entry. Additionally it provides an -# update target to bump the tag to the master revision by -# recreating .gitexternals. -# * Provides function -# git_external( [VERBOSE] -# [RESET ]) -# which will check out directory in CMAKE_SOURCE_DIR (if relative) -# or in the given absolute path using the given repository and tag -# (commit-ish). -# -# Options which can be supplied to the function: -# VERBOSE, when present, this option tells the function to output -# information about what operations are being performed by git on -# the repo. -# OPTIONAL, when present, this option makes this operation optional. -# The function will output a warning and return if the repo could not be -# cloned. -# -# Targets: -# * -rebase: fetches latest updates and rebases the given external -# git repository onto it. -# * rebase: Rebases all git externals, including sub projects -# -# Options (global) which control behaviour: -# COMMON_GIT_EXTERNAL_VERBOSE -# This is a global option which has the same effect as the VERBOSE option, -# with the difference that output information will be produced for all -# external repos when set. -# GIT_EXTERNAL_TAG -# If set, git external tags referring to a SHA1 (not a branch) will be -# overwritten by this value. -# -# CMake or environment variables: -# GITHUB_USER -# If set, a remote called 'user' is set up for github repositories, pointing -# to git@github.com:/. Also, this remote is used by default -# for 'git push'. - - -if(NOT GIT_FOUND) - find_package(Git QUIET) -endif() -if(NOT GIT_EXECUTABLE) - return() -endif() - -include(CMakeParseArguments) -option(COMMON_GIT_EXTERNAL_VERBOSE "Print git commands as they are executed" OFF) - -if(NOT GITHUB_USER AND DEFINED ENV{GITHUB_USER}) - set(GITHUB_USER $ENV{GITHUB_USER} CACHE STRING - "Github user name used to setup remote for 'user' forks") -endif() - -macro(GIT_EXTERNAL_MESSAGE msg) - if(COMMON_GIT_EXTERNAL_VERBOSE) - message(STATUS "${NAME}: ${msg}") - endif() -endmacro() - -function(GIT_EXTERNAL DIR REPO tag) - cmake_parse_arguments(GIT_EXTERNAL_LOCAL "VERBOSE;OPTIONAL" "" "RESET" ${ARGN}) - set(TAG ${tag}) - if(GIT_EXTERNAL_TAG AND "${tag}" MATCHES "^[0-9a-f]+$") - set(TAG ${GIT_EXTERNAL_TAG}) - endif() - - # check if we had a previous external of the same name - string(REGEX REPLACE "[:/]" "_" TARGET "${DIR}") - get_property(OLD_TAG GLOBAL PROPERTY ${TARGET}_GITEXTERNAL_TAG) - if(OLD_TAG) - if(NOT OLD_TAG STREQUAL TAG) - string(REPLACE "${CMAKE_SOURCE_DIR}/" "" PWD - "${CMAKE_CURRENT_SOURCE_DIR}") - git_external_message("${DIR}: already configured with ${OLD_TAG}, ignoring requested ${TAG} in ${PWD}") - return() - endif() - else() - set_property(GLOBAL PROPERTY ${TARGET}_GITEXTERNAL_TAG ${TAG}) - endif() - - if(NOT IS_ABSOLUTE "${DIR}") - set(DIR "${CMAKE_SOURCE_DIR}/${DIR}") - endif() - get_filename_component(NAME "${DIR}" NAME) - get_filename_component(GIT_EXTERNAL_DIR "${DIR}/.." ABSOLUTE) - - if(NOT EXISTS "${DIR}") - # clone - message(STATUS "git clone --recursive ${REPO} ${DIR} [${TAG}]") - execute_process( - COMMAND "${GIT_EXECUTABLE}" clone --recursive ${REPO} ${DIR} - RESULT_VARIABLE nok ERROR_VARIABLE error - WORKING_DIRECTORY "${GIT_EXTERNAL_DIR}") - if(nok) - if(GIT_EXTERNAL_LOCAL_OPTIONAL) - message(STATUS "${DIR} clone failed: ${error}\n") - return() - else() - message(FATAL_ERROR "${DIR} clone failed: ${error}\n") - endif() - endif() - - # checkout requested tag - execute_process(COMMAND "${GIT_EXECUTABLE}" checkout -q "${TAG}" - RESULT_VARIABLE nok ERROR_VARIABLE error WORKING_DIRECTORY "${DIR}") - if(nok) - message(FATAL_ERROR "git checkout ${TAG} in ${DIR} failed: ${error}\n") - endif() - endif() - - # set up "user" remote for github forks and make it default for 'git push' - if(GITHUB_USER AND REPO MATCHES ".*github.com.*") - string(REGEX REPLACE ".*(github.com)[\\/:]().*(\\/.*)" "git@\\1:\\2${GITHUB_USER}\\3" - GIT_EXTERNAL_USER_REPO ${REPO}) - execute_process( - COMMAND "${GIT_EXECUTABLE}" remote add user ${GIT_EXTERNAL_USER_REPO} - OUTPUT_QUIET ERROR_QUIET WORKING_DIRECTORY "${DIR}") - execute_process( - COMMAND "${GIT_EXECUTABLE}" config remote.pushdefault user - OUTPUT_QUIET ERROR_QUIET WORKING_DIRECTORY "${DIR}") - endif() - - if(COMMON_SOURCE_DIR) - file(RELATIVE_PATH __dir ${COMMON_SOURCE_DIR} ${DIR}) - else() - file(RELATIVE_PATH __dir ${CMAKE_SOURCE_DIR} ${DIR}) - endif() - string(REGEX REPLACE "[:/\\.]" "-" __target "${__dir}") - if(TARGET ${__target}-rebase) - return() - endif() - - set(__rebase_cmake "${CMAKE_CURRENT_BINARY_DIR}/${__target}-rebase.cmake") - file(WRITE ${__rebase_cmake} - "if(NOT IS_DIRECTORY \"${DIR}/.git\")\n" - " message(FATAL_ERROR \"Can't update git external ${__dir}: Not a git repository\")\n" - "endif()\n" - # check if we are already on the requested tag (nothing to do) - "execute_process(COMMAND \"${GIT_EXECUTABLE}\" rev-parse --short HEAD\n" - " OUTPUT_VARIABLE currentref OUTPUT_STRIP_TRAILING_WHITESPACE\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - "if(currentref STREQUAL ${TAG}) # nothing to do\n" - " return()\n" - "endif()\n" - "\n" - # reset generated files - "foreach(GIT_EXTERNAL_RESET_FILE ${GIT_EXTERNAL_RESET})\n" - " execute_process(\n" - " COMMAND \"${GIT_EXECUTABLE}\" reset -q \"\${GIT_EXTERNAL_RESET_FILE}\"\n" - " ERROR_QUIET OUTPUT_QUIET\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - " execute_process(\n" - " COMMAND \"${GIT_EXECUTABLE}\" checkout -q -- \"${GIT_EXTERNAL_RESET_FILE}\"\n" - " ERROR_QUIET OUTPUT_QUIET\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - "endforeach()\n" - "\n" - # fetch updates - "execute_process(COMMAND \"${GIT_EXECUTABLE}\" fetch origin -q\n" - " RESULT_VARIABLE nok ERROR_VARIABLE error\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - "if(nok)\n" - " message(FATAL_ERROR \"Fetch for ${__dir} failed:\n \${error}\")\n" - "endif()\n" - "\n" - ) - if("${TAG}" MATCHES "^[0-9a-f]+$") - # requested TAG is a SHA1, just switch to it - file(APPEND ${__rebase_cmake} - # checkout requested tag - "execute_process(\n" - " COMMAND \"${GIT_EXECUTABLE}\" checkout -q \"${TAG}\"\n" - " RESULT_VARIABLE nok ERROR_VARIABLE error\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - "if(nok)\n" - " message(FATAL_ERROR \"git checkout ${TAG} in ${__dir} failed: ${error}\n\")\n" - "endif()\n" - ) - else() - # requested TAG is a branch - file(APPEND ${__rebase_cmake} - # switch to requested branch - "execute_process(\n" - " COMMAND \"${GIT_EXECUTABLE}\" checkout -q \"${TAG}\"\n" - " OUTPUT_QUIET ERROR_QUIET WORKING_DIRECTORY \"${DIR}\")\n" - # try to rebase it - "execute_process(COMMAND \"${GIT_EXECUTABLE}\" rebase FETCH_HEAD\n" - " RESULT_VARIABLE nok ERROR_VARIABLE error OUTPUT_VARIABLE output\n" - " WORKING_DIRECTORY \"${DIR}\")\n" - "if(nok)\n" - " execute_process(COMMAND \"${GIT_EXECUTABLE}\" rebase --abort\n" - " WORKING_DIRECTORY \"${DIR}\" ERROR_QUIET OUTPUT_QUIET)\n" - " message(FATAL_ERROR \"Rebase ${__dir} failed:\n\${output}\${error}\")\n" - "endif()\n" - ) - endif() - - if(NOT GIT_EXTERNAL_SCRIPT_MODE) - add_custom_target(${__target}-rebase - COMMAND ${CMAKE_COMMAND} -P ${__rebase_cmake} - COMMENT "Rebasing ${__dir} [${TAG}]") - set_target_properties(${__target}-rebase PROPERTIES - EXCLUDE_FROM_DEFAULT_BUILD ON FOLDER git) - if(NOT TARGET rebase) - add_custom_target(rebase) - set_target_properties(rebase PROPERTIES EXCLUDE_FROM_DEFAULT_BUILD ON) - endif() - add_dependencies(rebase ${__target}-rebase) - endif() -endfunction() - -set(GIT_EXTERNALS ${GIT_EXTERNALS_FILE}) -if(NOT GIT_EXTERNALS) - set(GIT_EXTERNALS "${CMAKE_CURRENT_SOURCE_DIR}/.gitexternals") -endif() - -if(EXISTS ${GIT_EXTERNALS} AND NOT GIT_EXTERNAL_SCRIPT_MODE) - include(${GIT_EXTERNALS}) - file(READ ${GIT_EXTERNALS} GIT_EXTERNAL_FILE) - string(REGEX REPLACE "\n" ";" GIT_EXTERNAL_FILE "${GIT_EXTERNAL_FILE}") - foreach(LINE ${GIT_EXTERNAL_FILE}) - if(NOT LINE MATCHES "^#.*$") - message(FATAL_ERROR "${GIT_EXTERNALS} contains non-comment line: ${LINE}") - endif() - string(REGEX REPLACE "^#[ ]*(.+[ ]+.+[ ]+.+)$" "\\1" DATA ${LINE}) - if(NOT LINE STREQUAL DATA) - string(REGEX REPLACE "[ ]+" ";" DATA "${DATA}") - list(LENGTH DATA DATA_LENGTH) - if(DATA_LENGTH EQUAL 3) - list(GET DATA 0 DIR) - list(GET DATA 1 REPO) - list(GET DATA 2 TAG) - - # Create a unique, flat name - string(REPLACE "/" "-" GIT_EXTERNAL_NAME ${DIR}_${PROJECT_NAME}) - - if(NOT TARGET update-gitexternal-${GIT_EXTERNAL_NAME}) # not done - # pull in identified external - git_external(${DIR} ${REPO} ${TAG}) - - # Create update script and target to bump external spec - if(NOT TARGET update) - add_custom_target(update) - endif() - if(NOT TARGET ${PROJECT_NAME}-update-gitexternal) - add_custom_target(${PROJECT_NAME}-update-gitexternal) - add_custom_target(${PROJECT_NAME}-flatten-gitexternal) - add_dependencies(update ${PROJECT_NAME}-update-gitexternal) - endif() - - # Create a unique, flat name - file(RELATIVE_PATH GIT_EXTERNALS_BASE ${CMAKE_SOURCE_DIR} - ${GIT_EXTERNALS}) - string(REPLACE "/" "_" GIT_EXTERNAL_TARGET ${GIT_EXTERNALS_BASE}) - - set(GIT_EXTERNAL_TARGET update-gitexternal-${GIT_EXTERNAL_TARGET}) - if(NOT TARGET ${GIT_EXTERNAL_TARGET}) - set(GIT_EXTERNAL_SCRIPT - "${CMAKE_CURRENT_BINARY_DIR}/${GIT_EXTERNAL_TARGET}.cmake") - file(WRITE "${GIT_EXTERNAL_SCRIPT}" - "file(WRITE ${GIT_EXTERNALS} \"# -*- mode: cmake -*-\n\")\n") - add_custom_target(${GIT_EXTERNAL_TARGET} - COMMAND "${CMAKE_COMMAND}" -DGIT_EXTERNAL_SCRIPT_MODE=1 -P ${GIT_EXTERNAL_SCRIPT} - COMMENT "Recreate ${GIT_EXTERNALS_BASE}" - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") - endif() - - set(GIT_EXTERNAL_SCRIPT - "${CMAKE_CURRENT_BINARY_DIR}/gitupdate${GIT_EXTERNAL_NAME}.cmake") - file(WRITE "${GIT_EXTERNAL_SCRIPT}" " -include(\"${CMAKE_CURRENT_LIST_DIR}/GitExternal.cmake\") -execute_process(COMMAND \"${GIT_EXECUTABLE}\" fetch origin -q - WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}/${DIR}\") -execute_process( - COMMAND \"${GIT_EXECUTABLE}\" show-ref --hash=7 refs/remotes/origin/master - OUTPUT_VARIABLE newref OUTPUT_STRIP_TRAILING_WHITESPACE - WORKING_DIRECTORY \"${CMAKE_SOURCE_DIR}/${DIR}\") -if(newref) - file(APPEND ${GIT_EXTERNALS} \"# ${DIR} ${REPO} \${newref}\\n\") - git_external(${DIR} ${REPO} \${newref}) -else() - file(APPEND ${GIT_EXTERNALS} \"# ${DIR} ${REPO} ${TAG}\n\") -endif()") - add_custom_target(update-gitexternal-${GIT_EXTERNAL_NAME} - COMMAND "${CMAKE_COMMAND}" -DGIT_EXTERNAL_SCRIPT_MODE=1 -P ${GIT_EXTERNAL_SCRIPT} - COMMENT "Update ${REPO} in ${GIT_EXTERNALS_BASE}" - DEPENDS ${GIT_EXTERNAL_TARGET} - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}") - add_dependencies(${PROJECT_NAME}-update-gitexternal - update-gitexternal-${GIT_EXTERNAL_NAME}) - - # Flattens a git external repository into its parent repo: - # * Clean any changes from external - # * Unlink external from git: Remove external/.git and .gitexternals - # * Add external directory to parent - # * Commit with flattened repo and tag info - # - Depend on release branch checked out - add_custom_target(flatten-gitexternal-${GIT_EXTERNAL_NAME} - COMMAND "${GIT_EXECUTABLE}" clean -dfx - COMMAND "${CMAKE_COMMAND}" -E remove_directory .git - COMMAND "${CMAKE_COMMAND}" -E remove -f "${CMAKE_CURRENT_SOURCE_DIR}/.gitexternals" - COMMAND "${GIT_EXECUTABLE}" add -f . - COMMAND "${GIT_EXECUTABLE}" commit -m "Flatten ${REPO} into ${DIR} at ${TAG}" . "${CMAKE_CURRENT_SOURCE_DIR}/.gitexternals" - COMMENT "Flatten ${REPO} into ${DIR}" - DEPENDS ${PROJECT_NAME}-make-branch - WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/${DIR}") - add_dependencies(${PROJECT_NAME}-flatten-gitexternal - flatten-gitexternal-${GIT_EXTERNAL_NAME}) - - foreach(_target flatten-gitexternal-${GIT_EXTERNAL_NAME} ${PROJECT_NAME}-flatten-gitexternal update-gitexternal-${GIT_EXTERNAL_NAME} ${GIT_EXTERNAL_TARGET} ${PROJECT_NAME}-update-gitexternal update) - set_target_properties(${_target} PROPERTIES - EXCLUDE_FROM_DEFAULT_BUILD ON FOLDER git) - endforeach() - endif() - endif() - endif() - endforeach() -endif() diff --git a/CMake/common b/CMake/common new file mode 160000 index 0000000..e1a5560 --- /dev/null +++ b/CMake/common @@ -0,0 +1 @@ +Subproject commit e1a5560e7d1dee3156f4bf988a40ffa025ddacbc diff --git a/CMakeLists.txt b/CMakeLists.txt index 726caf6..93377e4 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,9 @@ set(Brion_VERSION_ABI 9) list(APPEND CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/CMake ${CMAKE_SOURCE_DIR}/CMake/common ${CMAKE_SOURCE_DIR}/Pydoxine/CMake) +if(NOT EXISTS ${CMAKE_SOURCE_DIR}/CMake/common/Common.cmake) + message(FATAL_ERROR "CMake/common missing, run: git submodule update --init") +endif() include(GitExternal) diff --git a/README.md b/README.md index c3de917..6638985 100644 --- a/README.md +++ b/README.md @@ -68,8 +68,8 @@ environments are tested: Building from source is as simple as: - git clone https://github.com/BlueBrain/Brion.git + git clone --recursive https://github.com/BlueBrain/Brion.git mkdir Brion/build cd Brion/build - cmake -GNinja .. + cmake -GNinja -DCLONE_SUBPROJECTS=ON .. ninja diff --git a/doc/Changelog.md b/doc/Changelog.md index 3385099..dafc16d 100644 --- a/doc/Changelog.md +++ b/doc/Changelog.md @@ -1,8 +1,13 @@ Changelog {#Changelog} ========= -# git master +# Release 2.0.0 (24-May-2017) +* [154](https://github.com/BlueBrain/Brion/pull/154): + - Improved help and command line inverface for spikeConverter and + compartmentConverter. + - Timestamps in brion::CompartmentReport changed from float to double. + - New implementation of binary compartment report reader using POSIX AIO. * [153](https://github.com/BlueBrain/Brion/pull/153): Updated Python wrapping of SpikeReportWriter to handle nympy arrays of spikes * [152](https://github.com/BlueBrain/Brion/pull/152):