diff --git a/.circleci/circleci.cmake b/.circleci/circleci.cmake new file mode 100644 index 00000000000..70cd9f55580 --- /dev/null +++ b/.circleci/circleci.cmake @@ -0,0 +1,84 @@ + +# set_from_env +# ------------ +# +# Sets a CMake variable from an environment variable. If the +# environment variable is not defined then the CMake variable is not +# modified. If DEFAULT is specified then if the environment variable +# is not defined the default value is used. Alternatively, if REQUIRED +# is specified then a FATAL_ERROR is generated. +# +# set_from_env( [REQUIRED|DEFAULT value] ) +function(set_from_env var env_var) + if(NOT DEFINED ENV{${env_var}}) + if (ARGV2 STREQUAL "REQUIRED") + message(FATAL_ERROR "Required environment variable \"${env_var}\" not defined.") + elseif (ARGV2 STREQUAL "DEFAULT") + set(${var} ${ARGV3} PARENT_SCOPE) + endif() + else() + set(${var} $ENV{${env_var}} PARENT_SCOPE) + endif() +endfunction() + +set(CTEST_SITE "CircleCI") +set(CTEST_UPDATE_VERSION_ONLY 1) + +set_from_env(PARALLEL_LEVEL "PARALLEL_LEVEL" DEFAULT 2 ) +set( CTEST_TEST_ARGS ${CTEST_TEST_ARGS} PARALLEL_LEVEL ${PARALLEL_LEVEL}) + + +# Make environment variables to CMake variables for CTest +set_from_env(CTEST_CMAKE_GENERATOR "CTEST_CMAKE_GENERATOR" DEFAULT "Unix Makefiles" ) +set_from_env(CTEST_BINARY_DIRECTORY "CTEST_BINARY_DIRECTORY") +set_from_env(CTEST_DASHBOARD_ROOT "CTEST_DASHBOARD_ROOT" REQUIRED) +set_from_env(CTEST_SOURCE_DIRECTORY "CTEST_SOURCE_DIRECTORY" REQUIRED) +set_from_env(CTEST_CONFIGURATION_TYPE "CTEST_CONFIGURATION_TYPE" DEFAULT "Release") +set_from_env(CTEST_BUILD_TARGET "CTEST_BUILD_TARGET") +set_from_env(CTEST_TEST_ARGS "CTEST_TEST_ARGS") +set_from_env(CTEST_BUILD_FLAGS "CTEST_BUILD_FLAGS" ) + +# Construct build name based on what is being built +string(SUBSTRING $ENV{CIRCLE_SHA1} 0 7 commit_sha1) +set(CTEST_BUILD_NAME "CircleCI-$ENV{CIRCLE_BRANCH}-${commit_sha1}") + +set_from_env(DASHBOARD_BRANCH_DIRECTORY "DASHBOARD_BRANCH_DIRECTORY" REQUIRED) +set_from_env(dashboard_git_branch "CIRCLE_BRANCH") +set_from_env(dashboard_model "DASHBOARD_MODEL" DEFAULT "Continuous" ) +set(dashboard_loop 0) + +if ( EXISTS "${CTEST_SOURCE_DIRECTORY}/circle.yml") + list(APPEND CTEST_NOTES_FILES + "${CTEST_SOURCE_DIRECTORY}/circle.yml" + ) +endif() + +if ( EXISTS "${CTEST_SOURCE_DIRECTORY}/.circleci/config.yml") + list(APPEND CTEST_NOTES_FILES + "${CTEST_SOURCE_DIRECTORY}/.circleci/config.yml" + ) +endif() + + +SET (dashboard_cache_default " + BUILD_DOCUMENTATION:BOOL=OFF + BUILD_EXAMPLES:BOOL=OFF + BUILD_SHARED_LIBS:BOOL=ON + BUILD_TESTING:BOOL=ON + ITK_USE_KWSTYLE:BOOL=OFF + ITK_BUILD_DEFAULT_MODULES:BOOL=ON +" ) + +set_from_env(dashboard_cache "CTEST_CACHE" DEFAULT ${dashboard_cache_default}) + + +if (DEFINED ENV{DISTCC_DIR}) + SET (dashboard_cache "${dashboard_cache} + CMAKE_CXX_COMPILER_LAUNCHER:STRING=distcc + CMAKE_C_COMPILER_LAUNCHER:STRING=distcc +") +endif() + + + +include("${DASHBOARD_BRANCH_DIRECTORY}/itk_common.cmake") diff --git a/.circleci/config.yml b/.circleci/config.yml index a6abacdf32a..63992b02989 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,4 +1,28 @@ referenced: + defaults: &defaults + docker: + - image: circleci/python:2.7 + working_directory: ~/ + resource_class: large + environment: + DASHBOARD_BRANCH_DIRECTORY: /home/circleci/ITK-dashboard + CTEST_DASHBOARD_ROOT: /home/circleci + CTEST_SOURCE_DIRECTORY: /home/circleci/ITK + CTEST_BINARY_DIRECTORY: /home/circleci/ITK-build + CTEST_BUILD_FLAGS: "-j 4" + CTEST_CONFIGURATION_TYPE: "Release" + CTEST_OUTPUT_ON_FAILURE: 1 + PARALLEL_LEVEL: 4 + CCACHE_NODIRECT: 1 + ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS: 2 + dependencies: &dependencies + run: + name: Dependencies + command: | + sudo apt-get install -y rsync ninja-build ccache + sudo pip install --upgrade pip + sudo pip install scikit-ci-addons + ci_addons circle/install_cmake.py 3.9.5 generate-hash-step: &generate-hash-step run: name: Generate external data hash @@ -10,65 +34,45 @@ referenced: keys: - 'v1-external-data-{{ checksum "/home/circleci/external-data.hashable" }}' - 'v1-external-data' - + restore-ccache-step: &restore-ccache-step + restore_cache: + keys: + - ccache-{{ arch }}-{{ .Branch }} + - ccache-{{ arch }}-master + clone-dashboard-step: &clone-dashboard-step + run: + name: Cloning dashboard branch + command: | + git clone --single-branch ${CIRCLE_REPOSITORY_URL} -b dashboard ${DASHBOARD_BRANCH_DIRECTORY} + env-step: &env-step + run: + name: Additional Environment Variables + command: | + echo 'export DASHBOARD_MODEL=$( [[ "$CIRCLE_BRANCH" = "master" || "$CIRCLE_BRANCH" = "next" || "$CIRCLE_BRANCH" = "release" ]] && echo Continuous || echo Experimental )' >> $BASH_ENV + echo 'export PATH=/usr/lib/ccache:${PATH}' >> $BASH_ENV version: 2 jobs: build: - docker: - - image: circleci/python:2.7 - working_directory: ~/ - resource_class: large - branches: - ignore: - - gh-pages - - dashboard - - hooks - environment: - CTEST_DASHBOARD_ROOT: /home/circleci - CTEST_SOURCE_DIRECTORY: /home/circleci/ITK - CTEST_BINARY_DIRECTORY: /home/circleci/ITK-build - DASHBOARD_BRANCH_DIRECTORY: /home/circleci/ITK-dashboard - ExternalData_OBJECT_STORES: /home/circleci/.ExternalData + <<: *defaults steps: - checkout: path : ~/ITK - *generate-hash-step - *restore-data-step - - restore_cache: - keys: - - ccache-{{ arch }}-{{ .Branch }} - - ccache-{{ arch }}-master - - run: - name: Cloning dashboard branch - command: | - git clone --single-branch ${CIRCLE_REPOSITORY_URL} -b dashboard ${DASHBOARD_BRANCH_DIRECTORY} - - run: - name: Dependencies - command: | - sudo apt-get install -y rsync ninja-build ccache - sudo pip install --upgrade pip - sudo pip install scikit-ci-addons - ci_addons circle/install_cmake.py 3.9.5 + - *restore-ccache-step + - *clone-dashboard-step + - *dependencies + - *env-step - run: name: CCache initialization command: | ccache --show-stats ccache --zero-stats ccache --max-size=2.0G - - run: echo 'export DASHBOARD_MODEL=$( [[ "$CIRCLE_BRANCH" = "master" ]] && echo Continuous || echo Experimental )' >> $BASH_ENV - run: name: Build and Testing with CTest - environment: - ITK_GLOBAL_DEFAULT_NUMBER_OF_THREAD: 2 - CTEST_OUTPUT_ON_FAILURE: 1 - CTEST_CONFIGURATION_TYPE: "Release" - CTEST_BUILD_FLAGS: "-j 5" - PARALLEL_LEVEL: 4 - CTEST_CMAKE_GENERATOR: "Ninja" command: | - export PATH=/usr/lib/ccache:${PATH} - mkdir -p ${CTEST_BINARY_DIRECTORY} - ctest -V -Ddashboard_no_clean:BOOL=1 \ + ctest -V \ -DCTEST_CUSTOM_WARNING_EXCEPTION:STRING="itkIndex.h:.*warning: array subscript is above array bounds" \ -S "${DASHBOARD_BRANCH_DIRECTORY}/circleci.cmake" - run: @@ -92,3 +96,44 @@ jobs: - save_cache: key: 'v1-external-data-{{ checksum "/home/circleci/external-data.hashable" }}' paths: [ "/home/circleci/.ExternalData" ] + + docs: + <<: *defaults + steps: + - checkout: + path : ~/ITK + - *generate-hash-step + - *restore-data-step + - *restore-ccache-step + - *clone-dashboard-step + - *dependencies + - *env-step + - run: + name: Additional Dependencies + command: | + sudo apt-get install -y doxygen graphviz + - run: + name: Build and Testing with CTest + no_output_timeout: 60.0m + environment: + CTEST_BUILD_TARGET: "Documentation" + CTEST_CACHE: " + BUILD_DOCUMENTATION:BOOL=ON" + command: | + ctest -V \ + -DCTEST_TEST_ARGS="INCLUDE;Doxygen" \ + -S "${CTEST_SOURCE_DIRECTORY}/.circleci/circleci.cmake" + - run: + name: Archiving directory for artifact + when: always + command: | + cd ${CTEST_BINARY_DIRECTORY}/Utilities/Doxygen + tar -zcvf ~/itk_doxygen_html.tar.gz html + - store_artifacts: + path: /home/circleci/itk_doxygen_html.tar.gz +workflows: + version: 2 + build_and_test: + jobs: + - docs + - build diff --git a/Modules/Core/Common/include/itkIndex.h b/Modules/Core/Common/include/itkIndex.h index 389f210df49..b1e0bd86336 100644 --- a/Modules/Core/Common/include/itkIndex.h +++ b/Modules/Core/Common/include/itkIndex.h @@ -298,7 +298,13 @@ struct ITK_TEMPLATE_EXPORT Index final /** Return a basis vector of the form [0, ..., 0, 1, 0, ... 0] where the "1" * is positioned in the location specified by the parameter "dim". Valid * values of "dim" are 0, ..., VDimension-1. */ - static Self GetBasisIndex(unsigned int dim); + static Self GetBasisIndex(unsigned int dim) + { + Self ind{{0}}; + + ind.m_InternalArray[dim] = 1; + return ind; + } // ======================= Mirror the access pattern behavior of the std::array class @@ -445,18 +451,8 @@ struct ITK_TEMPLATE_EXPORT Index final } } -}; //------------ End struct Index - -template -Index -Index -::GetBasisIndex(unsigned int dim) -{ - Self ind{{0}}; - - ind.m_InternalArray[dim] = 1; - return ind; -} +}; +//------------ End struct Index template std::ostream & operator<<(std::ostream & os, const Index & obj) diff --git a/Utilities/Doxygen/doxygen.config.in b/Utilities/Doxygen/doxygen.config.in index afe82c178dd..e29616058ee 100644 --- a/Utilities/Doxygen/doxygen.config.in +++ b/Utilities/Doxygen/doxygen.config.in @@ -2321,7 +2321,7 @@ MSCFILE_DIRS = # Minimum value: 0, maximum value: 10000, default value: 50. # This tag requires that the tag HAVE_DOT is set to YES. -DOT_GRAPH_MAX_NODES = 150 +DOT_GRAPH_MAX_NODES = 500 # The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs # generated by dot. A depth value of 3 means that only nodes reachable from the