diff options
159 files changed, 5645 insertions, 863 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 4795fe0..8522cad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ #============================================================================= # CMake - Cross Platform Makefile Generator -# Copyright 2000-2011 Kitware, Inc., Insight Software Consortium +# Copyright 2000-2012 Kitware, Inc., Insight Software Consortium # # Distributed under the OSI-approved BSD License (the "License"); # see accompanying file Copyright.txt for details. @@ -9,7 +9,7 @@ # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # See the License for more information. #============================================================================= -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8.2 FATAL_ERROR) SET(CMAKE_LEGACY_CYGWIN_WIN32 0) # Remove when CMake >= 2.8.4 is required PROJECT(CMake) @@ -324,10 +324,9 @@ MACRO (CMAKE_BUILD_UTILITIES) #--------------------------------------------------------------------- # Build or use system libarchive for CMake and CTest. IF(CMAKE_USE_SYSTEM_LIBARCHIVE) - IF(EXISTS ${CMAKE_ROOT}/Modules/FindLibArchive.cmake) + IF(EXISTS ${CMAKE_ROOT}/Modules/FindLibArchive.cmake) # added in 2.8.3 FIND_PACKAGE(LibArchive) ELSE() - CMAKE_MINIMUM_REQUIRED(VERSION 2.8.0 FATAL_ERROR) INCLUDE(${CMake_SOURCE_DIR}/Modules/FindLibArchive.cmake) ENDIF() IF(NOT LibArchive_FOUND) @@ -422,26 +421,13 @@ ENDIF() # The main section of the CMakeLists file # #----------------------------------------------------------------------- -# The CMake version number. -SET(CMake_VERSION_MAJOR 2) -SET(CMake_VERSION_MINOR 8) -SET(CMake_VERSION_PATCH 8) -SET(CMake_VERSION_TWEAK 0) -#SET(CMake_VERSION_RC 2) - -# Releases define a tweak level. -IF(DEFINED CMake_VERSION_TWEAK) +INCLUDE(Source/CMakeVersion.cmake) +# Releases define a small tweak level. +IF("${CMake_VERSION_TWEAK}" VERSION_LESS 20000000) SET(CMake_VERSION_IS_RELEASE 1) SET(CMake_VERSION_SOURCE "") ELSE() SET(CMake_VERSION_IS_RELEASE 0) - - # Use the date as the tweak level. - INCLUDE(${CMake_SOURCE_DIR}/Source/kwsys/kwsysDateStamp.cmake) - SET(CMake_VERSION_TWEAK - "${KWSYS_DATE_STAMP_YEAR}${KWSYS_DATE_STAMP_MONTH}${KWSYS_DATE_STAMP_DAY}" - ) - INCLUDE(${CMake_SOURCE_DIR}/Source/CMakeVersionSource.cmake) ENDIF() @@ -633,6 +619,9 @@ INSTALL( WORLD_READ WORLD_EXECUTE ) +# process docs related install +ADD_SUBDIRECTORY(Docs) + #----------------------------------------------------------------------- # End of the main section of the CMakeLists file #----------------------------------------------------------------------- diff --git a/Docs/CMakeLists.txt b/Docs/CMakeLists.txt new file mode 100644 index 0000000..b04b32d --- /dev/null +++ b/Docs/CMakeLists.txt @@ -0,0 +1,4 @@ +string(REGEX REPLACE "^/(.*)" "\\1" REL_CMAKE_DATA_DIR "${CMAKE_DATA_DIR}") +install(FILES cmake-help.vim cmake-indent.vim cmake-syntax.vim DESTINATION ${REL_CMAKE_DATA_DIR}/editors/vim) +install(FILES cmake-mode.el DESTINATION ${REL_CMAKE_DATA_DIR}/editors/emacs) +ADD_SUBDIRECTORY (bash-completion) diff --git a/Docs/bash-completion/CMakeLists.txt b/Docs/bash-completion/CMakeLists.txt new file mode 100644 index 0000000..592b71e --- /dev/null +++ b/Docs/bash-completion/CMakeLists.txt @@ -0,0 +1,8 @@ +# Always install completion file in local dir +# in order to be sure to always be able to install +# in a local user directory rooted in a single directory. +# packager should either patch that out or +# add symlinks to the files in appropriate places +# /etc/bash_completion.d/ +# DATADIR/completions (may be /usr/share/<package>/completions +install(FILES cmake cpack ctest DESTINATION ${REL_CMAKE_DATA_DIR}/completions) diff --git a/Docs/bash-completion/cmake b/Docs/bash-completion/cmake new file mode 100644 index 0000000..59b565a --- /dev/null +++ b/Docs/bash-completion/cmake @@ -0,0 +1,149 @@ +# bash completion for cmake(1) -*- shell-script -*- + +_cmake() +{ + local cur prev words cword split=false + _init_completion -n := || return + + # Workaround for options like -DCMAKE_BUILD_TYPE=Release + local prefix= + if [[ $cur == -D* ]]; then + prev=-D + prefix=-D + cur="${cur#-D}" + elif [[ $cur == -U* ]]; then + prev=-U + prefix=-U + cur="${cur#-U}" + fi + + case "$prev" in + -D) + if [[ $cur == *=* ]]; then + # complete values for variables + local var type value + var="${cur%%[:=]*}" + value="${cur#*=}" + + if [[ $cur == CMAKE_BUILD_TYPE* ]]; then # most widely used case + COMPREPLY=( $( compgen -W 'Debug Release RelWithDebInfo + MinSizeRel' -- "$value" ) ) + return + fi + + if [[ $cur == *:* ]]; then + type="${cur#*:}" + type="${type%%=*}" + else # get type from cache if it's not set explicitly + type=$( cmake -LA -N 2>/dev/null | grep "$var:" \ + 2>/dev/null ) + type="${type#*:}" + type="${type%%=*}" + fi + case "$type" in + FILEPATH) + cur="$value" + _filedir + return + ;; + PATH) + cur="$value" + _filedir -d + return + ;; + BOOL) + COMPREPLY=( $( compgen -W 'ON OFF TRUE FALSE' -- \ + "$value" ) ) + return + ;; + STRING|INTERNAL) + # no completion available + return + ;; + esac + elif [[ $cur == *:* ]]; then + # complete types + local type="${cur#*:}" + COMPREPLY=( $( compgen -W 'FILEPATH PATH STRING BOOL INTERNAL'\ + -S = -- "$type" ) ) + compopt -o nospace + else + # complete variable names + COMPREPLY=( $( compgen -W '$( cmake -LA -N | tail -n +2 | + cut -f1 -d: )' -P "$prefix" -- "$cur" ) ) + compopt -o nospace + fi + return + ;; + -U) + COMPREPLY=( $( compgen -W '$( cmake -LA -N | tail -n +2 | + cut -f1 -d: )' -P "$prefix" -- "$cur" ) ) + return + ;; + esac + + _split_longopt && split=true + + case "$prev" in + -C|-P|--graphviz|--system-information) + _filedir + return + ;; + --build) + _filedir -d + return + ;; + -E) + COMPREPLY=( $( compgen -W "$( cmake -E help |& sed -n \ + '/^ /{s|^ \([^ ]\{1,\}\) .*$|\1|;p}' 2>/dev/null )" \ + -- "$cur" ) ) + return + ;; + -G) + # FIXME: doesn't work properly + local IFS=$'\n' + COMPREPLY=( $( compgen -W '$( cmake --help 2>/dev/null | sed -n \ + "/^.*[^ ].*= Generates/{s|^ *\(.*[^ ]\) *= Generates.*$|\1|;s| |\\\\ |g;p}" \ + 2>/dev/null )' -- "$cur" ) ) + return + ;; + --help-command) + COMPREPLY=( $( compgen -W '$( cmake --help-command-list 2>/dev/null| + tail -n +2 )' -- "$cur" ) ) + return + ;; + --help-module) + COMPREPLY=( $( compgen -W '$( cmake --help-module-list 2>/dev/null| + tail -n +2 )' -- "$cur" ) ) + return + ;; + --help-policy) + COMPREPLY=( $( compgen -W '$( cmake --help-policies 2>/dev/null | + grep "^ CMP" 2>/dev/null )' -- "$cur" ) ) + return + ;; + --help-property) + COMPREPLY=( $( compgen -W '$( cmake --help-property-list \ + 2>/dev/null | tail -n +2 )' -- "$cur" ) ) + return + ;; + --help-variable) + COMPREPLY=( $( compgen -W '$( cmake --help-variable-list \ + 2>/dev/null | tail -n +2 )' -- "$cur" ) ) + return + ;; + esac + + $split && return + + if [[ "$cur" == -* ]]; then + COMPREPLY=( $(compgen -W '$( _parse_help "$1" --help )' -- ${cur}) ) + [[ $COMPREPLY == *= ]] && compopt -o nospace + [[ $COMPREPLY ]] && return + fi + + _filedir +} && +complete -F _cmake cmake + +# ex: ts=4 sw=4 et filetype=sh diff --git a/Docs/bash-completion/cpack b/Docs/bash-completion/cpack new file mode 100644 index 0000000..84dcfd5 --- /dev/null +++ b/Docs/bash-completion/cpack @@ -0,0 +1,61 @@ +# bash completion for cpack(1) -*- shell-script -*- + +_cpack() +{ + local cur prev words cword + _init_completion -n = || return + + case "$prev" in + -G) + COMPREPLY=( $( compgen -W '$( cpack --help 2>/dev/null | + grep "^ .*=\ .*" 2> /dev/null | grep -v "^ -" 2>/dev/null | + cut -d" " -f 3 )' -- "$cur" ) ) + return + ;; + -C) + COMPREPLY=( $( compgen -W 'Debug Release RelWithDebInfo + MinSizeRel' -- "$cur" ) ) + return + ;; + -D) + [[ $cur == *=* ]] && return # no completion for values + COMPREPLY=( $( compgen -W '$( cpack --help-variable-list \ + 2>/dev/null | tail -n +2 )' -S = -- "$cur" ) ) + compopt -o nospace + return + ;; + -P|-R|--vendor) + # argument required but no completions available + return + ;; + -B) + _filedir -d + return + ;; + --config) + _filedir + return + ;; + --help-command) + COMPREPLY=( $( compgen -W '$( cpack --help-command-list 2>/dev/null| + tail -n +2 )' -- "$cur" ) ) + return + ;; + --help-variable) + COMPREPLY=( $( compgen -W '$( cpack --help-variable-list \ + 2>/dev/null | tail -n +2 )' -- "$cur" ) ) + return + ;; + esac + + if [[ "$cur" == -* ]]; then + COMPREPLY=( $(compgen -W '$( _parse_help "$1" --help )' -- ${cur}) ) + [[ $COMPREPLY == *= ]] && compopt -o nospace + [[ $COMPREPLY ]] && return + fi + + _filedir +} && +complete -F _cpack cpack + +# ex: ts=4 sw=4 et filetype=sh diff --git a/Docs/bash-completion/ctest b/Docs/bash-completion/ctest new file mode 100644 index 0000000..9707f62 --- /dev/null +++ b/Docs/bash-completion/ctest @@ -0,0 +1,81 @@ +# bash completion for ctest(1) -*- shell-script -*- + +_ctest() +{ + local cur prev words cword + _init_completion -n = || return + + case "$prev" in + -C|--build-config) + COMPREPLY=( $( compgen -W 'Debug Release RelWithDebInfo + MinSizeRel' -- "$cur" ) ) + return + ;; + -j|--parallel) + COMPREPLY=( $( compgen -W "{1..$(( $(_ncpus)*2 ))}" -- "$cur" ) ) + return + ;; + -O|--output-log|-A|--add-notes|--extra-submit) + _filedir + return + ;; + -L|--label-regex|-LE|--label-exclude|--track|-I|--tests-information|\ + --max-width|--timeout|--stop-time) + # argument required but no completions available + return + ;; + -R|--tests-regex|-E|--exclude-regex) + COMPREPLY=( $( compgen -W '$( ctest -N 2>/dev/null | + grep "^ Test" 2>/dev/null | cut -d: -f 2 )' -- "$cur" ) ) + return + ;; + -D|--dashboard) + if [[ $cur == @(Experimental|Nightly|Continuous)* ]]; then + local model action + action=${cur#@(Experimental|Nightly|Continuous)} + model=${cur%"$action"} + COMPREPLY=( $( compgen -W 'Start Update Configure Build Test + Coverage Submit MemCheck' -P "$model" -- "$action" ) ) + else + COMPREPLY=( $( compgen -W 'Experimental Nightly Continuous' \ + -- "$cur" ) ) + compopt -o nospace + fi + return + ;; + -M|--test-model) + COMPREPLY=( $( compgen -W 'Experimental Nightly Continuous' -- \ + "$cur" ) ) + return + ;; + -T|--test-action) + COMPREPLY=( $( compgen -W 'Start Update Configure Build Test + Coverage Submit MemCheck' -- "$cur" ) ) + return + ;; + -S|--script|-SP|--script-new-process) + # FIXME ? + return + ;; + --interactive-debug-mode) + COMPREPLY=( $( compgen -W '0 1' -- "$cur" ) ) + return + ;; + --help-command) + COMPREPLY=( $( compgen -W '$( ctest --help-command-list 2>/dev/null| + tail -n +2 )' -- "$cur" ) ) + return + ;; + esac + + if [[ "$cur" == -* ]]; then + COMPREPLY=( $(compgen -W '$( _parse_help "$1" --help )' -- ${cur}) ) + [[ $COMPREPLY == *= ]] && compopt -o nospace + [[ $COMPREPLY ]] && return + fi + + _filedir +} && +complete -F _ctest ctest + +# ex: ts=4 sw=4 et filetype=sh diff --git a/Docs/cmake-completion b/Docs/cmake-completion deleted file mode 100644 index d70ac24..0000000 --- a/Docs/cmake-completion +++ /dev/null @@ -1,207 +0,0 @@ -# -# bash-completion file for CMake -# Provided by Eric NOULARD - eric.noulard@gmail.com -# -# see http://bash-completion.alioth.debian.org/ -# and http://www.cmake.org -# -# We will try to complete cmake commands options -# at 2 (or may be 3 levels) -# [cmake|cpack|ctest] <level0> <level1> <level2> -# -# level0 is top level cmake/cpack/ctest options -# level1 is the first argument of level0 option -# level2 is the seconf argument of level1 argument -# FIXME: I don't know how to handle level2 -# -# The file has been proposed for inclusion in the bash-completion package -# https://alioth.debian.org/tracker/?func=detail&atid=413095&aid=312632&group_id=100114 -# In the meantime, -# 1) If you want to test bash completion for cmake/cpack/ctest -# just source the current file at bash prompt -# . ./cmake-completion -# -# 2) If you want to install it for good copy this file to -# cp cmake-completion /etc/bash_completion.d/cmake -# - -# -# cmake command -# -# have cmake && -_cmake() -{ - local cur prev opts words cword - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - # seems to be only available on bash-completion 1.2 - #_get_comp_words_by_ref cur prev - - # cmake command line option we want to complete - opts=`cmake --help | grep "^ \-.*=\ .*" | cut -d" " -f 3 | cut -d= -f 1 | cut -d[ -f 1` - - # - # Complete the arguments to some of - # the most commonly used commands (Level 1). - # - case "${prev}" in - -E) - local running=$(for x in `cmake -E |& grep "^ " | cut -d" " -f 3`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - # FIXME: don't know how to handle multi words completion - # or more precisely word that contains space in them like "Unix Makefiles" - # -G) - # local running=$(for x in `cmake --help | grep "^ .*=\ .*" | grep -v "^ -" | cut -d"=" -f 1 | grep -v "^ "`; do echo \"${x}\" ; done ) - # COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - # return 0 - # ;; - --help-command) - local running=$(for x in `cmake --help-command-list | grep -v "cmake version"`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --help-module) - local running=$(for x in `cmake --help-module-list | grep -v "cmake version"`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --help-policy) - local running=$(for x in `cmake --help-policies | grep "^ CMP"`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --help-property) - local running=$(for x in `cmake --help-property-list | grep -v "cmake version"`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --help-variable) - local running=$(for x in `cmake --help-variable-list | grep -v "cmake version"`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - *) - ;; - esac - - # - # Complete the arguments to some of - # the most commonly used commands (Level 2). - # ?? How to do that .. - - # - # Complete the option (Level 0 - right after cmake) - # - COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) -} && -complete -F _cmake -o default cmake - -# -# cpack command -# -#have cpack && -_cpack() -{ - local cur prev opts words cword - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - # seems to be only available on bash-completion 1.2 - #_get_comp_words_by_ref cur prev - - # cpack command line option we want to complete - opts=`cpack --help | grep "^ \-.*=\ .*" | cut -d" " -f 3 | cut -d= -f 1` - opts="${opts} --help -V" - - # - # Complete the arguments to some of - # the most commonly used commands (Level 1). - # - case "${prev}" in - -G) - local running=$(for x in `cpack --help | grep "^ .*=\ .*" | grep -v "^ -" | cut -d" " -f 3`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --config) - COMPREPLY=( $(compgen -f ${cur}) ) - return 0 - ;; - --help-variable) - local running=$(for x in `cpack --help-variable-list | grep -v "cpack version" `; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - --help-command) - local running=$(for x in `cpack --help-command-list | grep -v "cpack version" `; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - *) - ;; - esac - - # - # Complete the option (Level 0 - right after cpack) - # - COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) -} && -complete -F _cpack -o default cpack - -# -# ctest command -# -# have ctest && -_ctest() -{ - local cur prev opts words cword - COMPREPLY=() - cur="${COMP_WORDS[COMP_CWORD]}" - prev="${COMP_WORDS[COMP_CWORD-1]}" - # seems to be only available on bash-completion 1.2 - #_get_comp_words_by_ref cur prev - - # cmake command line option we want to complete - opts=`ctest --help | grep "\-\-.*" | cut -d" " -f 3 | sed s/,/\\\n/g` - - # - # Complete the arguments to some of - # the most commonly used commands (Level 1). - # - case "${prev}" in - --help-command) - local running=$(for x in `ctest --help-command-list | grep -v "ctest version" `; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - -R|-E) - local running=$(for x in `ctest -N 2> /dev/null | grep "^ Test" | cut -d: -f 2`; do echo ${x} ; done ) - COMPREPLY=( $(compgen -W "${running}" -- ${cur}) ) - return 0 - ;; - *) - ;; - esac - - # - # Complete the arguments to some of - # the most commonly used commands (Level 2). - # ?? How to do that .. - - # - # Complete the option (Level 0 - right after cmake) - # - COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) -} && -complete -F _ctest -o default ctest - -# Local variables: -# mode: shell-script -# sh-basic-offset: 4 -# sh-indent-comment: t -# indent-tabs-mode: nil -# End: -# ex: ts=4 sw=4 et filetype=sh diff --git a/Modules/CMakeCInformation.cmake b/Modules/CMakeCInformation.cmake index 6b5efba..afac7a4 100644 --- a/Modules/CMakeCInformation.cmake +++ b/Modules/CMakeCInformation.cmake @@ -164,7 +164,7 @@ INCLUDE(CMakeCommonLanguageInclude) # create a C shared library IF(NOT CMAKE_C_CREATE_SHARED_LIBRARY) SET(CMAKE_C_CREATE_SHARED_LIBRARY - "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_C_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_C_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") ENDIF(NOT CMAKE_C_CREATE_SHARED_LIBRARY) # create a C shared module just copy the shared library rule diff --git a/Modules/CMakeCXXInformation.cmake b/Modules/CMakeCXXInformation.cmake index 25abb8c..608b833 100644 --- a/Modules/CMakeCXXInformation.cmake +++ b/Modules/CMakeCXXInformation.cmake @@ -242,7 +242,7 @@ INCLUDE(CMakeCommonLanguageInclude) # create a shared C++ library IF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY) SET(CMAKE_CXX_CREATE_SHARED_LIBRARY - "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_CXX_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") ENDIF(NOT CMAKE_CXX_CREATE_SHARED_LIBRARY) # create a c++ shared module copy the shared library rule by default diff --git a/Modules/CMakeFortranInformation.cmake b/Modules/CMakeFortranInformation.cmake index 76cf34e..2cbd7f8 100644 --- a/Modules/CMakeFortranInformation.cmake +++ b/Modules/CMakeFortranInformation.cmake @@ -171,7 +171,7 @@ INCLUDE(CMakeCommonLanguageInclude) # create a Fortran shared library IF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY) SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY - "<CMAKE_Fortran_COMPILER> <CMAKE_SHARED_LIBRARY_Fortran_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_Fortran_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_Fortran_COMPILER> <CMAKE_SHARED_LIBRARY_Fortran_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") ENDIF(NOT CMAKE_Fortran_CREATE_SHARED_LIBRARY) # create a Fortran shared module just copy the shared library rule diff --git a/Modules/CMakeGenericSystem.cmake b/Modules/CMakeGenericSystem.cmake index ee8040e..127588f 100644 --- a/Modules/CMakeGenericSystem.cmake +++ b/Modules/CMakeGenericSystem.cmake @@ -77,6 +77,8 @@ function(GetDefaultWindowsPrefixBase var) # if("${CMAKE_GENERATOR}" MATCHES "(Win64|IA64)") set(arch_hint "x64") + elseif("${CMAKE_GENERATOR}" MATCHES "ARM") + set(arch_hint "ARM") elseif("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8") set(arch_hint "x64") elseif("$ENV{LIB}" MATCHES "(amd64|ia64)") diff --git a/Modules/CMakePlatformId.h.in b/Modules/CMakePlatformId.h.in index b69bf63..6341dca 100644 --- a/Modules/CMakePlatformId.h.in +++ b/Modules/CMakePlatformId.h.in @@ -97,6 +97,9 @@ # elif defined(_M_IX86) # define ARCHITECTURE_ID "X86" +# elif defined(_M_ARM) +# define ARCHITECTURE_ID "ARM" + # else /* unknown architecture */ # define ARCHITECTURE_ID "" # endif diff --git a/Modules/CPack.cmake b/Modules/CPack.cmake index 571770e..e572119 100644 --- a/Modules/CPack.cmake +++ b/Modules/CPack.cmake @@ -89,6 +89,7 @@ # CPACK_PACKAGE_FILE_NAME - The name of the package file to generate, # not including the extension. For example, cmake-2.6.1-Linux-i686. # The default value is +# # ${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}. ##end # @@ -341,6 +342,10 @@ cpack_set_if_not_set(CPACK_RESOURCE_FILE_WELCOME cpack_set_if_not_set(CPACK_MODULE_PATH "${CMAKE_MODULE_PATH}") +IF(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL) + SET(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) +ENDIF(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL) + IF(CPACK_NSIS_MODIFY_PATH) SET(CPACK_NSIS_MODIFY_PATH ON) ENDIF(CPACK_NSIS_MODIFY_PATH) diff --git a/Modules/CPackNSIS.cmake b/Modules/CPackNSIS.cmake index 5e2ba17..d140053 100644 --- a/Modules/CPackNSIS.cmake +++ b/Modules/CPackNSIS.cmake @@ -31,13 +31,21 @@ ##end # ##variable -# CPACK_NSIS_EXTRA_INSTALL_COMMANDS - Extra NSIS commands that will -# be added to the install Section. +# CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS - Extra NSIS commands that +# will be added to the beginning of the install Section, before your +# install tree is available on the target system. +##end +# +##variable +# CPACK_NSIS_EXTRA_INSTALL_COMMANDS - Extra NSIS commands that +# will be added to the end of the install Section, after your +# install tree is available on the target system. ##end # ##variable # CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS - Extra NSIS commands that will -# be added to the uninstall Section. +# be added to the uninstall Section, before your install tree is +# removed from the target system. ##end # ##variable @@ -46,6 +54,14 @@ ##end # ##variable +# CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL - Ask about uninstalling +# previous versions first. +# If this is set to "ON", then an installer will look for previous +# installed versions and if one is found, ask the user whether to +# uninstall it before proceeding with the install. +##end +# +##variable # CPACK_NSIS_MODIFY_PATH - Modify PATH toggle. # If this is set to "ON", then an extra page # will appear in the installer that will allow the user to choose diff --git a/Modules/CheckCCompilerFlag.cmake b/Modules/CheckCCompilerFlag.cmake index 1c08c59..90d04ac 100644 --- a/Modules/CheckCCompilerFlag.cmake +++ b/Modules/CheckCCompilerFlag.cmake @@ -33,7 +33,9 @@ MACRO (CHECK_C_COMPILER_FLAG _FLAG _RESULT) FAIL_REGEX "unknown .*option" # Clang FAIL_REGEX "ignoring unknown option" # MSVC FAIL_REGEX "warning D9002" # MSVC, any lang - FAIL_REGEX "option .*not supported" # Intel + FAIL_REGEX "option.*not supported" # Intel + FAIL_REGEX "invalid argument .*option" # Intel + FAIL_REGEX "ignoring option .*argument required" # Intel FAIL_REGEX "[Uu]nknown option" # HP FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro FAIL_REGEX "command option .* is not recognized" # XL diff --git a/Modules/CheckCXXCompilerFlag.cmake b/Modules/CheckCXXCompilerFlag.cmake index 6fa69b1..19963ea 100644 --- a/Modules/CheckCXXCompilerFlag.cmake +++ b/Modules/CheckCXXCompilerFlag.cmake @@ -33,7 +33,9 @@ MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT) FAIL_REGEX "unknown .*option" # Clang FAIL_REGEX "ignoring unknown option" # MSVC FAIL_REGEX "warning D9002" # MSVC, any lang - FAIL_REGEX "option .*not supported" # Intel + FAIL_REGEX "option.*not supported" # Intel + FAIL_REGEX "invalid argument .*option" # Intel + FAIL_REGEX "ignoring option .*argument required" # Intel FAIL_REGEX "[Uu]nknown option" # HP FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro FAIL_REGEX "command option .* is not recognized" # XL diff --git a/Modules/Compiler/XL.cmake b/Modules/Compiler/XL.cmake index d2567d5..d293610 100644 --- a/Modules/Compiler/XL.cmake +++ b/Modules/Compiler/XL.cmake @@ -47,7 +47,7 @@ macro(__compiler_xl lang) # files so that we export only the symbols actually provided by the sources. set(CMAKE_${lang}_CREATE_SHARED_LIBRARY "${CMAKE_XL_CreateExportList} <OBJECT_DIR>/objects.exp <OBJECTS>" - "<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <CMAKE_SHARED_LIBRARY_SONAME_${lang}_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" + "<CMAKE_${lang}_COMPILER> <CMAKE_SHARED_LIBRARY_${lang}_FLAGS> <LANGUAGE_COMPILE_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_${lang}_FLAGS> -Wl,-bE:<OBJECT_DIR>/objects.exp <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>" ) endif() endmacro() diff --git a/Modules/ExternalProject.cmake b/Modules/ExternalProject.cmake index b6fe190..0353e45 100644 --- a/Modules/ExternalProject.cmake +++ b/Modules/ExternalProject.cmake @@ -252,12 +252,23 @@ define_property(DIRECTORY PROPERTY "EP_STEP_TARGETS" INHERITED ) -function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag src_name work_dir) +function(_ep_write_gitclone_script script_filename source_dir git_EXECUTABLE git_repository git_tag src_name work_dir gitclone_infofile gitclone_stampfile) file(WRITE ${script_filename} "if(\"${git_tag}\" STREQUAL \"\") message(FATAL_ERROR \"Tag for git checkout should not be empty.\") endif() +set(run 0) + +if(\"${gitclone_infofile}\" IS_NEWER_THAN \"${gitclone_stampfile}\") + set(run 1) +endif() + +if(NOT run) + message(STATUS \"Avoiding repeated git clone, stamp file is up to date: '${gitclone_stampfile}'\") + return() +endif() + execute_process( COMMAND \${CMAKE_COMMAND} -E remove_directory \"${source_dir}\" RESULT_VARIABLE error_code @@ -302,6 +313,19 @@ if(error_code) message(FATAL_ERROR \"Failed to update submodules in: '${work_dir}/${src_name}'\") endif() +# Complete success, update the script-last-run stamp file: +# +execute_process( + COMMAND \${CMAKE_COMMAND} -E copy + \"${gitclone_infofile}\" + \"${gitclone_stampfile}\" + WORKING_DIRECTORY \"${work_dir}/${src_name}\" + RESULT_VARIABLE error_code + ) +if(error_code) + message(FATAL_ERROR \"Failed to copy script-last-run stamp file: '${gitclone_stampfile}'\") +endif() + " ) @@ -824,15 +848,23 @@ function(_ep_get_configuration_subdir_suffix suffix_var) endfunction(_ep_get_configuration_subdir_suffix) -function(ExternalProject_Add_StepTargets name) - set(steps ${ARGN}) +function(_ep_get_step_stampfile name step stampfile_var) + ExternalProject_Get_Property(${name} stamp_dir) _ep_get_configuration_subdir_suffix(cfgdir) - ExternalProject_Get_Property(${name} stamp_dir) + set(stampfile "${stamp_dir}${cfgdir}/${name}-${step}") + + set(${stampfile_var} "${stampfile}" PARENT_SCOPE) +endfunction() + + +function(ExternalProject_Add_StepTargets name) + set(steps ${ARGN}) foreach(step ${steps}) + _ep_get_step_stampfile(${name} ${step} stamp_file) add_custom_target(${name}-${step} - DEPENDS ${stamp_dir}${cfgdir}/${name}-${step}) + DEPENDS ${stamp_file}) # Depend on other external projects (target-level). get_property(deps TARGET ${name} PROPERTY _EP_DEPENDS) @@ -845,23 +877,26 @@ endfunction(ExternalProject_Add_StepTargets) function(ExternalProject_Add_Step name step) set(cmf_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles) - ExternalProject_Get_Property(${name} stamp_dir) - _ep_get_configuration_subdir_suffix(cfgdir) + set(complete_stamp_file "${cmf_dir}${cfgdir}/${name}-complete") + _ep_get_step_stampfile(${name} ${step} stamp_file) + add_custom_command(APPEND - OUTPUT ${cmf_dir}${cfgdir}/${name}-complete - DEPENDS ${stamp_dir}${cfgdir}/${name}-${step} + OUTPUT ${complete_stamp_file} + DEPENDS ${stamp_file} ) + _ep_parse_arguments(ExternalProject_Add_Step - ${name} _EP_${step}_ "${ARGN}") + ${name} _EP_${step}_ "${ARGN}") # Steps depending on this step. get_property(dependers TARGET ${name} PROPERTY _EP_${step}_DEPENDERS) foreach(depender IN LISTS dependers) + _ep_get_step_stampfile(${name} ${depender} depender_stamp_file) add_custom_command(APPEND - OUTPUT ${stamp_dir}${cfgdir}/${name}-${depender} - DEPENDS ${stamp_dir}${cfgdir}/${name}-${step} + OUTPUT ${depender_stamp_file} + DEPENDS ${stamp_file} ) endforeach() @@ -871,7 +906,8 @@ function(ExternalProject_Add_Step name step) # Dependencies on steps. get_property(dependees TARGET ${name} PROPERTY _EP_${step}_DEPENDEES) foreach(dependee IN LISTS dependees) - list(APPEND depends ${stamp_dir}${cfgdir}/${name}-${dependee}) + _ep_get_step_stampfile(${name} ${dependee} dependee_stamp_file) + list(APPEND depends ${dependee_stamp_file}) endforeach() # The command to run. @@ -901,10 +937,10 @@ function(ExternalProject_Add_Step name step) # Run every time? get_property(always TARGET ${name} PROPERTY _EP_${step}_ALWAYS) if(always) - set_property(SOURCE ${stamp_dir}${cfgdir}/${name}-${step} PROPERTY SYMBOLIC 1) + set_property(SOURCE ${stamp_file} PROPERTY SYMBOLIC 1) set(touch) else() - set(touch ${CMAKE_COMMAND} -E touch ${stamp_dir}${cfgdir}/${name}-${step}) + set(touch ${CMAKE_COMMAND} -E touch ${stamp_file}) endif() # Wrap with log script? @@ -914,7 +950,7 @@ function(ExternalProject_Add_Step name step) endif() add_custom_command( - OUTPUT ${stamp_dir}${cfgdir}/${name}-${step} + OUTPUT ${stamp_file} COMMENT ${comment} COMMAND ${command} COMMAND ${touch} @@ -1079,9 +1115,15 @@ function(_ep_add_download_command name) set(git_tag "master") endif() + # For the download step, and the git clone operation, only the repository + # should be recorded in a configured RepositoryInfo file. If the repo + # changes, the clone script should be run again. But if only the tag + # changes, avoid running the clone script again. Let the 'always' running + # update step checkout the new tag. + # set(repository ${git_repository}) set(module) - set(tag ${git_tag}) + set(tag) configure_file( "${CMAKE_ROOT}/Modules/RepositoryInfo.txt.in" "${stamp_dir}/${name}-gitinfo.txt" @@ -1097,6 +1139,7 @@ function(_ep_add_download_command name) # _ep_write_gitclone_script(${tmp_dir}/${name}-gitclone.cmake ${source_dir} ${GIT_EXECUTABLE} ${git_repository} ${git_tag} ${src_name} ${work_dir} + ${stamp_dir}/${name}-gitinfo.txt ${stamp_dir}/${name}-gitclone-lastrun.txt ) set(comment "Performing download step (git clone) for '${name}'") set(cmd ${CMAKE_COMMAND} -P ${tmp_dir}/${name}-gitclone.cmake) @@ -1141,7 +1184,8 @@ function(_ep_add_download_command name) set(comment "Performing download step (verify and extract) for '${name}'") endif() _ep_write_verifyfile_script("${stamp_dir}/verify-${name}.cmake" "${file}" "${md5}") - list(APPEND cmd ${CMAKE_COMMAND} -P ${stamp_dir}/verify-${name}.cmake) + list(APPEND cmd ${CMAKE_COMMAND} -P ${stamp_dir}/verify-${name}.cmake + COMMAND) _ep_write_extractfile_script("${stamp_dir}/extract-${name}.cmake" "${name}" "${file}" "${source_dir}") list(APPEND cmd ${CMAKE_COMMAND} -P ${stamp_dir}/extract-${name}.cmake) endif() @@ -1276,14 +1320,12 @@ endfunction(_ep_add_patch_command) function(_ep_add_configure_command name) ExternalProject_Get_Property(${name} source_dir binary_dir tmp_dir) - _ep_get_configuration_subdir_suffix(cfgdir) - # Depend on other external projects (file-level). set(file_deps) get_property(deps TARGET ${name} PROPERTY _EP_DEPENDS) foreach(dep IN LISTS deps) - get_property(dep_stamp_dir TARGET ${dep} PROPERTY _EP_STAMP_DIR) - list(APPEND file_deps ${dep_stamp_dir}${cfgdir}/${dep}-done) + _ep_get_step_stampfile(${dep} "done" done_stamp_file) + list(APPEND file_deps ${done_stamp_file}) endforeach() get_property(cmd_set TARGET ${name} PROPERTY _EP_CONFIGURE_COMMAND SET) @@ -1446,11 +1488,14 @@ function(ExternalProject_Add name) # Add a custom target for the external project. set(cmf_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles) - add_custom_target(${name} ALL DEPENDS ${cmf_dir}${cfgdir}/${name}-complete) + set(complete_stamp_file "${cmf_dir}${cfgdir}/${name}-complete") + + add_custom_target(${name} ALL DEPENDS ${complete_stamp_file}) set_property(TARGET ${name} PROPERTY _EP_IS_EXTERNAL_PROJECT 1) _ep_parse_arguments(ExternalProject_Add ${name} _EP_ "${ARGN}") _ep_set_directories(${name}) - ExternalProject_Get_Property(${name} stamp_dir) + _ep_get_step_stampfile(${name} "done" done_stamp_file) + _ep_get_step_stampfile(${name} "install" install_stamp_file) # The 'complete' step depends on all other steps and creates a # 'done' mark. A dependent external project's 'configure' step @@ -1461,19 +1506,18 @@ function(ExternalProject_Add name) # parallel builds. However, the Ninja generator needs to see the entire # dependency graph, and can cope with custom commands belonging to # multiple targets, so we add the 'done' mark as an output for Ninja only. - set(complete_outputs ${cmf_dir}${cfgdir}/${name}-complete) + set(complete_outputs ${complete_stamp_file}) if(${CMAKE_GENERATOR} MATCHES "Ninja") - set(complete_outputs - ${complete_outputs} ${stamp_dir}${cfgdir}/${name}-done) + set(complete_outputs ${complete_outputs} ${done_stamp_file}) endif() add_custom_command( OUTPUT ${complete_outputs} COMMENT "Completed '${name}'" COMMAND ${CMAKE_COMMAND} -E make_directory ${cmf_dir}${cfgdir} - COMMAND ${CMAKE_COMMAND} -E touch ${cmf_dir}${cfgdir}/${name}-complete - COMMAND ${CMAKE_COMMAND} -E touch ${stamp_dir}${cfgdir}/${name}-done - DEPENDS ${stamp_dir}${cfgdir}/${name}-install + COMMAND ${CMAKE_COMMAND} -E touch ${complete_stamp_file} + COMMAND ${CMAKE_COMMAND} -E touch ${done_stamp_file} + DEPENDS ${install_stamp_file} VERBATIM ) diff --git a/Modules/FeatureSummary.cmake b/Modules/FeatureSummary.cmake index cef647e..a5b94d1 100644 --- a/Modules/FeatureSummary.cmake +++ b/Modules/FeatureSummary.cmake @@ -318,7 +318,7 @@ FUNCTION(_FS_GET_FEATURE_SUMMARY _property _var _includeQuiet) GET_PROPERTY(_info GLOBAL PROPERTY _CMAKE_${_currentFeature}_PURPOSE) FOREACH(_purpose ${_info}) - SET(_currentFeatureText "${_currentFeatureText}\n * ${_purpose}") + SET(_currentFeatureText "${_currentFeatureText}\n ${_purpose}") ENDFOREACH() ENDIF(includeThisOne) @@ -399,7 +399,7 @@ FUNCTION(FEATURE_SUMMARY) SET(_tmp) _FS_GET_FEATURE_SUMMARY( ${part} _tmp ${_FS_INCLUDE_QUIET_PACKAGES}) IF(_tmp) - SET(_fullText "${_fullText}\n\n-- ${title_${part}}\n${_tmp}") + SET(_fullText "${_fullText}\n-- ${title_${part}}\n${_tmp}\n") IF("${part}" STREQUAL "REQUIRED_PACKAGES_NOT_FOUND") SET(requiredPackagesNotFound TRUE) ENDIF() diff --git a/Modules/FindPkgConfig.cmake b/Modules/FindPkgConfig.cmake index 5d93ab1..39d3a76 100644 --- a/Modules/FindPkgConfig.cmake +++ b/Modules/FindPkgConfig.cmake @@ -13,11 +13,10 @@ # When the 'QUIET' argument is set, no status messages will be printed. # # It sets the following variables: -# PKG_CONFIG_FOUND ... true if pkg-config works on the system +# PKG_CONFIG_FOUND ... if pkg-config executable was found # PKG_CONFIG_EXECUTABLE ... pathname of the pkg-config program # PKG_CONFIG_VERSION_STRING ... the version of the pkg-config program found # (since CMake 2.8.8) -# PKG_CONFIG_FOUND ... if pkg-config executable was found # # For the following variables two sets of values exist; first one is the # common one and has the given PREFIX. The second set contains flags @@ -104,6 +103,11 @@ find_package_handle_standard_args(PkgConfig REQUIRED_VARS PKG_CONFIG_EXECUTABLE VERSION_VAR PKG_CONFIG_VERSION_STRING) +# This is needed because the module name is "PkgConfig" but the name of +# this variable has always been PKG_CONFIG_FOUND so this isn't automatically +# handled by FPHSA. +set(PKG_CONFIG_FOUND "${PKGCONFIG_FOUND}") + # Unsets the given variables macro(_pkgconfig_unset var) set(${var} "" CACHE INTERNAL "") diff --git a/Modules/FindPythonLibs.cmake b/Modules/FindPythonLibs.cmake index fcd0838..591b3e6 100644 --- a/Modules/FindPythonLibs.cmake +++ b/Modules/FindPythonLibs.cmake @@ -82,7 +82,12 @@ FOREACH(_CURRENT_VERSION ${_Python_VERSIONS}) ENDIF(WIN32) FIND_LIBRARY(PYTHON_LIBRARY - NAMES python${_CURRENT_VERSION_NO_DOTS} python${_CURRENT_VERSION} + NAMES + python${_CURRENT_VERSION_NO_DOTS} + python${_CURRENT_VERSION}mu + python${_CURRENT_VERSION}m + python${_CURRENT_VERSION}u + python${_CURRENT_VERSION} PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/libs @@ -120,12 +125,14 @@ FOREACH(_CURRENT_VERSION ${_Python_VERSIONS}) [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_CURRENT_VERSION}\\InstallPath]/include PATH_SUFFIXES + python${_CURRENT_VERSION}mu + python${_CURRENT_VERSION}m + python${_CURRENT_VERSION}u python${_CURRENT_VERSION} ) - # For backward compatibility, set PYTHON_INCLUDE_PATH, but make it internal. - SET(PYTHON_INCLUDE_PATH "${PYTHON_INCLUDE_DIR}" CACHE INTERNAL - "Path to where Python.h is found (deprecated)") + # For backward compatibility, set PYTHON_INCLUDE_PATH. + SET(PYTHON_INCLUDE_PATH "${PYTHON_INCLUDE_DIR}") IF(PYTHON_INCLUDE_DIR AND EXISTS "${PYTHON_INCLUDE_DIR}/patchlevel.h") FILE(STRINGS "${PYTHON_INCLUDE_DIR}/patchlevel.h" python_version_str diff --git a/Modules/FindQt4.cmake b/Modules/FindQt4.cmake index 9b646b4..f9db5e1 100644 --- a/Modules/FindQt4.cmake +++ b/Modules/FindQt4.cmake @@ -1169,10 +1169,22 @@ ELSE( Qt4_FIND_COMPONENTS ) ENDIF( Qt4_FIND_COMPONENTS ) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(Qt4 - REQUIRED_VARS ${_QT4_FOUND_REQUIRED_VARS} - VERSION_VAR QTVERSION - ) +if (QT_VERSION_MAJOR GREATER 4) + SET(VERSION_MSG "Found unsuitable Qt version \"${QTVERSION}\" from ${QT_QMAKE_EXECUTABLE}") + SET(QT4_FOUND FALSE) + IF(Qt4_FIND_REQUIRED) + MESSAGE( FATAL_ERROR "${VERSION_MSG}, this code requires Qt 4.x") + ELSE(Qt4_FIND_REQUIRED) + IF(NOT Qt4_FIND_QUIETLY) + MESSAGE( STATUS "${VERSION_MSG}") + ENDIF(NOT Qt4_FIND_QUIETLY) + ENDIF(Qt4_FIND_REQUIRED) +else() + FIND_PACKAGE_HANDLE_STANDARD_ARGS(Qt4 + REQUIRED_VARS ${_QT4_FOUND_REQUIRED_VARS} + VERSION_VAR QTVERSION + ) +endif() ####################################### # diff --git a/Modules/NSIS.template.in b/Modules/NSIS.template.in index 819cc5c..43f72f6 100644 --- a/Modules/NSIS.template.in +++ b/Modules/NSIS.template.in @@ -637,6 +637,7 @@ Section "-Core installation" ;Use the entire tree produced by the INSTALL target. Keep the ;list of directories here in sync with the RMDir commands below. SetOutPath "$INSTDIR" + @CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS@ @CPACK_NSIS_FULL_INSTALL@ ;Store installation folder @@ -899,6 +900,28 @@ SectionEnd ; "Program Files" for AllUsers, "My Documents" for JustMe... Function .onInit + StrCmp "@CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL@" "ON" 0 inst + + ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\@CPACK_PACKAGE_NAME@" "UninstallString" + StrCmp $0 "" inst + + MessageBox MB_YESNOCANCEL|MB_ICONEXCLAMATION \ + "@CPACK_NSIS_PACKAGE_NAME@ is already installed. $\n$\nDo you want to uninstall the old version before installing the new one?" \ + IDYES uninst IDNO inst + Abort + +;Run the uninstaller +uninst: + ClearErrors + ExecWait '$0 _?=$INSTDIR' ;Do not copy the uninstaller to a temp file + + IfErrors uninst_failed inst +uninst_failed: + MessageBox MB_OK|MB_ICONSTOP "Uninstall failed." + Abort + + +inst: ; Reads components status for registry !insertmacro SectionList "InitSection" diff --git a/Modules/Platform/Darwin-icc.cmake b/Modules/Platform/Darwin-icc.cmake index b62036c..e675c0e 100644 --- a/Modules/Platform/Darwin-icc.cmake +++ b/Modules/Platform/Darwin-icc.cmake @@ -84,11 +84,11 @@ ENDIF(XCODE) SET(CMAKE_MacOSX_Content_COMPILE_OBJECT "\"${CMAKE_COMMAND}\" -E copy_if_different <SOURCE> <OBJECT>") SET(CMAKE_C_CREATE_SHARED_LIBRARY - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_CXX_CREATE_SHARED_LIBRARY - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY - "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake index f9d37c3..a19bfe7 100644 --- a/Modules/Platform/Darwin.cmake +++ b/Modules/Platform/Darwin.cmake @@ -207,11 +207,11 @@ ENDIF() SET(CMAKE_C_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w) SET(CMAKE_CXX_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS -w) SET(CMAKE_C_CREATE_SHARED_LIBRARY - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_CXX_CREATE_SHARED_LIBRARY - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_Fortran_CREATE_SHARED_LIBRARY - "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_CXX_CREATE_SHARED_MODULE "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") @@ -223,9 +223,9 @@ SET(CMAKE_Fortran_CREATE_SHARED_MODULE "<CMAKE_Fortran_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_MODULE_CREATE_Fortran_FLAGS> <LINK_FLAGS> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_C_CREATE_MACOSX_FRAMEWORK - "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_C_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") SET(CMAKE_CXX_CREATE_MACOSX_FRAMEWORK - "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> -install_name <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_CXX_COMPILER> <LANGUAGE_COMPILE_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <LINK_FLAGS> -o <TARGET> <SONAME_FLAG> <TARGET_INSTALLNAME_DIR><TARGET_SONAME> <OBJECTS> <LINK_LIBRARIES>") diff --git a/Modules/Platform/SunOS.cmake b/Modules/Platform/SunOS.cmake index 9f2ee2e..2291c34 100644 --- a/Modules/Platform/SunOS.cmake +++ b/Modules/Platform/SunOS.cmake @@ -8,7 +8,7 @@ ENDIF(CMAKE_SYSTEM MATCHES "SunOS-4.*") IF(CMAKE_COMPILER_IS_GNUCXX) IF(CMAKE_COMPILER_IS_GNUCC) SET(CMAKE_CXX_CREATE_SHARED_LIBRARY - "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <CMAKE_SHARED_LIBRARY_SONAME_CXX_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") + "<CMAKE_C_COMPILER> <CMAKE_SHARED_LIBRARY_CXX_FLAGS> <LINK_FLAGS> <CMAKE_SHARED_LIBRARY_CREATE_CXX_FLAGS> <SONAME_FLAG><TARGET_SONAME> -o <TARGET> <OBJECTS> <LINK_LIBRARIES>") ELSE(CMAKE_COMPILER_IS_GNUCC) # Take default rule from CMakeDefaultMakeRuleVariables.cmake. ENDIF(CMAKE_COMPILER_IS_GNUCC) diff --git a/Modules/Platform/Windows-Intel-CXX.cmake b/Modules/Platform/Windows-Intel-CXX.cmake index 2845b0f..ec5f0ae 100644 --- a/Modules/Platform/Windows-Intel-CXX.cmake +++ b/Modules/Platform/Windows-Intel-CXX.cmake @@ -1,4 +1,4 @@ include(Platform/Windows-Intel) set(_COMPILE_CXX " /TP") -set(_FLAGS_CXX " /GX /GR") +set(_FLAGS_CXX " /EHsc /GR") __windows_compiler_intel(CXX) diff --git a/Modules/Platform/Windows-Intel.cmake b/Modules/Platform/Windows-Intel.cmake index e7462ba..2a54a98 100644 --- a/Modules/Platform/Windows-Intel.cmake +++ b/Modules/Platform/Windows-Intel.cmake @@ -92,7 +92,7 @@ macro(__windows_compiler_intel lang) set(CMAKE_${lang}_LINK_EXECUTABLE "<CMAKE_${lang}_COMPILER> ${CMAKE_CL_NOLOGO} ${CMAKE_START_TEMP_FILE} <FLAGS> <OBJECTS> /Fe<TARGET> -link /implib:<TARGET_IMPLIB> <CMAKE_${lang}_LINK_FLAGS> <LINK_FLAGS> <LINK_LIBRARIES>${CMAKE_END_TEMP_FILE}") set(CMAKE_${lang}_FLAGS_INIT "/DWIN32 /D_WINDOWS /W3 /Zm1000${_FLAGS_${lang}}") - set(CMAKE_${lang}_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Zi /Od /GZ") + set(CMAKE_${lang}_FLAGS_DEBUG_INIT "/D_DEBUG /MDd /Zi /Od /RTC1") set(CMAKE_${lang}_FLAGS_MINSIZEREL_INIT "/DNDEBUG /MD /O1") set(CMAKE_${lang}_FLAGS_RELEASE_INIT "/DNDEBUG /MD /O2") set(CMAKE_${lang}_FLAGS_RELWITHDEBINFO_INIT "/DNDEBUG /MD /Zi /O2") diff --git a/Modules/UseJava.cmake b/Modules/UseJava.cmake index 84d0afd..30cc920 100644 --- a/Modules/UseJava.cmake +++ b/Modules/UseJava.cmake @@ -130,7 +130,7 @@ # Example: # create_javadoc(my_example_doc # PACKAGES com.exmaple.foo com.example.bar -# SOURCEPATH ${CMAKE_CURRENT_SOURCE_PATH} +# SOURCEPATH "${CMAKE_CURRENT_SOURCE_DIR}" # CLASSPATH ${CMAKE_JAVA_INCLUDE_PATH} # WINDOWTITLE "My example" # DOCTITLE "<h1>My example</h1>" diff --git a/Source/CMakeLists.txt b/Source/CMakeLists.txt index f9d1c03..46bdec6 100644 --- a/Source/CMakeLists.txt +++ b/Source/CMakeLists.txt @@ -337,6 +337,8 @@ IF (WIN32) cmGlobalVisualStudio11Generator.cxx cmGlobalVisualStudio11Win64Generator.h cmGlobalVisualStudio11Win64Generator.cxx + cmGlobalVisualStudio11ARMGenerator.h + cmGlobalVisualStudio11ARMGenerator.cxx cmGlobalVisualStudioGenerator.cxx cmGlobalVisualStudioGenerator.h cmGlobalWatcomWMakeGenerator.cxx @@ -355,18 +357,18 @@ IF (WIN32) ENDIF(NOT UNIX) ENDIF (WIN32) -# turn on Ninja by default +# Turn on Ninja by default, but disable it +# on platforms where it does not pass all tests. +# Enforce Ninja support by setting CMAKE_USE_NINJA set(_CMAKE_DEFAULT_NINJA_VALUE TRUE) -# turn it off for platforms where it does not pass all the -# tests if(WIN32 OR APPLE) SET(_CMAKE_DEFAULT_NINJA_VALUE FALSE) endif() SET(CMAKE_ENABLE_NINJA ${_CMAKE_DEFAULT_NINJA_VALUE} CACHE BOOL - "Enable the ninja generator for CMake. currently not fully working for Windows or OSX") + "Enable the ninja generator for CMake. On Windows and OSX broken") MARK_AS_ADVANCED(CMAKE_ENABLE_NINJA) IF(CMAKE_ENABLE_NINJA) - MESSAGE(STATUS "Enable ninja generator.") + MESSAGE(STATUS "Ninja generator enabled.") SET(SRCS ${SRCS} cmGlobalNinjaGenerator.cxx cmGlobalNinjaGenerator.h @@ -382,7 +384,7 @@ IF(CMAKE_ENABLE_NINJA) ) ADD_DEFINITIONS(-DCMAKE_USE_NINJA) ELSE() - MESSAGE(STATUS "Disable ninja generator.") + MESSAGE(STATUS "Ninja generator disabled, enforce with -DCMAKE_ENABLE_NINJA=ON") ENDIF() # create a library used by the command line and the GUI @@ -423,6 +425,9 @@ SET(CTEST_SRCS cmCTest.cxx CTest/cmCTestConfigureHandler.cxx CTest/cmCTestCoverageCommand.cxx CTest/cmCTestCoverageHandler.cxx + CTest/cmParseMumpsCoverage.cxx + CTest/cmParseCacheCoverage.cxx + CTest/cmParseGTMCoverage.cxx CTest/cmParsePHPCoverage.cxx CTest/cmCTestEmptyBinaryDirectoryCommand.cxx CTest/cmCTestGenericHandler.cxx diff --git a/Source/CMakeVersion.bash b/Source/CMakeVersion.bash new file mode 100755 index 0000000..126adba --- /dev/null +++ b/Source/CMakeVersion.bash @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Update the version component if it looks like a date or -f is given. +if test "x$1" = "x-f"; then shift ; n='*' ; else n='\{8\}' ; fi +if test "$#" -gt 0; then echo 1>&2 "usage: CMakeVersion.bash [-f]"; exit 1; fi +sed -i -e ' +s/\(^SET(CMake_VERSION_TWEAK\) [0-9]'"$n"'\(.*\)/\1 '"$(date +%Y%m%d)"'\2/ +' "${BASH_SOURCE%/*}/CMakeVersion.cmake" diff --git a/Source/CMakeVersion.cmake b/Source/CMakeVersion.cmake new file mode 100644 index 0000000..bb1005c --- /dev/null +++ b/Source/CMakeVersion.cmake @@ -0,0 +1,6 @@ +# CMake version number components. +SET(CMake_VERSION_MAJOR 2) +SET(CMake_VERSION_MINOR 8) +SET(CMake_VERSION_PATCH 8) +SET(CMake_VERSION_TWEAK 20120517) +#SET(CMake_VERSION_RC 1) diff --git a/Source/CPack/cmCPackDebGenerator.cxx b/Source/CPack/cmCPackDebGenerator.cxx index 178a18d..fa456de 100644 --- a/Source/CPack/cmCPackDebGenerator.cxx +++ b/Source/CPack/cmCPackDebGenerator.cxx @@ -480,11 +480,16 @@ int cmCPackDebGenerator::createDeb() // Do not end the md5sum file with yet another (invalid) } - cmd = "\""; - cmd += cmakeExecutable; - cmd += "\" -E tar cfz control.tar.gz ./control ./md5sums"; - const char* controlExtra = - this->GetOption("CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA"); + cmd = ""; + if (NULL != this->GetOption("CPACK_DEBIAN_FAKEROOT_EXECUTABLE")) + { + cmd = this->GetOption("CPACK_DEBIAN_FAKEROOT_EXECUTABLE"); + } + cmd += " \""; + cmd += cmakeExecutable; + cmd += "\" -E tar cfz control.tar.gz ./control ./md5sums"; + const char* controlExtra = + this->GetOption("CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA"); if( controlExtra ) { std::vector<std::string> controlExtraList; diff --git a/Source/CPack/cmCPackGenerator.cxx b/Source/CPack/cmCPackGenerator.cxx index 0f832b3..de8f1e0 100644 --- a/Source/CPack/cmCPackGenerator.cxx +++ b/Source/CPack/cmCPackGenerator.cxx @@ -388,8 +388,11 @@ int cmCPackGenerator::InstallProjectViaInstalledDirectories( std::string>(targetFile,inFileRelative)); } /* If it is not a symlink then do a plain copy */ - else if ( !cmSystemTools::CopyFileIfDifferent(inFile.c_str(), - filePath.c_str()) ) + else if (!( + cmSystemTools::CopyFileIfDifferent(inFile.c_str(),filePath.c_str()) + && + cmSystemTools::CopyFileTime(inFile.c_str(),filePath.c_str()) + ) ) { cmCPackLogger(cmCPackLog::LOG_ERROR, "Problem copying file: " << inFile.c_str() << " -> " << filePath.c_str() << std::endl); diff --git a/Source/CTest/cmCTestCoverageHandler.cxx b/Source/CTest/cmCTestCoverageHandler.cxx index 309abb1..81d3669 100644 --- a/Source/CTest/cmCTestCoverageHandler.cxx +++ b/Source/CTest/cmCTestCoverageHandler.cxx @@ -11,6 +11,8 @@ ============================================================================*/ #include "cmCTestCoverageHandler.h" #include "cmParsePHPCoverage.h" +#include "cmParseGTMCoverage.h" +#include "cmParseCacheCoverage.h" #include "cmCTest.h" #include "cmake.h" #include "cmMakefile.h" @@ -373,21 +375,29 @@ int cmCTestCoverageHandler::ProcessHandler() } int file_count = 0; file_count += this->HandleGCovCoverage(&cont); + error = cont.Error; if ( file_count < 0 ) { return error; } file_count += this->HandleTracePyCoverage(&cont); + error = cont.Error; if ( file_count < 0 ) { return error; } file_count += this->HandlePHPCoverage(&cont); + error = cont.Error; if ( file_count < 0 ) { return error; } + file_count += this->HandleMumpsCoverage(&cont); error = cont.Error; + if ( file_count < 0 ) + { + return error; + } std::set<std::string> uncovered = this->FindUncoveredFiles(&cont); @@ -751,6 +761,73 @@ int cmCTestCoverageHandler::HandlePHPCoverage( } return static_cast<int>(cont->TotalCoverage.size()); } +//---------------------------------------------------------------------- +int cmCTestCoverageHandler::HandleMumpsCoverage( + cmCTestCoverageHandlerContainer* cont) +{ + // try gtm coverage + cmParseGTMCoverage cov(*cont, this->CTest); + std::string coverageFile = this->CTest->GetBinaryDir() + + "/gtm_coverage.mcov"; + if(cmSystemTools::FileExists(coverageFile.c_str())) + { + cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + "Parsing Cache Coverage: " << coverageFile + << std::endl); + cov.ReadCoverageFile(coverageFile.c_str()); + return static_cast<int>(cont->TotalCoverage.size()); + } + else + { + cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + " Cannot find foobar GTM coverage file: " << coverageFile + << std::endl); + } + cmParseCacheCoverage ccov(*cont, this->CTest); + coverageFile = this->CTest->GetBinaryDir() + + "/cache_coverage.cmcov"; + if(cmSystemTools::FileExists(coverageFile.c_str())) + { + cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + "Parsing Cache Coverage: " << coverageFile + << std::endl); + ccov.ReadCoverageFile(coverageFile.c_str()); + } + else + { + cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + " Cannot find Cache coverage file: " << coverageFile + << std::endl); + } + return static_cast<int>(cont->TotalCoverage.size()); +} + +struct cmCTestCoverageHandlerLocale +{ + cmCTestCoverageHandlerLocale() + { + if(const char* l = cmSystemTools::GetEnv("LC_ALL")) + { + lc_all = l; + } + if(lc_all != "C") + { + cmSystemTools::PutEnv("LC_ALL=C"); + } + } + ~cmCTestCoverageHandlerLocale() + { + if(!lc_all.empty()) + { + cmSystemTools::PutEnv(("LC_ALL=" + lc_all).c_str()); + } + else + { + cmSystemTools::UnsetEnv("LC_ALL"); + } + } + std::string lc_all; +}; //---------------------------------------------------------------------- int cmCTestCoverageHandler::HandleGCovCoverage( @@ -773,7 +850,7 @@ int cmCTestCoverageHandler::HandleGCovCoverage( std::string st2gcovOutputRex1 = "^File *[`'](.*)'$"; std::string st2gcovOutputRex2 = "Lines executed: *[0-9]+\\.[0-9]+% of [0-9]+$"; - std::string st2gcovOutputRex3 = "^(.*):creating [`'](.*\\.gcov)'"; + std::string st2gcovOutputRex3 = "^(.*)reating [`'](.*\\.gcov)'"; std::string st2gcovOutputRex4 = "^(.*):unexpected EOF *$"; std::string st2gcovOutputRex5 = "^(.*):cannot open source file*$"; std::string st2gcovOutputRex6 @@ -815,7 +892,8 @@ int cmCTestCoverageHandler::HandleGCovCoverage( int file_count = 0; // make sure output from gcov is in English! - cmSystemTools::PutEnv("LC_ALL=POSIX"); + cmCTestCoverageHandlerLocale locale_C; + static_cast<void>(locale_C); // files is a list of *.da and *.gcda files with coverage data in them. // These are binary files that you give as input to gcov so that it will @@ -1778,7 +1856,7 @@ int cmCTestCoverageHandler::HandleBullseyeCoverage( cmCTestCoverageHandlerContainer* cont) { const char* covfile = cmSystemTools::GetEnv("COVFILE"); - if(!covfile) + if(!covfile || strlen(covfile) == 0) { cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, " COVFILE environment variable not found, not running " diff --git a/Source/CTest/cmCTestCoverageHandler.h b/Source/CTest/cmCTestCoverageHandler.h index d3e8503..92b0b22 100644 --- a/Source/CTest/cmCTestCoverageHandler.h +++ b/Source/CTest/cmCTestCoverageHandler.h @@ -70,6 +70,8 @@ private: //! Handle coverage using xdebug php coverage int HandlePHPCoverage(cmCTestCoverageHandlerContainer* cont); + //! Handle coverage for mumps + int HandleMumpsCoverage(cmCTestCoverageHandlerContainer* cont); //! Handle coverage using Bullseye int HandleBullseyeCoverage(cmCTestCoverageHandlerContainer* cont); diff --git a/Source/CTest/cmCTestMemCheckHandler.cxx b/Source/CTest/cmCTestMemCheckHandler.cxx index 035aaa9..3e4ecdd 100644 --- a/Source/CTest/cmCTestMemCheckHandler.cxx +++ b/Source/CTest/cmCTestMemCheckHandler.cxx @@ -358,7 +358,7 @@ void cmCTestMemCheckHandler::GenerateDartOutput(std::ostream& os) os << "\t\t</Results>\n" - << logTag << memcheckstr << std::endl + << logTag << cmXMLSafe(memcheckstr) << std::endl << "\t</Log>\n"; this->WriteTestResultFooter(os, result); if ( current < cc ) diff --git a/Source/CTest/cmCTestRunTest.cxx b/Source/CTest/cmCTestRunTest.cxx index 81f18b0..c3de5dc 100644 --- a/Source/CTest/cmCTestRunTest.cxx +++ b/Source/CTest/cmCTestRunTest.cxx @@ -671,7 +671,7 @@ bool cmCTestRunTest::ForkProcess(double testTimeOut, bool explicitTimeout, if (environment && environment->size()>0) { - cmSystemTools::AppendEnv(environment); + cmSystemTools::AppendEnv(*environment); } return this->TestProcess->StartProcess(); diff --git a/Source/CTest/cmCTestScriptHandler.cxx b/Source/CTest/cmCTestScriptHandler.cxx index 5841b8d..d3ab2ef 100644 --- a/Source/CTest/cmCTestScriptHandler.cxx +++ b/Source/CTest/cmCTestScriptHandler.cxx @@ -643,11 +643,7 @@ int cmCTestScriptHandler::RunCurrentScript() { std::vector<std::string> envArgs; cmSystemTools::ExpandListArgument(this->CTestEnv.c_str(),envArgs); - // for each variable/argument do a putenv - for (unsigned i = 0; i < envArgs.size(); ++i) - { - cmSystemTools::PutEnv(envArgs[i].c_str()); - } + cmSystemTools::AppendEnv(envArgs); } // now that we have done most of the error checking finally run the diff --git a/Source/CTest/cmParseCacheCoverage.cxx b/Source/CTest/cmParseCacheCoverage.cxx new file mode 100644 index 0000000..137f344 --- /dev/null +++ b/Source/CTest/cmParseCacheCoverage.cxx @@ -0,0 +1,220 @@ +#include "cmStandardIncludes.h" +#include <stdio.h> +#include <stdlib.h> +#include "cmSystemTools.h" +#include "cmParseCacheCoverage.h" +#include <cmsys/Directory.hxx> +#include <cmsys/Glob.hxx> + + +cmParseCacheCoverage::cmParseCacheCoverage( + cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest) + :cmParseMumpsCoverage(cont, ctest) +{ +} + + +bool cmParseCacheCoverage::LoadCoverageData(const char* d) +{ + // load all the .mcov files in the specified directory + cmsys::Directory dir; + if(!dir.Load(d)) + { + return false; + } + size_t numf; + unsigned int i; + numf = dir.GetNumberOfFiles(); + for (i = 0; i < numf; i++) + { + std::string file = dir.GetFile(i); + if(file != "." && file != ".." + && !cmSystemTools::FileIsDirectory(file.c_str())) + { + std::string path = d; + path += "/"; + path += file; + if(cmSystemTools::GetFilenameLastExtension(path) == ".cmcov") + { + if(!this->ReadCMCovFile(path.c_str())) + { + return false; + } + } + } + } + return true; +} + +// not currently used, but leave it in case we want it in the future +void cmParseCacheCoverage::RemoveUnCoveredFiles() +{ + // loop over the coverage data computed and remove all files + // that only have -1 or 0 for the lines. + cmCTestCoverageHandlerContainer::TotalCoverageMap::iterator ci = + this->Coverage.TotalCoverage.begin(); + while(ci != this->Coverage.TotalCoverage.end()) + { + cmCTestCoverageHandlerContainer::SingleFileCoverageVector& v = + ci->second; + bool nothing = true; + for(cmCTestCoverageHandlerContainer::SingleFileCoverageVector::iterator i= + v.begin(); i != v.end(); ++i) + { + if(*i > 0) + { + nothing = false; + break; + } + } + if(nothing) + { + cmCTestLog(this->CTest, HANDLER_VERBOSE_OUTPUT, + "No coverage found in: " << ci->first + << std::endl); + this->Coverage.TotalCoverage.erase(ci++); + } + else + { + ++ci; + } + } +} + +bool cmParseCacheCoverage::SplitString(std::vector<std::string>& args, + std::string const& line) +{ + std::string::size_type pos1 = 0; + std::string::size_type pos2 = line.find(',', 0); + if(pos2 == std::string::npos) + { + return false; + } + std::string arg; + while(pos2 != std::string::npos) + { + arg = line.substr(pos1, pos2-pos1); + args.push_back(arg); + pos1 = pos2+1; + pos2 = line.find(',',pos1); + } + arg = line.substr(pos1); + args.push_back(arg); + return true; +} + +bool cmParseCacheCoverage::ReadCMCovFile(const char* file) +{ + std::ifstream in(file); + if(!in) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Can not open : " + << file << "\n"); + return false; + } + std::string line; + std::vector<std::string> separateLine; + if(!cmSystemTools::GetLineFromStream(in, line)) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Empty file : " + << file << " referenced in this line of cmcov data:\n" + "[" << line << "]\n"); + return false; + } + separateLine.clear(); + this->SplitString(separateLine, line); + if(separateLine.size() !=4 || separateLine[0] != "Routine" + || separateLine[1] != "Line" || separateLine[2] != "RtnLine" + || separateLine[3] != "Code") + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Bad first line of cmcov file : " + << file << " line:\n" + "[" << line << "]\n"); + } + std::string routine; + std::string filepath; + while(cmSystemTools::GetLineFromStream(in, line)) + { + // clear out line argument vector + separateLine.clear(); + // parse the comma separated line + this->SplitString(separateLine, line); + // might have more because code could have a quoted , in it + // but we only care about the first 3 args anyway + if(separateLine.size() < 4) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Bad line of cmcov file expected at least 4 found: " + << separateLine.size() << " " + << file << " line:\n" + "[" << line << "]\n"); + for(std::string::size_type i = 0; i < separateLine.size(); ++i) + { + cmCTestLog(this->CTest, ERROR_MESSAGE,"" + << separateLine[1] << " "); + } + cmCTestLog(this->CTest, ERROR_MESSAGE, "\n"); + return false; + } + // if we do not have a routine yet, then it should be + // the first argument in the vector + if(routine.size() == 0) + { + routine = separateLine[0]; + // Find the full path to the file + if(!this->FindMumpsFile(routine, filepath)) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Could not find mumps file for routine: " + << routine << "\n"); + filepath = ""; + continue; // move to next line + } + } + // if we have a routine name, check for end of routine + else + { + // Totals in arg 0 marks the end of a routine + if(separateLine[0].substr(0, 6) == "Totals") + { + routine = ""; // at the end of this routine + filepath = ""; + continue; // move to next line + } + } + // if the file path was not found for the routine + // move to next line. We should have already warned + // after the call to FindMumpsFile that we did not find + // it, so don't report again to cut down on output + if(filepath.size() == 0) + { + continue; + } + // now we are ready to set the coverage from the line of data + cmCTestCoverageHandlerContainer::SingleFileCoverageVector& + coverageVector = this->Coverage.TotalCoverage[filepath]; + std::string::size_type linenumber = atoi(separateLine[1].c_str()) -1; + int count = atoi(separateLine[2].c_str()); + if(linenumber > coverageVector.size()) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Parse error line is greater than number of lines in file: " + << linenumber << " " << filepath << "\n"); + continue; // skip setting count to avoid crash + } + // now add to count for linenumber + // for some reason the cache coverage adds extra lines to the + // end of the file in some cases. Since they do not exist, we will + // mark them as non executable + while(linenumber >= coverageVector.size()) + { + coverageVector.push_back(-1); + } + coverageVector[linenumber] += count; + } + return true; +} diff --git a/Source/CTest/cmParseCacheCoverage.h b/Source/CTest/cmParseCacheCoverage.h new file mode 100644 index 0000000..114eb92 --- /dev/null +++ b/Source/CTest/cmParseCacheCoverage.h @@ -0,0 +1,42 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc. + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmParseCacheCoverage_h +#define cmParseCacheCoverage_h + +#include "cmParseMumpsCoverage.h" + +/** \class cmParseCacheCoverage + * \brief Parse Cache coverage information + * + * This class is used to parse Cache coverage information for + * mumps. + */ +class cmParseCacheCoverage : public cmParseMumpsCoverage +{ +public: + cmParseCacheCoverage(cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest); +protected: + // implement virtual from parent + bool LoadCoverageData(const char* dir); + // remove files with no coverage + void RemoveUnCoveredFiles(); + // Read a single mcov file + bool ReadCMCovFile(const char* f); + // split a string based on , + bool SplitString(std::vector<std::string>& args, + std::string const& line); +}; + + +#endif diff --git a/Source/CTest/cmParseGTMCoverage.cxx b/Source/CTest/cmParseGTMCoverage.cxx new file mode 100644 index 0000000..5dfcfe5 --- /dev/null +++ b/Source/CTest/cmParseGTMCoverage.cxx @@ -0,0 +1,272 @@ +#include "cmStandardIncludes.h" +#include <stdio.h> +#include <stdlib.h> +#include "cmSystemTools.h" +#include "cmParseGTMCoverage.h" +#include <cmsys/Directory.hxx> +#include <cmsys/Glob.hxx> + + +cmParseGTMCoverage::cmParseGTMCoverage(cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest) + :cmParseMumpsCoverage(cont, ctest) +{ +} + + +bool cmParseGTMCoverage::LoadCoverageData(const char* d) +{ + // load all the .mcov files in the specified directory + cmsys::Directory dir; + if(!dir.Load(d)) + { + return false; + } + size_t numf; + unsigned int i; + numf = dir.GetNumberOfFiles(); + for (i = 0; i < numf; i++) + { + std::string file = dir.GetFile(i); + if(file != "." && file != ".." + && !cmSystemTools::FileIsDirectory(file.c_str())) + { + std::string path = d; + path += "/"; + path += file; + if(cmSystemTools::GetFilenameLastExtension(path) == ".mcov") + { + if(!this->ReadMCovFile(path.c_str())) + { + return false; + } + } + } + } + return true; +} + +bool cmParseGTMCoverage::ReadMCovFile(const char* file) +{ + std::ifstream in(file); + if(!in) + { + return false; + } + std::string line; + std::string lastfunction; + std::string lastroutine; + std::string lastpath; + int lastoffset = 0; + while( cmSystemTools::GetLineFromStream(in, line)) + { + // only look at lines that have coverage data + if(line.find("^ZZCOVERAGE") == line.npos) + { + continue; + } + std::string filepath; + std::string function; + std::string routine; + int linenumber = 0; + int count = 0; + this->ParseMCOVLine(line, routine, function, linenumber, count); + // skip this one + if(routine == "RSEL") + { + continue; + } + // no need to search the file if we just did it + if(function == lastfunction && lastroutine == routine) + { + if(lastpath.size()) + { + this->Coverage.TotalCoverage[lastpath][lastoffset + linenumber] + += count; + } + else + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Can not find mumps file : " + << lastroutine << + " referenced in this line of mcov data:\n" + "[" << line << "]\n"); + } + continue; + } + // Find the full path to the file + bool found = this->FindMumpsFile(routine, filepath); + if(found) + { + int lineoffset; + if(this->FindFunctionInMumpsFile(filepath, + function, + lineoffset)) + { + cmCTestCoverageHandlerContainer::SingleFileCoverageVector& + coverageVector = this->Coverage.TotalCoverage[filepath]; + coverageVector[lineoffset + linenumber] += count; + } + lastoffset = lineoffset; + } + else + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Can not find mumps file : " + << routine << " referenced in this line of mcov data:\n" + "[" << line << "]\n"); + } + lastfunction = function; + lastroutine = routine; + lastpath = filepath; + } + return true; +} + +bool cmParseGTMCoverage::FindFunctionInMumpsFile(std::string const& filepath, + std::string const& function, + int& lineoffset) +{ + std::ifstream in(filepath.c_str()); + if(!in) + { + return false; + } + std::string line; + int linenum = 0; + while( cmSystemTools::GetLineFromStream(in, line)) + { + std::string::size_type pos = line.find(function.c_str()); + if(pos == 0) + { + char nextchar = line[function.size()]; + if(nextchar == ' ' || nextchar == '(') + { + lineoffset = linenum; + return true; + } + } + if(pos == 1) + { + char prevchar = line[0]; + char nextchar = line[function.size()+1]; + if(prevchar == '%' && (nextchar == ' ' || nextchar == '(')) + { + lineoffset = linenum; + return true; + } + } + linenum++; // move to next line count + } + lineoffset = 0; + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Could not find entry point : " + << function << " in " << filepath << "\n"); + return false; +} + +bool cmParseGTMCoverage::ParseMCOVLine(std::string const& line, + std::string& routine, + std::string& function, + int& linenumber, + int& count) +{ + // this method parses lines from the .mcov file + // each line has ^COVERAGE(...) in it, and there + // are several varients of coverage lines: + // + // ^COVERAGE("DIC11","PR1",0)="2:0:0:0" + // ( file , entry, line ) = "number_executed:timing_info" + // ^COVERAGE("%RSEL","SRC")="1:0:0:0" + // ( file , entry ) = "number_executed:timing_info" + // ^COVERAGE("%RSEL","init",8,"FOR_LOOP",1)=1 + // ( file , entry, line, IGNORE ) =number_executed + std::vector<cmStdString> args; + std::string::size_type pos = line.find('(', 0); + // if no ( is found, then return line has no coverage + if(pos == std::string::npos) + { + return false; + } + std::string arg; + bool done = false; + // separate out all of the comma separated arguments found + // in the COVERAGE(...) line + while(line[pos] && !done) + { + // save the char we are looking at + char cur = line[pos]; + // , or ) means end of argument + if(cur == ',' || cur == ')') + { + // save the argument into the argument vector + args.push_back(arg); + // start on a new argument + arg = ""; + // if we are at the end of the ), then finish while loop + if(cur == ')') + { + done = true; + } + } + else + { + // all chars except ", (, and % get stored in the arg string + if(cur != '\"' && cur != '(' && cur != '%') + { + arg.append(1, line[pos]); + } + } + // move to next char + pos++; + } + // now parse the right hand side of the = + pos = line.find('='); + // no = found, this is an error + if(pos == line.npos) + { + return false; + } + pos++; // move past = + + // if the next positing is not a ", then this is a + // COVERAGE(..)=count line and turn the rest of the string + // past the = into an integer and set it to count + if(line[pos] != '\"') + { + count = atoi(line.substr(pos).c_str()); + } + else + { + // this means line[pos] is a ", and we have a + // COVERAGE(...)="1:0:0:0" type of line + pos++; // move past " + // find the first : past the " + std::string::size_type pos2 = line.find(':', pos); + // turn the string between the " and the first : into an integer + // and set it to count + count = atoi(line.substr(pos, pos2-pos).c_str()); + } + // less then two arguments is an error + if(args.size() < 2) + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Error parsing mcov line: [" << line << "]\n"); + return false; + } + routine = args[0]; // the routine is the first argument + function = args[1]; // the function in the routine is the second + // in the two argument only format + // ^COVERAGE("%RSEL","SRC"), the line offset is 0 + if(args.size() == 2) + { + linenumber = 0; + } + else + { + // this is the format for this line + // ^COVERAGE("%RSEL","SRC",count) + linenumber = atoi(args[2].c_str()); + } + return true; +} diff --git a/Source/CTest/cmParseGTMCoverage.h b/Source/CTest/cmParseGTMCoverage.h new file mode 100644 index 0000000..c6d7ef9 --- /dev/null +++ b/Source/CTest/cmParseGTMCoverage.h @@ -0,0 +1,49 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc. + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmParseGTMCoverage_h +#define cmParseGTMCoverage_h + +#include "cmParseMumpsCoverage.h" + +/** \class cmParseGTMCoverage + * \brief Parse GTM coverage information + * + * This class is used to parse GTM coverage information for + * mumps. + */ +class cmParseGTMCoverage : public cmParseMumpsCoverage +{ +public: + cmParseGTMCoverage(cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest); +protected: + // implement virtual from parent + bool LoadCoverageData(const char* dir); + // Read a single mcov file + bool ReadMCovFile(const char* f); + // find out what line in a mumps file (filepath) the given entry point + // or function is. lineoffset is set by this method. + bool FindFunctionInMumpsFile(std::string const& filepath, + std::string const& function, + int& lineoffset); + // parse a line from a .mcov file, and fill in the + // routine, function, linenumber and coverage count + bool ParseMCOVLine(std::string const& line, + std::string& routine, + std::string& function, + int& linenumber, + int& count); +}; + + +#endif diff --git a/Source/CTest/cmParseMumpsCoverage.cxx b/Source/CTest/cmParseMumpsCoverage.cxx new file mode 100644 index 0000000..37e8bd0 --- /dev/null +++ b/Source/CTest/cmParseMumpsCoverage.cxx @@ -0,0 +1,165 @@ +#include "cmStandardIncludes.h" +#include <stdio.h> +#include <stdlib.h> +#include "cmSystemTools.h" +#include "cmParseGTMCoverage.h" +#include <cmsys/Directory.hxx> +#include <cmsys/Glob.hxx> + + +cmParseMumpsCoverage::cmParseMumpsCoverage( + cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest) + :Coverage(cont), CTest(ctest) +{ +} + +cmParseMumpsCoverage::~cmParseMumpsCoverage() +{ +} + +bool cmParseMumpsCoverage::ReadCoverageFile(const char* file) +{ + // Read the gtm_coverage.mcov file, that has two lines of data: + // packages:/full/path/to/Vista/Packages + // coverage_dir:/full/path/to/dir/with/*.mcov + std::ifstream in(file); + if(!in) + { + return false; + } + std::string line; + while(cmSystemTools::GetLineFromStream(in, line)) + { + std::string::size_type pos = line.find(':', 0); + std::string packages; + if(pos != std::string::npos) + { + std::string type = line.substr(0, pos); + std::string path = line.substr(pos+1); + if(type == "packages") + { + this->LoadPackages(path.c_str()); + } + else if(type == "coverage_dir") + { + this->LoadCoverageData(path.c_str()); + } + else + { + cmCTestLog(this->CTest, ERROR_MESSAGE, + "Parse Error in Mumps coverage file :\n" + << file << + "\ntype: [" << type << "]\npath:[" << path << "]\n" + "input line: [" << line << "]\n"); + } + } + } + return true; +} + +void cmParseMumpsCoverage::InitializeMumpsFile(std::string& file) +{ + // initialize the coverage information for a given mumps file + std::ifstream in(file.c_str()); + if(!in) + { + return; + } + std::string line; + cmCTestCoverageHandlerContainer::SingleFileCoverageVector& + coverageVector = this->Coverage.TotalCoverage[file]; + if(!cmSystemTools::GetLineFromStream(in, line)) + { + return; + } + // first line of a .m file can never be run + coverageVector.push_back(-1); + while( cmSystemTools::GetLineFromStream(in, line) ) + { + // putting in a 0 for a line means it is executable code + // putting in a -1 for a line means it is not executable code + int val = -1; // assume line is not executable + bool found = false; + std::string::size_type i = 0; + // (1) Search for the first whitespace or semicolon character on a line. + //This will skip over labels if the line starts with one, or will simply + //be the first character on the line for non-label lines. + for(; i < line.size(); ++i) + { + if(line[i] == ' ' || line[i] == '\t' || line[i] == ';') + { + found = true; + break; + } + } + if(found) + { + // (2) If the first character found above is whitespace then continue the + // search for the first following non-whitespace character. + if(line[i] == ' ' || line[i] == '\t') + { + while(i < line.size() && (line[i] == ' ' || line[i] == '\t')) + { + i++; + } + } + // (3) If the character found is not a semicolon then the line counts for + // coverage. + if(i < line.size() && line[i] != ';') + { + val = 0; + } + } + coverageVector.push_back(val); + } +} + +bool cmParseMumpsCoverage::LoadPackages(const char* d) +{ + cmsys::Glob glob; + glob.RecurseOn(); + std::string pat = d; + pat += "/*.m"; + glob.FindFiles(pat.c_str()); + std::vector<std::string>& files = glob.GetFiles(); + std::vector<std::string>::iterator fileIt; + for ( fileIt = files.begin(); fileIt != files.end(); + ++ fileIt ) + { + std::string name = cmSystemTools::GetFilenameName(*fileIt); + this->RoutineToDirectory[name.substr(0, name.size()-2)] = *fileIt; + // initialze each file, this is left out until CDash is fixed + // to handle large numbers of files + this->InitializeMumpsFile(*fileIt); + } + return true; +} + +bool cmParseMumpsCoverage::FindMumpsFile(std::string const& routine, + std::string& filepath) +{ + std::map<cmStdString, cmStdString>::iterator i = + this->RoutineToDirectory.find(routine); + if(i != this->RoutineToDirectory.end()) + { + filepath = i->second; + return true; + } + else + { + // try some alternate names + const char* tryname[] = {"GUX", "GTM", "ONT", 0}; + for(int k=0; tryname[k] != 0; k++) + { + std::string routine2 = routine + tryname[k]; + i = this->RoutineToDirectory.find(routine2); + if(i != this->RoutineToDirectory.end()) + { + filepath = i->second; + return true; + } + } + } + return false; +} diff --git a/Source/CTest/cmParseMumpsCoverage.h b/Source/CTest/cmParseMumpsCoverage.h new file mode 100644 index 0000000..c1effa7 --- /dev/null +++ b/Source/CTest/cmParseMumpsCoverage.h @@ -0,0 +1,52 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2009 Kitware, Inc. + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ + +#ifndef cmParseMumpsCoverage_h +#define cmParseMumpsCoverage_h + +#include "cmStandardIncludes.h" +#include "cmCTestCoverageHandler.h" + +/** \class cmParseMumpsCoverage + * \brief Parse Mumps coverage information + * + * This class is used as the base class for Mumps coverage + * parsing. + */ +class cmParseMumpsCoverage +{ +public: + cmParseMumpsCoverage(cmCTestCoverageHandlerContainer& cont, + cmCTest* ctest); + virtual ~cmParseMumpsCoverage(); + // This is the toplevel coverage file locating the coverage files + // and the mumps source code package tree. + bool ReadCoverageFile(const char* file); +protected: + // sub classes will use this to + // load all coverage files found in the given directory + virtual bool LoadCoverageData(const char* d) = 0; + // search the package directory for mumps files and fill + // in the RoutineToDirectory map + bool LoadPackages(const char* dir); + // initialize the coverage information for a single mumps file + void InitializeMumpsFile(std::string& file); + // Find mumps file for routine + bool FindMumpsFile(std::string const& routine, + std::string& filepath); +protected: + std::map<cmStdString, cmStdString> RoutineToDirectory; + cmCTestCoverageHandlerContainer& Coverage; + cmCTest* CTest; +}; + +#endif diff --git a/Source/CTest/cmParsePHPCoverage.h b/Source/CTest/cmParsePHPCoverage.h index ce5741d..d50a83c 100644 --- a/Source/CTest/cmParsePHPCoverage.h +++ b/Source/CTest/cmParsePHPCoverage.h @@ -37,9 +37,6 @@ private: bool ReadInt(std::ifstream& in, int& v); bool ReadCoverageArray(std::ifstream& in, cmStdString const&); bool ReadUntil(std::ifstream& in, char until); - typedef std::map<int, int> FileLineCoverage; - std::map<cmStdString, FileLineCoverage> FileToCoverage; - std::map<int, int> FileCoverage; cmCTestCoverageHandlerContainer& Coverage; cmCTest* CTest; }; diff --git a/Source/QtDialog/CMakeSetupDialog.cxx b/Source/QtDialog/CMakeSetupDialog.cxx index 45b4cd3..5cd4f29 100644 --- a/Source/QtDialog/CMakeSetupDialog.cxx +++ b/Source/QtDialog/CMakeSetupDialog.cxx @@ -288,7 +288,7 @@ CMakeSetupDialog::~CMakeSetupDialog() // wait for thread to stop this->CMakeThread->quit(); - this->CMakeThread->wait(2000); + this->CMakeThread->wait(); } bool CMakeSetupDialog::prepareConfigure() diff --git a/Source/cmCTest.cxx b/Source/cmCTest.cxx index 3f7fdc7..4aff64b 100644 --- a/Source/cmCTest.cxx +++ b/Source/cmCTest.cxx @@ -48,7 +48,7 @@ #include <float.h> #include <ctype.h> -#include <memory> // auto_ptr +#include <cmsys/auto_ptr.hxx> #include <cm_zlib.h> #include <cmsys/Base64.h> @@ -509,7 +509,7 @@ int cmCTest::Initialize(const char* binary_dir, cmCTestStartCommand* command) cmake cm; cmGlobalGenerator gg; gg.SetCMakeInstance(&cm); - std::auto_ptr<cmLocalGenerator> lg(gg.CreateLocalGenerator()); + cmsys::auto_ptr<cmLocalGenerator> lg(gg.CreateLocalGenerator()); cmMakefile *mf = lg->GetMakefile(); if ( !this->ReadCustomConfigurationFileTree(this->BinaryDir.c_str(), mf) ) { @@ -1277,7 +1277,6 @@ int cmCTest::RunTest(std::vector<const char*> argv, std::ostream* log, double testTimeOut, std::vector<std::string>* environment) { - std::vector<std::string> origEnv; bool modifyEnv = (environment && environment->size()>0); // determine how much time we have @@ -1334,9 +1333,11 @@ int cmCTest::RunTest(std::vector<const char*> argv, } std::string oldpath = cmSystemTools::GetCurrentWorkingDirectory(); + cmsys::auto_ptr<cmSystemTools::SaveRestoreEnvironment> saveEnv; if (modifyEnv) { - origEnv = cmSystemTools::AppendEnv(environment); + saveEnv.reset(new cmSystemTools::SaveRestoreEnvironment); + cmSystemTools::AppendEnv(*environment); } *retVal = inst.Run(args, output); @@ -1351,11 +1352,6 @@ int cmCTest::RunTest(std::vector<const char*> argv, "Internal cmCTest object used to run test." << std::endl << *output << std::endl); - if (modifyEnv) - { - cmSystemTools::RestoreEnv(origEnv); - } - return cmsysProcess_State_Exited; } std::vector<char> tempOutput; @@ -1364,9 +1360,11 @@ int cmCTest::RunTest(std::vector<const char*> argv, *output = ""; } + cmsys::auto_ptr<cmSystemTools::SaveRestoreEnvironment> saveEnv; if (modifyEnv) { - origEnv = cmSystemTools::AppendEnv(environment); + saveEnv.reset(new cmSystemTools::SaveRestoreEnvironment); + cmSystemTools::AppendEnv(*environment); } cmsysProcess* cp = cmsysProcess_New(); @@ -1436,11 +1434,6 @@ int cmCTest::RunTest(std::vector<const char*> argv, } cmsysProcess_Delete(cp); - if (modifyEnv) - { - cmSystemTools::RestoreEnv(origEnv); - } - return result; } diff --git a/Source/cmCoreTryCompile.cxx b/Source/cmCoreTryCompile.cxx index 48f644b..ed485e3 100644 --- a/Source/cmCoreTryCompile.cxx +++ b/Source/cmCoreTryCompile.cxx @@ -404,6 +404,7 @@ void cmCoreTryCompile::CleanupFiles(const char* binDir) if(cmSystemTools::FileIsDirectory(fullPath.c_str())) { this->CleanupFiles(fullPath.c_str()); + cmSystemTools::RemoveADirectory(fullPath.c_str()); } else { diff --git a/Source/cmDocumentationFormatterHTML.cxx b/Source/cmDocumentationFormatterHTML.cxx index 6ced1e4..cd0077e 100644 --- a/Source/cmDocumentationFormatterHTML.cxx +++ b/Source/cmDocumentationFormatterHTML.cxx @@ -127,7 +127,7 @@ void cmDocumentationFormatterHTML { os << "<h2><a name=\"section_"; cmDocumentationPrintHTMLId(os, name); - os << "\"/>" << name << "</h2>\n"; + os << "\"></a>" << name << "</h2>\n"; } // Is a list needed? @@ -145,7 +145,7 @@ void cmDocumentationFormatterHTML cmDocumentationPrintHTMLId(os, op->Name.c_str()); os << "\"><b><code>"; this->PrintHTMLEscapes(os, op->Name.c_str()); - os << "</code></b></a></li>"; + os << "</code></b></a></li>\n"; } } os << "</ul>\n" ; @@ -167,9 +167,9 @@ void cmDocumentationFormatterHTML { os << " <a name=\"" << prefix << ":"; cmDocumentationPrintHTMLId(os, op->Name.c_str()); - os << "\"><b><code>"; + os << "\"></a><b><code>"; this->PrintHTMLEscapes(os, op->Name.c_str()); - os << "</code></b></a>: "; + os << "</code></b>: "; } this->PrintHTMLEscapes(os, op->Brief.c_str()); if(op->Full.size()) @@ -269,9 +269,9 @@ void cmDocumentationFormatterHTML return; } - os << "<h2><a name=\"section_Index\">Master Index " + os << "<h2><a name=\"section_Index\"></a>Master Index " << "CMake " << cmVersion::GetCMakeVersion() - << "</a></h2>\n"; + << "</h2>\n"; if (!sections.empty()) { diff --git a/Source/cmExportFileGenerator.cxx b/Source/cmExportFileGenerator.cxx index c4f5dfb..eb19df5e 100644 --- a/Source/cmExportFileGenerator.cxx +++ b/Source/cmExportFileGenerator.cxx @@ -137,10 +137,20 @@ cmExportFileGenerator (mf->IsOn("WIN32") || mf->IsOn("CYGWIN") || mf->IsOn("MINGW")); if(!dll_platform) { - std::string soname = target->GetSOName(config); - std::string prop = "IMPORTED_SONAME"; + std::string prop; + std::string value; + if(target->HasSOName(config)) + { + prop = "IMPORTED_SONAME"; + value = target->GetSOName(config); + } + else + { + prop = "IMPORTED_NO_SONAME"; + value = "TRUE"; + } prop += suffix; - properties[prop] = soname; + properties[prop] = value; } } diff --git a/Source/cmExtraCodeBlocksGenerator.cxx b/Source/cmExtraCodeBlocksGenerator.cxx index ccb17f0..5df8627 100644 --- a/Source/cmExtraCodeBlocksGenerator.cxx +++ b/Source/cmExtraCodeBlocksGenerator.cxx @@ -60,6 +60,9 @@ cmExtraCodeBlocksGenerator::cmExtraCodeBlocksGenerator() // disable until somebody actually tests it: // this->SupportedGlobalGenerators.push_back("MSYS Makefiles"); #endif +#ifdef CMAKE_USE_NINJA + this->SupportedGlobalGenerators.push_back("Ninja"); +#endif this->SupportedGlobalGenerators.push_back("Unix Makefiles"); } @@ -383,6 +386,7 @@ void cmExtraCodeBlocksGenerator case cmTarget::STATIC_LIBRARY: case cmTarget::SHARED_LIBRARY: case cmTarget::MODULE_LIBRARY: + case cmTarget::OBJECT_LIBRARY: { this->AppendTarget(fout, ti->first.c_str(), &ti->second, make.c_str(), makefile, compiler.c_str()); @@ -420,6 +424,7 @@ void cmExtraCodeBlocksGenerator case cmTarget::STATIC_LIBRARY: case cmTarget::SHARED_LIBRARY: case cmTarget::MODULE_LIBRARY: + case cmTarget::OBJECT_LIBRARY: case cmTarget::UTILITY: // can have sources since 2.6.3 { const std::vector<cmSourceFile*>&sources=ti->second.GetSourceFiles(); @@ -532,6 +537,31 @@ void cmExtraCodeBlocksGenerator } +// Write a dummy file for OBJECT libraries, so C::B can reference some file +std::string cmExtraCodeBlocksGenerator::CreateDummyTargetFile( + cmMakefile* mf, cmTarget* target) const +{ + // this file doesn't seem to be used by C::B in custom makefile mode, + // but we generate a unique file for each OBJECT library so in case + // C::B uses it in some way, the targets don't interfere with each other. + std::string filename = mf->GetCurrentOutputDirectory(); + filename += "/"; + filename += mf->GetLocalGenerator()->GetTargetDirectory(*target); + filename += "/"; + filename += target->GetName(); + filename += ".objlib"; + cmGeneratedFileStream fout(filename.c_str()); + if(fout) + { + fout << "# This is a dummy file for the OBJECT library " + << target->GetName() + << " for the CMake CodeBlocks project generator.\n" + << "# Don't edit, this file will be overwritten.\n"; + } + return filename; +} + + // Generate the xml code for one target. void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout, const char* targetName, @@ -570,7 +600,18 @@ void cmExtraCodeBlocksGenerator::AppendTarget(cmGeneratedFileStream& fout, } const char* buildType = makefile->GetDefinition("CMAKE_BUILD_TYPE"); - fout<<" <Option output=\"" << target->GetLocation(buildType) + std::string location; + if ( target->GetType()==cmTarget::OBJECT_LIBRARY) + { + location = this->CreateDummyTargetFile(const_cast<cmMakefile*>(makefile), + target); + } + else + { + location = target->GetLocation(buildType); + } + + fout<<" <Option output=\"" << location << "\" prefix_auto=\"0\" extension_auto=\"0\" />\n" " <Option working_dir=\"" << workingDir << "\" />\n" " <Option object_output=\"./\" />\n" @@ -728,7 +769,8 @@ int cmExtraCodeBlocksGenerator::GetCBTargetType(cmTarget* target) return 1; } } - else if ( target->GetType()==cmTarget::STATIC_LIBRARY) + else if (( target->GetType()==cmTarget::STATIC_LIBRARY) + || (target->GetType()==cmTarget::OBJECT_LIBRARY)) { return 2; } diff --git a/Source/cmExtraCodeBlocksGenerator.h b/Source/cmExtraCodeBlocksGenerator.h index 57751fc..e0a64ca 100644 --- a/Source/cmExtraCodeBlocksGenerator.h +++ b/Source/cmExtraCodeBlocksGenerator.h @@ -44,6 +44,8 @@ private: void CreateNewProjectFile(const std::vector<cmLocalGenerator*>& lgs, const std::string& filename); + std::string CreateDummyTargetFile(cmMakefile* mf, cmTarget* target) const; + std::string GetCBCompilerId(const cmMakefile* mf); int GetCBTargetType(cmTarget* target); std::string BuildMakeCommand(const std::string& make, const char* makefile, diff --git a/Source/cmFileCommand.cxx b/Source/cmFileCommand.cxx index 3f14fa1..d69431e 100644 --- a/Source/cmFileCommand.cxx +++ b/Source/cmFileCommand.cxx @@ -300,7 +300,7 @@ bool cmFileCommand::HandleReadCommand(std::vector<std::string> const& args) offset = atoi(offsetArg.GetCString()); } - file.seekg(offset); + file.seekg(offset, std::ios::beg); // explicit ios::beg for IBM VisualAge 6 std::string output; diff --git a/Source/cmFindPackageCommand.cxx b/Source/cmFindPackageCommand.cxx index ef16ce8..be47f95 100644 --- a/Source/cmFindPackageCommand.cxx +++ b/Source/cmFindPackageCommand.cxx @@ -89,7 +89,7 @@ void cmFindPackageCommand::GenerateDocumentation() "FIND_XXX", "find_package"); this->CommandDocumentation = " find_package(<package> [version] [EXACT] [QUIET] [MODULE]\n" - " [[REQUIRED|COMPONENTS] [components...]]\n" + " [REQUIRED] [[COMPONENTS] [components...]]\n" " [OPTIONAL_COMPONENTS components...]\n" " [NO_POLICY_SCOPE])\n" "Finds and loads settings from an external project. " @@ -102,7 +102,7 @@ void cmFindPackageCommand::GenerateDocumentation() "package cannot be found." "\n" "A package-specific list of required components may be listed after the " - "COMPONENTS option or directly after the REQUIRED option. " + "COMPONENTS option (or after the REQUIRED option if present). " "Additional optional components may be listed after OPTIONAL_COMPONENTS. " "Available components and their influence on whether a package is " "considered to be found are defined by the target package." @@ -136,7 +136,7 @@ void cmFindPackageCommand::GenerateDocumentation() "proceeds to Config mode.\n" "The complete Config mode command signature is:\n" " find_package(<package> [version] [EXACT] [QUIET]\n" - " [[REQUIRED|COMPONENTS] [components...]]\n" + " [REQUIRED] [[COMPONENTS] [components...]]\n" " [CONFIG|NO_MODULE]\n" " [NO_POLICY_SCOPE]\n" " [NAMES name1 [name2 ...]]\n" @@ -353,6 +353,29 @@ void cmFindPackageCommand::GenerateDocumentation() "variable CMAKE_DISABLE_FIND_PACKAGE_<package> to TRUE. See the " "documentation for the CMAKE_DISABLE_FIND_PACKAGE_<package> variable for " "more information.\n" + "When loading a find module or package configuration file find_package " + "defines variables to provide information about the call arguments " + "(and restores their original state before returning):\n" + " <package>_FIND_REQUIRED = true if REQUIRED option was given\n" + " <package>_FIND_QUIETLY = true if QUIET option was given\n" + " <package>_FIND_VERSION = full requested version string\n" + " <package>_FIND_VERSION_MAJOR = major version if requested, else 0\n" + " <package>_FIND_VERSION_MINOR = minor version if requested, else 0\n" + " <package>_FIND_VERSION_PATCH = patch version if requested, else 0\n" + " <package>_FIND_VERSION_TWEAK = tweak version if requested, else 0\n" + " <package>_FIND_VERSION_COUNT = number of version components, 0 to 4\n" + " <package>_FIND_VERSION_EXACT = true if EXACT option was given\n" + " <package>_FIND_COMPONENTS = list of requested components\n" + " <package>_FIND_REQUIRED_<c> = true if component <c> is required\n" + " false if component <c> is optional\n" + "In Module mode the loaded find module is responsible to honor the " + "request detailed by these variables; see the find module for details. " + "In Config mode find_package handles REQUIRED, QUIET, and version " + "options automatically but leaves it to the package configuration file " + "to handle components in a way that makes sense for the package. " + "The package configuration file may set <package>_FOUND to false " + "to tell find_package that component requirements are not satisfied." + "\n" "See the cmake_policy() command documentation for discussion of the " "NO_POLICY_SCOPE option." ; @@ -1345,41 +1368,73 @@ bool cmFindPackageCommand::ReadListFile(const char* f, PolicyScopeRule psr) } //---------------------------------------------------------------------------- -void cmFindPackageCommand::AppendToProperty(const char* propertyName) +void cmFindPackageCommand::AppendToFoundProperty(bool found) { - std::string propertyValue; - const char *prop = - this->Makefile->GetCMakeInstance()->GetProperty(propertyName); - if (prop && *prop) + std::vector<std::string> foundContents; + const char *foundProp = + this->Makefile->GetCMakeInstance()->GetProperty("PACKAGES_FOUND"); + if (foundProp && *foundProp) { - propertyValue = prop; - - std::vector<std::string> contents; - cmSystemTools::ExpandListArgument(propertyValue, contents, false); + std::string tmp = foundProp; - bool alreadyInserted = false; - for(std::vector<std::string>::const_iterator it = contents.begin(); - it != contents.end(); ++ it ) + cmSystemTools::ExpandListArgument(tmp, foundContents, false); + std::vector<std::string>::iterator nameIt = std::find( + foundContents.begin(), foundContents.end(), this->Name); + if(nameIt != foundContents.end()) { - if (*it == this->Name) - { - alreadyInserted = true; - break; - } + foundContents.erase(nameIt); } - if (!alreadyInserted) + } + + std::vector<std::string> notFoundContents; + const char *notFoundProp = + this->Makefile->GetCMakeInstance()->GetProperty("PACKAGES_NOT_FOUND"); + if (notFoundProp && *notFoundProp) + { + std::string tmp = notFoundProp; + + cmSystemTools::ExpandListArgument(tmp, notFoundContents, false); + std::vector<std::string>::iterator nameIt = std::find( + notFoundContents.begin(), notFoundContents.end(), this->Name); + if(nameIt != notFoundContents.end()) { - propertyValue += ";"; - propertyValue += this->Name; + notFoundContents.erase(nameIt); } } + + if(found) + { + foundContents.push_back(this->Name); + } else { - propertyValue = this->Name; + notFoundContents.push_back(this->Name); } - this->Makefile->GetCMakeInstance()->SetProperty(propertyName, - propertyValue.c_str()); - } + + + std::string tmp; + const char* sep =""; + for(size_t i=0; i<foundContents.size(); i++) + { + tmp += sep; + tmp += foundContents[i]; + sep = ";"; + } + + this->Makefile->GetCMakeInstance()->SetProperty("PACKAGES_FOUND", + tmp.c_str()); + + tmp = ""; + sep = ""; + for(size_t i=0; i<notFoundContents.size(); i++) + { + tmp += sep; + tmp += notFoundContents[i]; + sep = ";"; + } + this->Makefile->GetCMakeInstance()->SetProperty("PACKAGES_NOT_FOUND", + tmp.c_str()); +} //---------------------------------------------------------------------------- void cmFindPackageCommand::AppendSuccessInformation() @@ -1390,14 +1445,10 @@ void cmFindPackageCommand::AppendSuccessInformation() const char* upperResult = this->Makefile->GetDefinition(upperFound.c_str()); const char* result = this->Makefile->GetDefinition(found.c_str()); - if ((cmSystemTools::IsOn(result)) || (cmSystemTools::IsOn(upperResult))) - { - this->AppendToProperty("PACKAGES_FOUND"); - } - else - { - this->AppendToProperty("PACKAGES_NOT_FOUND"); - } + bool packageFound = ((cmSystemTools::IsOn(result)) + || (cmSystemTools::IsOn(upperResult))); + + this->AppendToFoundProperty(packageFound); // Record whether the find was quiet or not, so this can be used // e.g. in FeatureSummary.cmake diff --git a/Source/cmFindPackageCommand.h b/Source/cmFindPackageCommand.h index edb70a6..c380122 100644 --- a/Source/cmFindPackageCommand.h +++ b/Source/cmFindPackageCommand.h @@ -69,7 +69,7 @@ protected: virtual void GenerateDocumentation(); private: void AppendSuccessInformation(); - void AppendToProperty(const char* propertyName); + void AppendToFoundProperty(bool found); void SetModuleVariables(const std::string& components); bool FindModule(bool& found); void AddFindDefinition(const char* var, const char* val); diff --git a/Source/cmGeneratorTarget.cxx b/Source/cmGeneratorTarget.cxx index 42dd428..6e2e23d 100644 --- a/Source/cmGeneratorTarget.cxx +++ b/Source/cmGeneratorTarget.cxx @@ -39,17 +39,10 @@ void cmGeneratorTarget::ClassifySources() { cmSourceFile* sf = *si; std::string ext = cmSystemTools::LowerCase(sf->GetExtension()); - cmTarget::SourceFileFlags tsFlags = - this->Target->GetTargetSourceFileFlags(sf); if(sf->GetCustomCommand()) { this->CustomCommands.push_back(sf); } - else if(tsFlags.Type != cmTarget::SourceFileTypeNormal) - { - this->OSXContent.push_back(sf); - if(isObjLib) { badObjLib.push_back(sf); } - } else if(sf->GetPropertyAsBool("HEADER_FILE_ONLY")) { this->HeaderSources.push_back(sf); diff --git a/Source/cmGeneratorTarget.h b/Source/cmGeneratorTarget.h index 3e50656..5c7578d 100644 --- a/Source/cmGeneratorTarget.h +++ b/Source/cmGeneratorTarget.h @@ -37,7 +37,6 @@ public: std::vector<cmSourceFile*> HeaderSources; std::vector<cmSourceFile*> ObjectSources; std::vector<cmSourceFile*> ExternalObjects; - std::vector<cmSourceFile*> OSXContent; std::vector<cmSourceFile*> IDLSources; std::string ModuleDefinitionFile; diff --git a/Source/cmGlobalGenerator.cxx b/Source/cmGlobalGenerator.cxx index 545f9e8..b06cdb4 100644 --- a/Source/cmGlobalGenerator.cxx +++ b/Source/cmGlobalGenerator.cxx @@ -2092,6 +2092,21 @@ cmTarget cmGlobalGenerator::CreateGlobalTarget( } //---------------------------------------------------------------------------- +std::string +cmGlobalGenerator::GenerateRuleFile(std::string const& output) const +{ + std::string ruleFile = output; + ruleFile += ".rule"; + const char* dir = this->GetCMakeCFGIntDir(); + if(dir && dir[0] == '$') + { + cmSystemTools::ReplaceString(ruleFile, dir, + cmake::GetCMakeFilesDirectory()); + } + return ruleFile; +} + +//---------------------------------------------------------------------------- void cmGlobalGenerator::AppendDirectoryForConfig(const char*, const char*, const char*, std::string&) { diff --git a/Source/cmGlobalGenerator.h b/Source/cmGlobalGenerator.h index 80b948b..5254b89 100644 --- a/Source/cmGlobalGenerator.h +++ b/Source/cmGlobalGenerator.h @@ -277,6 +277,9 @@ public: i.e. "Can I build Debug and Release in the same tree?" */ virtual bool IsMultiConfig() { return false; } + /** Generate an <output>.rule file path for a given command output. */ + virtual std::string GenerateRuleFile(std::string const& output) const; + protected: typedef std::vector<cmLocalGenerator*> GeneratorVector; // for a project collect all its targets by following depend diff --git a/Source/cmGlobalNinjaGenerator.cxx b/Source/cmGlobalNinjaGenerator.cxx index 9cbd502..67f809a 100644 --- a/Source/cmGlobalNinjaGenerator.cxx +++ b/Source/cmGlobalNinjaGenerator.cxx @@ -754,6 +754,8 @@ void cmGlobalNinjaGenerator::WriteBuiltinTargets(std::ostream& os) this->WriteTargetAll(os); this->WriteTargetRebuildManifest(os); + this->WriteTargetClean(os); + this->WriteTargetHelp(os); } void cmGlobalNinjaGenerator::WriteTargetAll(std::ostream& os) @@ -820,3 +822,43 @@ void cmGlobalNinjaGenerator::WriteTargetRebuildManifest(std::ostream& os) implicitDeps, cmNinjaDeps()); } + +void cmGlobalNinjaGenerator::WriteTargetClean(std::ostream& os) +{ + WriteRule(*this->RulesFileStream, + "CLEAN", + "ninja -t clean", + "Cleaning all built files...", + "Rule for cleaning all built files.", + /*depfile=*/ "", + /*restat=*/ false, + /*generator=*/ false); + WriteBuild(os, + "Clean all the built files.", + "CLEAN", + /*outputs=*/ cmNinjaDeps(1, "clean"), + /*explicitDeps=*/ cmNinjaDeps(), + /*implicitDeps=*/ cmNinjaDeps(), + /*orderOnlyDeps=*/ cmNinjaDeps(), + /*variables=*/ cmNinjaVars()); +} + +void cmGlobalNinjaGenerator::WriteTargetHelp(std::ostream& os) +{ + WriteRule(*this->RulesFileStream, + "HELP", + "ninja -t targets", + "All primary targets available:", + "Rule for printing all primary targets available.", + /*depfile=*/ "", + /*restat=*/ false, + /*generator=*/ false); + WriteBuild(os, + "Print all primary targets available.", + "HELP", + /*outputs=*/ cmNinjaDeps(1, "help"), + /*explicitDeps=*/ cmNinjaDeps(), + /*implicitDeps=*/ cmNinjaDeps(), + /*orderOnlyDeps=*/ cmNinjaDeps(), + /*variables=*/ cmNinjaVars()); +} diff --git a/Source/cmGlobalNinjaGenerator.h b/Source/cmGlobalNinjaGenerator.h index 3217581..e652972 100644 --- a/Source/cmGlobalNinjaGenerator.h +++ b/Source/cmGlobalNinjaGenerator.h @@ -273,6 +273,8 @@ private: void WriteBuiltinTargets(std::ostream& os); void WriteTargetAll(std::ostream& os); void WriteTargetRebuildManifest(std::ostream& os); + void WriteTargetClean(std::ostream& os); + void WriteTargetHelp(std::ostream& os); /// Called when we have seen the given custom command. Returns true /// if we has seen it before. diff --git a/Source/cmGlobalVisualStudio10Generator.cxx b/Source/cmGlobalVisualStudio10Generator.cxx index 22ead10..18a786d 100644 --- a/Source/cmGlobalVisualStudio10Generator.cxx +++ b/Source/cmGlobalVisualStudio10Generator.cxx @@ -13,6 +13,7 @@ #include "cmGlobalVisualStudio10Generator.h" #include "cmLocalVisualStudio10Generator.h" #include "cmMakefile.h" +#include "cmSourceFile.h" #include "cmake.h" @@ -51,6 +52,38 @@ cmLocalGenerator *cmGlobalVisualStudio10Generator::CreateLocalGenerator() } //---------------------------------------------------------------------------- +void cmGlobalVisualStudio10Generator::Generate() +{ + this->LongestSource = LongestSourcePath(); + this->cmGlobalVisualStudio8Generator::Generate(); + if(this->LongestSource.Length > 0) + { + cmMakefile* mf = this->LongestSource.Target->GetMakefile(); + cmOStringStream e; + e << + "The binary and/or source directory paths may be too long to generate " + "Visual Studio 10 files for this project. " + "Consider choosing shorter directory names to build this project with " + "Visual Studio 10. " + "A more detailed explanation follows." + "\n" + "There is a bug in the VS 10 IDE that renders property dialog fields " + "blank for files referenced by full path in the project file. " + "However, CMake must reference at least one file by full path:\n" + " " << this->LongestSource.SourceFile->GetFullPath() << "\n" + "This is because some Visual Studio tools would append the relative " + "path to the end of the referencing directory path, as in:\n" + " " << mf->GetCurrentOutputDirectory() << "/" + << this->LongestSource.SourceRel << "\n" + "and then incorrectly complain that the file does not exist because " + "the path length is too long for some internal buffer or API. " + "To avoid this problem CMake must use a full path for this file " + "which then triggers the VS 10 property dialog bug."; + mf->IssueMessage(cmake::WARNING, e.str().c_str()); + } +} + +//---------------------------------------------------------------------------- void cmGlobalVisualStudio10Generator ::GetDocumentation(cmDocumentationEntry& entry) const { @@ -212,3 +245,36 @@ bool cmGlobalVisualStudio10Generator::Find64BitTools(cmMakefile* mf) return false; } } + +//---------------------------------------------------------------------------- +std::string +cmGlobalVisualStudio10Generator +::GenerateRuleFile(std::string const& output) const +{ + // The VS 10 generator needs to create the .rule files on disk. + // Hide them away under the CMakeFiles directory. + std::string ruleDir = this->GetCMakeInstance()->GetHomeOutputDirectory(); + ruleDir += cmake::GetCMakeFilesDirectory(); + ruleDir += "/"; + ruleDir += cmSystemTools::ComputeStringMD5( + cmSystemTools::GetFilenamePath(output).c_str()); + std::string ruleFile = ruleDir + "/"; + ruleFile += cmSystemTools::GetFilenameName(output); + ruleFile += ".rule"; + return ruleFile; +} + +//---------------------------------------------------------------------------- +void cmGlobalVisualStudio10Generator::PathTooLong( + cmTarget* target, cmSourceFile* sf, std::string const& sfRel) +{ + size_t len = (strlen(target->GetMakefile()->GetCurrentOutputDirectory()) + + 1 + sfRel.length()); + if(len > this->LongestSource.Length) + { + this->LongestSource.Length = len; + this->LongestSource.Target = target; + this->LongestSource.SourceFile = sf; + this->LongestSource.SourceRel = sfRel; + } +} diff --git a/Source/cmGlobalVisualStudio10Generator.h b/Source/cmGlobalVisualStudio10Generator.h index 750b89c..4236563 100644 --- a/Source/cmGlobalVisualStudio10Generator.h +++ b/Source/cmGlobalVisualStudio10Generator.h @@ -46,6 +46,8 @@ public: ///! create the correct local generator virtual cmLocalGenerator *CreateLocalGenerator(); + virtual void Generate(); + /** * Try to determine system infomation such as shared library * extension, pthreads, byte order etc. @@ -75,10 +77,26 @@ public: virtual const char* GetCMakeCFGIntDir() const { return "$(Configuration)";} bool Find64BitTools(cmMakefile* mf); + + /** Generate an <output>.rule file path for a given command output. */ + virtual std::string GenerateRuleFile(std::string const& output) const; + + void PathTooLong(cmTarget* target, cmSourceFile* sf, + std::string const& sfRel); protected: virtual const char* GetIDEVersion() { return "10.0"; } std::string PlatformToolset; bool ExpressEdition; +private: + struct LongestSourcePath + { + LongestSourcePath(): Length(0), Target(0), SourceFile(0) {} + size_t Length; + cmTarget* Target; + cmSourceFile* SourceFile; + std::string SourceRel; + }; + LongestSourcePath LongestSource; }; #endif diff --git a/Source/cmGlobalVisualStudio11ARMGenerator.cxx b/Source/cmGlobalVisualStudio11ARMGenerator.cxx new file mode 100644 index 0000000..fef1aba --- /dev/null +++ b/Source/cmGlobalVisualStudio11ARMGenerator.cxx @@ -0,0 +1,32 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2011 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#include "cmGlobalVisualStudio11ARMGenerator.h" +#include "cmMakefile.h" +#include "cmake.h" + +//---------------------------------------------------------------------------- +void cmGlobalVisualStudio11ARMGenerator +::GetDocumentation(cmDocumentationEntry& entry) const +{ + entry.Name = this->GetName(); + entry.Brief = "Generates Visual Studio 11 ARM project files."; + entry.Full = ""; +} + +//---------------------------------------------------------------------------- +void cmGlobalVisualStudio11ARMGenerator +::AddPlatformDefinitions(cmMakefile* mf) +{ + this->cmGlobalVisualStudio11Generator::AddPlatformDefinitions(mf); + mf->AddDefinition("MSVC_C_ARCHITECTURE_ID", "ARM"); + mf->AddDefinition("MSVC_CXX_ARCHITECTURE_ID", "ARM"); +} diff --git a/Source/cmGlobalVisualStudio11ARMGenerator.h b/Source/cmGlobalVisualStudio11ARMGenerator.h new file mode 100644 index 0000000..77e1429 --- /dev/null +++ b/Source/cmGlobalVisualStudio11ARMGenerator.h @@ -0,0 +1,37 @@ +/*============================================================================ + CMake - Cross Platform Makefile Generator + Copyright 2000-2011 Kitware, Inc., Insight Software Consortium + + Distributed under the OSI-approved BSD License (the "License"); + see accompanying file Copyright.txt for details. + + This software is distributed WITHOUT ANY WARRANTY; without even the + implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + See the License for more information. +============================================================================*/ +#ifndef cmGlobalVisualStudio11ARMGenerator_h +#define cmGlobalVisualStudio11ARMGenerator_h + +#include "cmGlobalVisualStudio11Generator.h" + +class cmGlobalVisualStudio11ARMGenerator : + public cmGlobalVisualStudio11Generator +{ +public: + cmGlobalVisualStudio11ARMGenerator() {} + static cmGlobalGenerator* New() { + return new cmGlobalVisualStudio11ARMGenerator; } + + ///! Get the name for the generator. + virtual const char* GetName() const { + return cmGlobalVisualStudio11ARMGenerator::GetActualName();} + static const char* GetActualName() {return "Visual Studio 11 ARM";} + + virtual const char* GetPlatformName() const {return "ARM";} + + /** Get the documentation entry for this generator. */ + virtual void GetDocumentation(cmDocumentationEntry& entry) const; + + virtual void AddPlatformDefinitions(cmMakefile* mf); +}; +#endif diff --git a/Source/cmGlobalVisualStudio71Generator.cxx b/Source/cmGlobalVisualStudio71Generator.cxx index a5feaca..d6b653c 100644 --- a/Source/cmGlobalVisualStudio71Generator.cxx +++ b/Source/cmGlobalVisualStudio71Generator.cxx @@ -241,9 +241,12 @@ void cmGlobalVisualStudio71Generator ::WriteExternalProject(std::ostream& fout, const char* name, const char* location, + const char* typeGuid, const std::set<cmStdString>& depends) { - fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" + fout << "Project(\"{" + << (typeGuid ? typeGuid : "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942") + << "}\") = \"" << name << "\", \"" << this->ConvertToSolutionPath(location) << "\", \"{" << this->GetGUID(name) @@ -279,18 +282,21 @@ void cmGlobalVisualStudio71Generator // executables to the libraries it uses are also done here void cmGlobalVisualStudio71Generator ::WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild) + bool partOfDefaultBuild, + const char* platformMapping) { std::string guid = this->GetGUID(name); for(std::vector<std::string>::iterator i = this->Configurations.begin(); i != this->Configurations.end(); ++i) { fout << "\t\t{" << guid << "}." << *i - << ".ActiveCfg = " << *i << "|Win32\n"; + << ".ActiveCfg = " << *i << "|" + << (platformMapping ? platformMapping : "Win32") << std::endl; if(partOfDefaultBuild) { fout << "\t\t{" << guid << "}." << *i - << ".Build.0 = " << *i << "|Win32\n"; + << ".Build.0 = " << *i << "|" + << (platformMapping ? platformMapping : "Win32") << std::endl; } } } diff --git a/Source/cmGlobalVisualStudio71Generator.h b/Source/cmGlobalVisualStudio71Generator.h index 81c2087..503b708 100644 --- a/Source/cmGlobalVisualStudio71Generator.h +++ b/Source/cmGlobalVisualStudio71Generator.h @@ -64,10 +64,12 @@ protected: const char* name, const char* path, cmTarget &t); virtual void WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild); + bool partOfDefaultBuild, + const char* platformMapping = NULL); virtual void WriteExternalProject(std::ostream& fout, const char* name, const char* path, + const char* typeGuid, const std::set<cmStdString>& depends); virtual void WriteSLNFooter(std::ostream& fout); virtual void WriteSLNHeader(std::ostream& fout); diff --git a/Source/cmGlobalVisualStudio7Generator.cxx b/Source/cmGlobalVisualStudio7Generator.cxx index a68e6d8..6332d0b 100644 --- a/Source/cmGlobalVisualStudio7Generator.cxx +++ b/Source/cmGlobalVisualStudio7Generator.cxx @@ -250,8 +250,9 @@ void cmGlobalVisualStudio7Generator::WriteTargetConfigurations( const char* expath = target->GetProperty("EXTERNAL_MSPROJECT"); if(expath) { - this->WriteProjectConfigurations(fout, target->GetName(), - true); + this->WriteProjectConfigurations( + fout, target->GetName(), + true, target->GetProperty("VS_PLATFORM_MAPPING")); } else { @@ -286,8 +287,12 @@ void cmGlobalVisualStudio7Generator::WriteTargetsToSolution( { std::string project = target->GetName(); std::string location = expath; - this->WriteExternalProject(fout, project.c_str(), - location.c_str(), target->GetUtilities()); + + this->WriteExternalProject(fout, + project.c_str(), + location.c_str(), + target->GetProperty("VS_PROJECT_TYPE"), + target->GetUtilities()); written = true; } else @@ -580,18 +585,21 @@ cmGlobalVisualStudio7Generator // executables to the libraries it uses are also done here void cmGlobalVisualStudio7Generator ::WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild) + bool partOfDefaultBuild, + const char* platformMapping) { std::string guid = this->GetGUID(name); for(std::vector<std::string>::iterator i = this->Configurations.begin(); i != this->Configurations.end(); ++i) { fout << "\t\t{" << guid << "}." << *i - << ".ActiveCfg = " << *i << "|Win32\n"; + << ".ActiveCfg = " << *i << "|" + << (platformMapping ? platformMapping : "Win32") << "\n"; if(partOfDefaultBuild) { fout << "\t\t{" << guid << "}." << *i - << ".Build.0 = " << *i << "|Win32\n"; + << ".Build.0 = " << *i << "|" + << (platformMapping ? platformMapping : "Win32") << "\n"; } } } @@ -604,10 +612,14 @@ void cmGlobalVisualStudio7Generator void cmGlobalVisualStudio7Generator::WriteExternalProject(std::ostream& fout, const char* name, const char* location, + const char* typeGuid, const std::set<cmStdString>&) { std::string d = cmSystemTools::ConvertToOutputPath(location); - fout << "Project(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"" + fout << "Project(" + << "\"{" + << (typeGuid ? typeGuid : "8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942") + << "}\") = \"" << name << "\", \"" << this->ConvertToSolutionPath(location) << "\", \"{" << this->GetGUID(name) diff --git a/Source/cmGlobalVisualStudio7Generator.h b/Source/cmGlobalVisualStudio7Generator.h index c92998e..9b9107d 100644 --- a/Source/cmGlobalVisualStudio7Generator.h +++ b/Source/cmGlobalVisualStudio7Generator.h @@ -107,7 +107,8 @@ protected: const char* name, const char* path, cmTarget &t); virtual void WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild); + bool partOfDefaultBuild, + const char* platformMapping = NULL); virtual void WriteSLNFooter(std::ostream& fout); virtual void WriteSLNHeader(std::ostream& fout); virtual std::string WriteUtilityDepend(cmTarget* target); @@ -130,6 +131,7 @@ protected: virtual void WriteExternalProject(std::ostream& fout, const char* name, const char* path, + const char* typeGuid, const std::set<cmStdString>& dependencies); diff --git a/Source/cmGlobalVisualStudio8Generator.cxx b/Source/cmGlobalVisualStudio8Generator.cxx index a723109..e7c4232 100644 --- a/Source/cmGlobalVisualStudio8Generator.cxx +++ b/Source/cmGlobalVisualStudio8Generator.cxx @@ -214,13 +214,11 @@ void cmGlobalVisualStudio8Generator::AddCheckTarget() // (this could be avoided with per-target source files) const char* no_main_dependency = 0; const char* no_working_directory = 0; - mf->AddCustomCommandToOutput( - stamps, listFiles, - no_main_dependency, commandLines, "Checking Build System", - no_working_directory, true); - std::string ruleName = stamps[0]; - ruleName += ".rule"; - if(cmSourceFile* file = mf->GetSource(ruleName.c_str())) + if(cmSourceFile* file = + mf->AddCustomCommandToOutput( + stamps, listFiles, + no_main_dependency, commandLines, "Checking Build System", + no_working_directory, true)) { tgt->AddSourceFile(file); } @@ -270,20 +268,23 @@ cmGlobalVisualStudio8Generator void cmGlobalVisualStudio8Generator ::WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild) + bool partOfDefaultBuild, + const char* platformMapping) { std::string guid = this->GetGUID(name); for(std::vector<std::string>::iterator i = this->Configurations.begin(); i != this->Configurations.end(); ++i) { fout << "\t\t{" << guid << "}." << *i - << "|" << this->GetPlatformName() << ".ActiveCfg = " - << *i << "|" << this->GetPlatformName() << "\n"; + << "|" << this->GetPlatformName() << ".ActiveCfg = " << *i << "|" + << (platformMapping ? platformMapping : this->GetPlatformName()) + << "\n"; if(partOfDefaultBuild) { fout << "\t\t{" << guid << "}." << *i - << "|" << this->GetPlatformName() << ".Build.0 = " - << *i << "|" << this->GetPlatformName() << "\n"; + << "|" << this->GetPlatformName() << ".Build.0 = " << *i << "|" + << (platformMapping ? platformMapping : this->GetPlatformName()) + << "\n"; } } } diff --git a/Source/cmGlobalVisualStudio8Generator.h b/Source/cmGlobalVisualStudio8Generator.h index e0913ed..7dae429 100644 --- a/Source/cmGlobalVisualStudio8Generator.h +++ b/Source/cmGlobalVisualStudio8Generator.h @@ -77,7 +77,8 @@ protected: virtual void WriteSolutionConfigurations(std::ostream& fout); virtual void WriteProjectConfigurations(std::ostream& fout, const char* name, - bool partOfDefaultBuild); + bool partOfDefaultBuild, + const char* platformMapping = NULL); virtual bool ComputeTargetDepends(); virtual void WriteProjectDepends(std::ostream& fout, const char* name, const char* path, cmTarget &t); diff --git a/Source/cmGlobalXCodeGenerator.cxx b/Source/cmGlobalXCodeGenerator.cxx index 998843f..522f3da 100644 --- a/Source/cmGlobalXCodeGenerator.cxx +++ b/Source/cmGlobalXCodeGenerator.cxx @@ -723,6 +723,10 @@ GetSourcecodeValueFromFileExtension(const std::string& _ext, { sourcecode = "file.xib"; } + else if(ext == "storyboard") + { + sourcecode = "file.storyboard"; + } else if(ext == "mm") { sourcecode += ".cpp.objcpp"; diff --git a/Source/cmIncludeExternalMSProjectCommand.cxx b/Source/cmIncludeExternalMSProjectCommand.cxx index a4369a3..d219c16 100644 --- a/Source/cmIncludeExternalMSProjectCommand.cxx +++ b/Source/cmIncludeExternalMSProjectCommand.cxx @@ -25,18 +25,75 @@ bool cmIncludeExternalMSProjectCommand #ifdef _WIN32 if(this->Makefile->GetDefinition("WIN32")) { + enum Doing { DoingNone, DoingType, DoingGuid, DoingPlatform }; + + Doing doing = DoingNone; + + std::string customType; + std::string customGuid; + std::string platformMapping; + + std::vector<std::string> depends; + for (unsigned int i=2; i<args.size(); ++i) + { + if (args[i] == "TYPE") + { + doing = DoingType; + } + else if (args[i] == "GUID") + { + doing = DoingGuid; + } + else if (args[i] == "PLATFORM") + { + doing = DoingPlatform; + } + else + { + switch (doing) + { + case DoingNone: depends.push_back(args[i]); break; + case DoingType: customType = args[i]; break; + case DoingGuid: customGuid = args[i]; break; + case DoingPlatform: platformMapping = args[i]; break; + } + doing = DoingNone; + } + } + + // Hack together a utility target storing enough information + // to reproduce the target inclusion. + std::string utility_name = args[0]; + std::string path = args[1]; cmSystemTools::ConvertToUnixSlashes(path); + if (!customGuid.empty()) + { + std::string guidVariable = utility_name + "_GUID_CMAKE"; + this->Makefile->GetCMakeInstance()->AddCacheEntry( + guidVariable.c_str(), customGuid.c_str(), + "Stored GUID", cmCacheManager::INTERNAL); + } + // Create a target instance for this utility. cmTarget* target=this->Makefile->AddNewTarget(cmTarget::UTILITY, - args[0].c_str()); + utility_name.c_str()); + + target->SetProperty("GENERATOR_FILE_NAME", utility_name.c_str()); target->SetProperty("EXTERNAL_MSPROJECT", path.c_str()); - target->SetProperty("EXCLUDE_FROM_ALL","FALSE"); - target->SetProperty("GENERATOR_FILE_NAME", args[0].c_str()); - for (unsigned int i=2; i<args.size(); ++i) + target->SetProperty("EXCLUDE_FROM_ALL", "FALSE"); + + if (!customType.empty()) + target->SetProperty("VS_PROJECT_TYPE",customType.c_str()); + if (!platformMapping.empty()) + target->SetProperty("VS_PLATFORM_MAPPING",platformMapping.c_str()); + + for (std::vector<std::string>::const_iterator it = depends.begin(); + it != depends.end(); + ++it) { - target->AddUtility(args[i].c_str()); + target->AddUtility(it->c_str()); } } #endif diff --git a/Source/cmIncludeExternalMSProjectCommand.h b/Source/cmIncludeExternalMSProjectCommand.h index 911a772..2b2ed0d 100644 --- a/Source/cmIncludeExternalMSProjectCommand.h +++ b/Source/cmIncludeExternalMSProjectCommand.h @@ -59,11 +59,21 @@ public: { return " include_external_msproject(projectname location\n" + " [TYPE projectTypeGUID]\n" + " [GUID projectGUID]\n" + " [PLATFORM platformName]\n" " dep1 dep2 ...)\n" "Includes an external Microsoft project in the generated workspace " "file. Currently does nothing on UNIX. This will create a " "target named [projectname]. This can be used in the add_dependencies " - "command to make things depend on the external project."; + "command to make things depend on the external project." + "\n" + "TYPE, GUID and PLATFORM are optional parameters that allow one " + "to specify the type of project, id (GUID) of the project and " + "the name of the target platform. " + "This is useful for projects requiring values other than the default " + "(e.g. WIX projects). " + "These options are not supported by the Visual Studio 6 generator."; } cmTypeMacro(cmIncludeExternalMSProjectCommand, cmCommand); diff --git a/Source/cmListCommand.cxx b/Source/cmListCommand.cxx index cbbcbb0..908f3b0 100644 --- a/Source/cmListCommand.cxx +++ b/Source/cmListCommand.cxx @@ -204,6 +204,12 @@ bool cmListCommand::HandleGetCommand(std::vector<std::string> const& args) this->Makefile->AddDefinition(variableName.c_str(), "NOTFOUND"); return true; } + // FIXME: Add policy to make non-existing lists an error like empty lists. + if(varArgsExpanded.empty()) + { + this->SetError("GET given empty list"); + return false; + } std::string value; size_t cc; @@ -318,7 +324,8 @@ bool cmListCommand::HandleInsertCommand(std::vector<std::string> const& args) // expand the variable int item = atoi(args[2].c_str()); std::vector<std::string> varArgsExpanded; - if ( !this->GetList(varArgsExpanded, listName.c_str()) && item != 0) + if((!this->GetList(varArgsExpanded, listName.c_str()) + || varArgsExpanded.empty()) && item != 0) { cmOStringStream str; str << "index: " << item << " out of range (0, 0)"; @@ -544,6 +551,12 @@ bool cmListCommand::HandleRemoveAtCommand( this->SetError("sub-command REMOVE_AT requires list to be present."); return false; } + // FIXME: Add policy to make non-existing lists an error like empty lists. + if(varArgsExpanded.empty()) + { + this->SetError("REMOVE_AT given empty list"); + return false; + } size_t cc; std::vector<size_t> removed; diff --git a/Source/cmLocalGenerator.cxx b/Source/cmLocalGenerator.cxx index 13ede5d..6362d80 100644 --- a/Source/cmLocalGenerator.cxx +++ b/Source/cmLocalGenerator.cxx @@ -954,29 +954,27 @@ cmLocalGenerator::ExpandRuleVariable(std::string const& variable, } } } - if(replaceValues.TargetSOName) + if(variable == "TARGET_SONAME" || variable == "SONAME_FLAG" || + variable == "TARGET_INSTALLNAME_DIR") { - if(variable == "TARGET_SONAME") + // All these variables depend on TargetSOName + if(replaceValues.TargetSOName) { - if(replaceValues.Language) + if(variable == "TARGET_SONAME") { - std::string name = "CMAKE_SHARED_LIBRARY_SONAME_"; - name += replaceValues.Language; - name += "_FLAG"; - if(this->Makefile->GetDefinition(name.c_str())) - { - return replaceValues.TargetSOName; - } + return replaceValues.TargetSOName; + } + if(variable == "SONAME_FLAG" && replaceValues.SONameFlag) + { + return replaceValues.SONameFlag; + } + if(replaceValues.TargetInstallNameDir && + variable == "TARGET_INSTALLNAME_DIR") + { + return replaceValues.TargetInstallNameDir; } - return ""; - } - } - if(replaceValues.TargetInstallNameDir) - { - if(variable == "TARGET_INSTALLNAME_DIR") - { - return replaceValues.TargetInstallNameDir; } + return ""; } if(replaceValues.LinkLibraries) { diff --git a/Source/cmLocalGenerator.h b/Source/cmLocalGenerator.h index 3e93819..cb84a30 100644 --- a/Source/cmLocalGenerator.h +++ b/Source/cmLocalGenerator.h @@ -228,6 +228,7 @@ public: const char* ObjectDir; const char* Flags; const char* ObjectsQuoted; + const char* SONameFlag; const char* TargetSOName; const char* TargetInstallNameDir; const char* LinkFlags; diff --git a/Source/cmLocalVisualStudio10Generator.cxx b/Source/cmLocalVisualStudio10Generator.cxx index bf0e997..ace7adf 100644 --- a/Source/cmLocalVisualStudio10Generator.cxx +++ b/Source/cmLocalVisualStudio10Generator.cxx @@ -99,6 +99,14 @@ void cmLocalVisualStudio10Generator { cmVS10XMLParser parser; parser.ParseFile(path); + + // if we can not find a GUID then create one + if(parser.GUID.empty()) + { + this->GlobalGenerator->CreateGUID(name); + return; + } + std::string guidStoreName = name; guidStoreName += "_GUID_CMAKE"; // save the GUID in the cache diff --git a/Source/cmLocalVisualStudio6Generator.cxx b/Source/cmLocalVisualStudio6Generator.cxx index 99a4c95..5ab223b 100644 --- a/Source/cmLocalVisualStudio6Generator.cxx +++ b/Source/cmLocalVisualStudio6Generator.cxx @@ -320,7 +320,7 @@ void cmLocalVisualStudio6Generator::WriteDSPFile(std::ostream& fout, sourceGroup.AssignSource(*i); // while we are at it, if it is a .rule file then for visual studio 6 we // must generate it - if ((*i)->GetExtension() == "rule") + if ((*i)->GetPropertyAsBool("__CMAKE_RULE")) { if(!cmSystemTools::FileExists(source.c_str())) { diff --git a/Source/cmMakefile.cxx b/Source/cmMakefile.cxx index e7e5eda..0a709ae 100644 --- a/Source/cmMakefile.cxx +++ b/Source/cmMakefile.cxx @@ -883,7 +883,7 @@ cmMakefile::AddCustomCommandToTarget(const char* target, } //---------------------------------------------------------------------------- -void +cmSourceFile* cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, const std::vector<std::string>& depends, const char* main_dependency, @@ -897,7 +897,7 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, if(outputs.empty()) { cmSystemTools::Error("Attempt to add a custom rule with no output!"); - return; + return 0; } // Validate custom commands. TODO: More strict? @@ -910,7 +910,7 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, cmOStringStream e; e << "COMMAND may not contain literal quotes:\n " << cl[0] << "\n"; this->IssueMessage(cmake::FATAL_ERROR, e.str()); - return; + return 0; } } @@ -928,7 +928,7 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, { // The existing custom command is identical. Silently ignore // the duplicate. - return; + return file; } else { @@ -948,17 +948,11 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, // Generate a rule file if the main dependency is not available. if(!file) { + cmGlobalGenerator* gg = this->LocalGenerator->GetGlobalGenerator(); + // Construct a rule file associated with the first output produced. - std::string outName = outputs[0]; - outName += ".rule"; - const char* dir = - this->LocalGenerator->GetGlobalGenerator()-> - GetCMakeCFGIntDir(); - if(dir && dir[0] == '$') - { - cmSystemTools::ReplaceString(outName, dir, - cmake::GetCMakeFilesDirectory()); - } + std::string outName = gg->GenerateRuleFile(outputs[0]); + // Check if the rule file already exists. file = this->GetSource(outName.c_str()); if(file && file->GetCustomCommand() && !replace) @@ -970,11 +964,12 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, outName.c_str(), "\" which already has a custom rule."); } - return; + return file; } // Create a cmSourceFile for the rule file. file = this->GetOrCreateSource(outName.c_str(), true); + file->SetProperty("__CMAKE_RULE", "1"); } // Always create the output sources and mark them generated. @@ -1004,10 +999,11 @@ cmMakefile::AddCustomCommandToOutput(const std::vector<std::string>& outputs, cc->SetEscapeAllowMakeVars(true); file->SetCustomCommand(cc); } + return file; } //---------------------------------------------------------------------------- -void +cmSourceFile* cmMakefile::AddCustomCommandToOutput(const char* output, const std::vector<std::string>& depends, const char* main_dependency, @@ -1019,9 +1015,9 @@ cmMakefile::AddCustomCommandToOutput(const char* output, { std::vector<std::string> outputs; outputs.push_back(output); - this->AddCustomCommandToOutput(outputs, depends, main_dependency, - commandLines, comment, workingDir, - replace, escapeOldStyle); + return this->AddCustomCommandToOutput(outputs, depends, main_dependency, + commandLines, comment, workingDir, + replace, escapeOldStyle); } //---------------------------------------------------------------------------- @@ -1054,13 +1050,14 @@ cmMakefile::AddCustomCommandOldStyle(const char* target, { // Get the name of this output. const char* output = oi->c_str(); + cmSourceFile* sf; // Choose whether to use a main dependency. if(sourceFiles.find(source)) { // The source looks like a real file. Use it as the main dependency. - this->AddCustomCommandToOutput(output, depends, source, - commandLines, comment, 0); + sf = this->AddCustomCommandToOutput(output, depends, source, + commandLines, comment, 0); } else { @@ -1068,20 +1065,18 @@ cmMakefile::AddCustomCommandOldStyle(const char* target, const char* no_main_dependency = 0; std::vector<std::string> depends2 = depends; depends2.push_back(source); - this->AddCustomCommandToOutput(output, depends2, no_main_dependency, - commandLines, comment, 0); + sf = this->AddCustomCommandToOutput(output, depends2, no_main_dependency, + commandLines, comment, 0); } // If the rule was added to the source (and not a .rule file), // then add the source to the target to make sure the rule is // included. - std::string sname = output; - sname += ".rule"; - if(!this->GetSource(sname.c_str())) + if(sf && !sf->GetPropertyAsBool("__CMAKE_RULE")) { if (this->Targets.find(target) != this->Targets.end()) { - this->Targets[target].AddSource(source); + this->Targets[target].AddSourceFile(sf); } else { @@ -1976,7 +1971,6 @@ cmSourceFile *cmMakefile::GetSourceFileWithOutput(const char *cname) // look through all the source files that have custom commands // and see if the custom command has the passed source file as an output - // keep in mind the possible .rule extension that may be tacked on for(std::vector<cmSourceFile*>::const_iterator i = this->SourceFiles.begin(); i != this->SourceFiles.end(); ++i) { @@ -2201,6 +2195,14 @@ bool cmMakefile::PlatformIs64Bit() const return false; } +const char* cmMakefile::GetSONameFlag(const char* language) const +{ + std::string name = "CMAKE_SHARED_LIBRARY_SONAME_"; + name += language; + name += "_FLAG"; + return GetDefinition(name.c_str()); +} + bool cmMakefile::CanIWriteThisFile(const char* fileName) { if ( !this->IsOn("CMAKE_DISABLE_SOURCE_CHANGES") ) diff --git a/Source/cmMakefile.h b/Source/cmMakefile.h index 960ba39..9fc64d6 100644 --- a/Source/cmMakefile.h +++ b/Source/cmMakefile.h @@ -175,20 +175,22 @@ public: cmTarget::CustomCommandType type, const char* comment, const char* workingDir, bool escapeOldStyle = true); - void AddCustomCommandToOutput(const std::vector<std::string>& outputs, - const std::vector<std::string>& depends, - const char* main_dependency, - const cmCustomCommandLines& commandLines, - const char* comment, const char* workingDir, - bool replace = false, - bool escapeOldStyle = true); - void AddCustomCommandToOutput(const char* output, - const std::vector<std::string>& depends, - const char* main_dependency, - const cmCustomCommandLines& commandLines, - const char* comment, const char* workingDir, - bool replace = false, - bool escapeOldStyle = true); + cmSourceFile* AddCustomCommandToOutput( + const std::vector<std::string>& outputs, + const std::vector<std::string>& depends, + const char* main_dependency, + const cmCustomCommandLines& commandLines, + const char* comment, const char* workingDir, + bool replace = false, + bool escapeOldStyle = true); + cmSourceFile* AddCustomCommandToOutput( + const char* output, + const std::vector<std::string>& depends, + const char* main_dependency, + const cmCustomCommandLines& commandLines, + const char* comment, const char* workingDir, + bool replace = false, + bool escapeOldStyle = true); void AddCustomCommandOldStyle(const char* target, const std::vector<std::string>& outputs, const std::vector<std::string>& depends, @@ -593,6 +595,9 @@ public: /** Return whether the target platform is 64-bit. */ bool PlatformIs64Bit() const; + /** Retrieve soname flag for the specified language if supported */ + const char* GetSONameFlag(const char* language) const; + /** * Get a list of preprocessor define flags. */ diff --git a/Source/cmMakefileLibraryTargetGenerator.cxx b/Source/cmMakefileLibraryTargetGenerator.cxx index 38aa59d..db59ffd 100644 --- a/Source/cmMakefileLibraryTargetGenerator.cxx +++ b/Source/cmMakefileLibraryTargetGenerator.cxx @@ -714,7 +714,11 @@ void cmMakefileLibraryTargetGenerator::WriteLibraryRules std::string linkString = linklibs.str(); vars.LinkLibraries = linkString.c_str(); vars.ObjectsQuoted = buildObjs.c_str(); - vars.TargetSOName= targetNameSO.c_str(); + if (this->Target->HasSOName(this->ConfigName)) + { + vars.SONameFlag = this->Makefile->GetSONameFlag(linkLanguage); + vars.TargetSOName= targetNameSO.c_str(); + } vars.LinkFlags = linkFlags.c_str(); // Compute the directory portion of the install_name setting. diff --git a/Source/cmMakefileTargetGenerator.cxx b/Source/cmMakefileTargetGenerator.cxx index a0e0481..408f287 100644 --- a/Source/cmMakefileTargetGenerator.cxx +++ b/Source/cmMakefileTargetGenerator.cxx @@ -153,14 +153,8 @@ void cmMakefileTargetGenerator::WriteTargetBuildRules() } } } - for(std::vector<cmSourceFile*>::const_iterator - si = this->GeneratorTarget->OSXContent.begin(); - si != this->GeneratorTarget->OSXContent.end(); ++si) - { - cmTarget::SourceFileFlags tsFlags = - this->Target->GetTargetSourceFileFlags(*si); - this->WriteMacOSXContentRules(**si, tsFlags.MacFolder); - } + this->WriteMacOSXContentRules(this->GeneratorTarget->HeaderSources); + this->WriteMacOSXContentRules(this->GeneratorTarget->ExtraSources); for(std::vector<cmSourceFile*>::const_iterator si = this->GeneratorTarget->ExternalObjects.begin(); si != this->GeneratorTarget->ExternalObjects.end(); ++si) @@ -354,6 +348,22 @@ void cmMakefileTargetGenerator::WriteTargetLanguageFlags() } //---------------------------------------------------------------------------- +void cmMakefileTargetGenerator::WriteMacOSXContentRules( + std::vector<cmSourceFile*> const& sources) +{ + for(std::vector<cmSourceFile*>::const_iterator + si = sources.begin(); si != sources.end(); ++si) + { + cmTarget::SourceFileFlags tsFlags = + this->Target->GetTargetSourceFileFlags(*si); + if(tsFlags.Type != cmTarget::SourceFileTypeNormal) + { + this->WriteMacOSXContentRules(**si, tsFlags.MacFolder); + } + } +} + +//---------------------------------------------------------------------------- void cmMakefileTargetGenerator::WriteMacOSXContentRules(cmSourceFile& source, const char* pkgloc) { diff --git a/Source/cmMakefileTargetGenerator.h b/Source/cmMakefileTargetGenerator.h index e1e554b..36a1f68 100644 --- a/Source/cmMakefileTargetGenerator.h +++ b/Source/cmMakefileTargetGenerator.h @@ -73,6 +73,7 @@ protected: void WriteTargetDependRules(); // write rules for Mac OS X Application Bundle content. + void WriteMacOSXContentRules(std::vector<cmSourceFile*> const& sources); void WriteMacOSXContentRules(cmSourceFile& source, const char* pkgloc); // write the rules for an object diff --git a/Source/cmNinjaNormalTargetGenerator.cxx b/Source/cmNinjaNormalTargetGenerator.cxx index 2bad32c..63ba58d 100644 --- a/Source/cmNinjaNormalTargetGenerator.cxx +++ b/Source/cmNinjaNormalTargetGenerator.cxx @@ -47,8 +47,7 @@ cmNinjaNormalTargetGenerator(cmTarget* target) { // on Windows the output dir is already needed at compile time // ensure the directory exists (OutDir test) - std::string outpath = target->GetDirectory(this->GetConfigName()); - cmSystemTools::MakeDirectory(outpath.c_str()); + EnsureDirectoryExists(target->GetDirectory(this->GetConfigName())); } } @@ -56,6 +55,21 @@ cmNinjaNormalTargetGenerator::~cmNinjaNormalTargetGenerator() { } +void +cmNinjaNormalTargetGenerator +::EnsureDirectoryExists(const std::string& dir) +{ + cmSystemTools::MakeDirectory(dir.c_str()); +} + +void +cmNinjaNormalTargetGenerator +::EnsureParentDirectoryExists(const std::string& path) +{ + EnsureDirectoryExists(cmSystemTools::GetParentDirectory(path.c_str())); +} + + void cmNinjaNormalTargetGenerator::Generate() { if (!this->TargetLinkLanguage) { @@ -152,6 +166,7 @@ cmNinjaNormalTargetGenerator cmLocalGenerator::SHELL); vars.ObjectDir = objdir.c_str(); vars.Target = "$out"; + vars.SONameFlag = "$SONAME_FLAG"; vars.TargetSOName = "$SONAME"; vars.TargetInstallNameDir = "$INSTALLNAME_DIR"; vars.TargetPDB = "$TARGET_PDB"; @@ -366,27 +381,35 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() this->GetTarget(), this->TargetLinkLanguage, this->GetConfigName()); - vars["SONAME"] = this->TargetNameSO; - - if (targetType == cmTarget::SHARED_LIBRARY) { - std::string install_name_dir = - this->GetTarget()->GetInstallNameDirForBuildTree(this->GetConfigName()); - - if (!install_name_dir.empty()) { - vars["INSTALLNAME_DIR"] = - this->GetLocalGenerator()->Convert(install_name_dir.c_str(), - cmLocalGenerator::NONE, - cmLocalGenerator::SHELL, false); + if (this->GetTarget()->HasSOName(this->GetConfigName())) { + vars["SONAME_FLAG"] = + this->GetMakefile()->GetSONameFlag(this->TargetLinkLanguage); + vars["SONAME"] = this->TargetNameSO; + if (targetType == cmTarget::SHARED_LIBRARY) { + std::string install_name_dir = this->GetTarget() + ->GetInstallNameDirForBuildTree(this->GetConfigName()); + + if (!install_name_dir.empty()) { + vars["INSTALLNAME_DIR"] = + this->GetLocalGenerator()->Convert(install_name_dir.c_str(), + cmLocalGenerator::NONE, + cmLocalGenerator::SHELL, false); + } } } + std::string path; if (!this->TargetNameImport.empty()) { - vars["TARGET_IMPLIB"] = this->GetLocalGenerator()->ConvertToOutputFormat( - targetOutputImplib.c_str(), cmLocalGenerator::SHELL); + path = this->GetLocalGenerator()->ConvertToOutputFormat( + targetOutputImplib.c_str(), cmLocalGenerator::SHELL); + vars["TARGET_IMPLIB"] = path; + EnsureParentDirectoryExists(path); } - vars["TARGET_PDB"] = this->GetLocalGenerator()->ConvertToOutputFormat( - this->GetTargetPDB().c_str(), cmLocalGenerator::SHELL); + path = this->GetLocalGenerator()->ConvertToOutputFormat( + this->GetTargetPDB().c_str(), cmLocalGenerator::SHELL); + vars["TARGET_PDB"] = path; + EnsureParentDirectoryExists(path); std::vector<cmCustomCommand> *cmdLists[3] = { &this->GetTarget()->GetPreBuildCommands(), @@ -413,7 +436,7 @@ void cmNinjaNormalTargetGenerator::WriteLinkStatement() // If we have any PRE_LINK commands, we need to go back to HOME_OUTPUT for // the link commands. if (!preLinkCmdLines.empty()) { - std::string path = this->GetLocalGenerator()->ConvertToOutputFormat( + path = this->GetLocalGenerator()->ConvertToOutputFormat( this->GetMakefile()->GetHomeOutputDirectory(), cmLocalGenerator::SHELL); preLinkCmdLines.push_back("cd " + path); diff --git a/Source/cmNinjaNormalTargetGenerator.h b/Source/cmNinjaNormalTargetGenerator.h index 1702caf..7acbe8f 100644 --- a/Source/cmNinjaNormalTargetGenerator.h +++ b/Source/cmNinjaNormalTargetGenerator.h @@ -35,6 +35,9 @@ private: void WriteObjectLibStatement(); std::vector<std::string> ComputeLinkCmd(); + void EnsureDirectoryExists(const std::string& dir); + void EnsureParentDirectoryExists(const std::string& path); + private: // Target name info. std::string TargetNameOut; diff --git a/Source/cmNinjaTargetGenerator.cxx b/Source/cmNinjaTargetGenerator.cxx index c6469f2..80007f1 100644 --- a/Source/cmNinjaTargetGenerator.cxx +++ b/Source/cmNinjaTargetGenerator.cxx @@ -396,7 +396,6 @@ cmNinjaTargetGenerator cmCustomCommand const* cc = (*si)->GetCustomCommand(); this->GetLocalGenerator()->AddCustomCommandTarget(cc, this->GetTarget()); } - // TODO: this->GeneratorTarget->OSXContent for(std::vector<cmSourceFile*>::const_iterator si = this->GeneratorTarget->ExternalObjects.begin(); si != this->GeneratorTarget->ExternalObjects.end(); ++si) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 1376a48..89f03f6 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -104,6 +104,9 @@ public: private: HANDLE handle_; }; +#elif defined(__APPLE__) +#include <crt_externs.h> +#define environ (*_NSGetEnviron()) #endif bool cmSystemTools::s_RunCommandHideConsole = false; @@ -1630,33 +1633,28 @@ std::vector<std::string> cmSystemTools::GetEnvironmentVariables() } //---------------------------------------------------------------------- -std::vector<std::string> cmSystemTools::AppendEnv( - std::vector<std::string>* env) +void cmSystemTools::AppendEnv(std::vector<std::string> const& env) { - std::vector<std::string> origEnv = GetEnvironmentVariables(); - - if (env && env->size()>0) + for(std::vector<std::string>::const_iterator eit = env.begin(); + eit != env.end(); ++eit) { - std::vector<std::string>::const_iterator eit; - - for (eit = env->begin(); eit!= env->end(); ++eit) - { - PutEnv(eit->c_str()); - } + cmSystemTools::PutEnv(eit->c_str()); } - - return origEnv; } //---------------------------------------------------------------------- -void cmSystemTools::RestoreEnv(const std::vector<std::string>& env) +cmSystemTools::SaveRestoreEnvironment::SaveRestoreEnvironment() { - std::vector<std::string>::const_iterator eit; + this->Env = cmSystemTools::GetEnvironmentVariables(); +} +//---------------------------------------------------------------------- +cmSystemTools::SaveRestoreEnvironment::~SaveRestoreEnvironment() +{ // First clear everything in the current environment: - // std::vector<std::string> currentEnv = GetEnvironmentVariables(); - for (eit = currentEnv.begin(); eit!= currentEnv.end(); ++eit) + for(std::vector<std::string>::const_iterator + eit = currentEnv.begin(); eit != currentEnv.end(); ++eit) { std::string var(*eit); @@ -1666,27 +1664,11 @@ void cmSystemTools::RestoreEnv(const std::vector<std::string>& env) var = var.substr(0, pos); } - UnsetEnv(var.c_str()); + cmSystemTools::UnsetEnv(var.c_str()); } // Then put back each entry from the original environment: - // - for (eit = env.begin(); eit!= env.end(); ++eit) - { - PutEnv(eit->c_str()); - } -} - -//---------------------------------------------------------------------- -cmSystemTools::SaveRestoreEnvironment::SaveRestoreEnvironment() -{ - this->Env = cmSystemTools::GetEnvironmentVariables(); -} - -//---------------------------------------------------------------------- -cmSystemTools::SaveRestoreEnvironment::~SaveRestoreEnvironment() -{ - cmSystemTools::RestoreEnv(this->Env); + cmSystemTools::AppendEnv(this->Env); } #endif diff --git a/Source/cmSystemTools.h b/Source/cmSystemTools.h index 5f21de2..69673c9 100644 --- a/Source/cmSystemTools.h +++ b/Source/cmSystemTools.h @@ -371,16 +371,8 @@ public: /** Get the list of all environment variables */ static std::vector<std::string> GetEnvironmentVariables(); - /** Append multiple variables to the current environment. - Return the original environment, as it was before the - append. */ - static std::vector<std::string> AppendEnv( - std::vector<std::string>* env); - - /** Restore the full environment to "env" - use after - AppendEnv to put the environment back to the way it - was. */ - static void RestoreEnv(const std::vector<std::string>& env); + /** Append multiple variables to the current environment. */ + static void AppendEnv(std::vector<std::string> const& env); /** Helper class to save and restore the environment. Instantiate this class as an automatic variable on diff --git a/Source/cmTarget.cxx b/Source/cmTarget.cxx index cfa9976..c9bb006 100644 --- a/Source/cmTarget.cxx +++ b/Source/cmTarget.cxx @@ -823,6 +823,19 @@ void cmTarget::DefineProperties(cmake *cm) "CMAKE_SKIP_BUILD_RPATH if it is set when a target is created."); cm->DefineProperty + ("NO_SONAME", cmProperty::TARGET, + "Whether to set \"soname\" when linking a shared library or module.", + "Enable this boolean property if a generated shared library or module " + "should not have \"soname\" set. Default is to set \"soname\" on all " + "shared libraries and modules as long as the platform supports it. " + "Generally, use this property only for leaf private libraries or " + "plugins. If you use it on normal shared libraries which other targets " + "link against, on some platforms a linker will insert a full path to " + "the library (as specified at link time) into the dynamic section of " + "the dependent binary. Therefore, once installed, dynamic loader may " + "eventually fail to locate the library for the binary."); + + cm->DefineProperty ("SOVERSION", cmProperty::TARGET, "What version number is this target.", "For shared libraries VERSION and SOVERSION can be used to specify " @@ -831,6 +844,7 @@ void cmTarget::DefineProperties(cmake *cm) "supports symlinks and the linker supports so-names. " "If only one of both is specified the missing is assumed to have " "the same version number. " + "SOVERSION is ignored if NO_SONAME property is set. " "For shared libraries and executables on Windows the VERSION " "attribute is parsed to extract a \"major.minor\" version number. " "These numbers are used as the image version of the binary. "); @@ -2995,6 +3009,17 @@ std::string cmTarget::GetPDBName(const char* config) } //---------------------------------------------------------------------------- +bool cmTarget::HasSOName(const char* config) +{ + // soname is supported only for shared libraries and modules, + // and then only when the platform supports an soname flag. + return ((this->GetType() == cmTarget::SHARED_LIBRARY || + this->GetType() == cmTarget::MODULE_LIBRARY) && + !this->GetPropertyAsBool("NO_SONAME") && + this->Makefile->GetSONameFlag(this->GetLinkerLanguage(config))); +} + +//---------------------------------------------------------------------------- std::string cmTarget::GetSOName(const char* config) { if(this->IsImported()) @@ -3327,22 +3352,10 @@ void cmTarget::GetLibraryNames(std::string& name, return; } - // Construct the name of the soname flag variable for this language. - const char* ll = this->GetLinkerLanguage(config); - std::string sonameFlag = "CMAKE_SHARED_LIBRARY_SONAME"; - if(ll) - { - sonameFlag += "_"; - sonameFlag += ll; - } - sonameFlag += "_FLAG"; - // Check for library version properties. const char* version = this->GetProperty("VERSION"); const char* soversion = this->GetProperty("SOVERSION"); - if((this->GetType() != cmTarget::SHARED_LIBRARY && - this->GetType() != cmTarget::MODULE_LIBRARY) || - !this->Makefile->GetDefinition(sonameFlag.c_str()) || + if(!this->HasSOName(config) || this->IsFrameworkOnApple()) { // Versioning is supported only for shared libraries and modules, diff --git a/Source/cmTarget.h b/Source/cmTarget.h index d41c827..d70cacd 100644 --- a/Source/cmTarget.h +++ b/Source/cmTarget.h @@ -347,6 +347,9 @@ public: /** Get the name of the pdb file for the target. */ std::string GetPDBName(const char* config=0); + /** Whether this library has soname enabled and platform supports it. */ + bool HasSOName(const char* config); + /** Get the soname of the target. Allowed only for a shared library. */ std::string GetSOName(const char* config); diff --git a/Source/cmTargetLinkLibrariesCommand.h b/Source/cmTargetLinkLibrariesCommand.h index be866c3..63114d2 100644 --- a/Source/cmTargetLinkLibrariesCommand.h +++ b/Source/cmTargetLinkLibrariesCommand.h @@ -64,7 +64,8 @@ public: "Specify libraries or flags to use when linking a given target. " "The named <target> must have been created in the current directory " "by a command such as add_executable or add_library. " - "The remaining arguments specify library names or flags." + "The remaining arguments specify library names or flags. " + "Repeated calls for the same <target> append items in the order called." "\n" "If a library name matches that of another target in the project " "a dependency will automatically be added in the build system to make " diff --git a/Source/cmVisualStudio10TargetGenerator.cxx b/Source/cmVisualStudio10TargetGenerator.cxx index 6caaad1..9a97ab0 100644 --- a/Source/cmVisualStudio10TargetGenerator.cxx +++ b/Source/cmVisualStudio10TargetGenerator.cxx @@ -459,8 +459,9 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile* source, command) { std::string sourcePath = source->GetFullPath(); - // the rule file seems to need to exist for vs10 - if (source->GetExtension() == "rule") + // VS 10 will always rebuild a custom command attached to a .rule + // file that doesn't exist so create the file explicitly. + if (source->GetPropertyAsBool("__CMAKE_RULE")) { if(!cmSystemTools::FileExists(sourcePath.c_str())) { @@ -490,14 +491,9 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile* source, std::vector<std::string> *configs = static_cast<cmGlobalVisualStudio7Generator *> (this->GlobalGenerator)->GetConfigurations(); - this->WriteString("<CustomBuild Include=\"", 2); - // custom command have to use relative paths or they do not - // show up in the GUI - std::string path = cmSystemTools::RelativePath( - this->Makefile->GetCurrentOutputDirectory(), - sourcePath.c_str()); - this->ConvertToWindowsSlash(path); - (*this->BuildFileStream ) << path << "\">\n"; + + this->WriteSource("CustomBuild", source, ">\n"); + for(std::vector<std::string>::iterator i = configs->begin(); i != configs->end(); ++i) { @@ -540,6 +536,18 @@ cmVisualStudio10TargetGenerator::WriteCustomRule(cmSourceFile* source, this->WriteString("</CustomBuild>\n", 2); } +std::string +cmVisualStudio10TargetGenerator::ConvertPath(std::string const& path, + bool forceRelative) +{ + return forceRelative + ? cmSystemTools::RelativePath( + this->Makefile->GetCurrentOutputDirectory(), path.c_str()) + : this->LocalGenerator->Convert(path.c_str(), + cmLocalGenerator::START_OUTPUT, + cmLocalGenerator::UNCHANGED); +} + void cmVisualStudio10TargetGenerator::ConvertToWindowsSlash(std::string& s) { // first convert all of the slashes @@ -558,13 +566,6 @@ void cmVisualStudio10TargetGenerator::WriteGroups() std::vector<cmSourceFile*> classes = this->Target->GetSourceFiles(); std::set<cmSourceGroup*> groupsUsed; - std::vector<cmSourceFile*> clCompile; - std::vector<cmSourceFile*> customBuild; - std::vector<cmSourceFile*> none; - std::vector<cmSourceFile*> headers; - std::vector<cmSourceFile*> idls; - std::vector<cmSourceFile*> resource; - for(std::vector<cmSourceFile*>::const_iterator s = classes.begin(); s != classes.end(); s++) { @@ -573,40 +574,6 @@ void cmVisualStudio10TargetGenerator::WriteGroups() cmSourceGroup& sourceGroup = this->Makefile->FindSourceGroup(source.c_str(), sourceGroups); groupsUsed.insert(&sourceGroup); - const char* lang = sf->GetLanguage(); - bool header = (*s)->GetPropertyAsBool("HEADER_FILE_ONLY") - || this->GlobalGenerator->IgnoreFile - ((*s)->GetExtension().c_str()); - std::string ext = - cmSystemTools::LowerCase((*s)->GetExtension()); - if(!lang) - { - lang = "None"; - } - if(header) - { - headers.push_back(sf); - } - else if(lang[0] == 'C') - { - clCompile.push_back(sf); - } - else if(strcmp(lang, "RC") == 0) - { - resource.push_back(sf); - } - else if(sf->GetCustomCommand()) - { - customBuild.push_back(sf); - } - else if(ext == "idl") - { - idls.push_back(sf); - } - else - { - none.push_back(sf); - } } this->AddMissingSourceGroups(groupsUsed, sourceGroups); @@ -628,11 +595,11 @@ void cmVisualStudio10TargetGenerator::WriteGroups() "xmlns=\"http://schemas.microsoft.com/" "developer/msbuild/2003\">\n", 0); - this->WriteGroupSources("ClCompile", clCompile, sourceGroups); - this->WriteGroupSources("ClInclude", headers, sourceGroups); - this->WriteGroupSources("ResourceCompile", resource, sourceGroups); - this->WriteGroupSources("Midl", idls, sourceGroups); - this->WriteGroupSources("CustomBuild", customBuild, sourceGroups); + for(ToolSourceMap::const_iterator ti = this->Tools.begin(); + ti != this->Tools.end(); ++ti) + { + this->WriteGroupSources(ti->first.c_str(), ti->second, sourceGroups); + } // Add object library contents as external objects. std::vector<std::string> objs; @@ -689,7 +656,6 @@ void cmVisualStudio10TargetGenerator::WriteGroups() this->WriteString("</Filter>\n", 2); } this->WriteString("</ItemGroup>\n", 1); - this->WriteGroupSources("None", none, sourceGroups); this->WriteString("</Project>\n", 0); // restore stream pointer this->BuildFileStream = save; @@ -749,32 +715,20 @@ cmVisualStudio10TargetGenerator::AddMissingSourceGroups( void cmVisualStudio10TargetGenerator:: WriteGroupSources(const char* name, - std::vector<cmSourceFile*> const& sources, + ToolSources const& sources, std::vector<cmSourceGroup>& sourceGroups) { this->WriteString("<ItemGroup>\n", 1); - for(std::vector<cmSourceFile*>::const_iterator s = sources.begin(); + for(ToolSources::const_iterator s = sources.begin(); s != sources.end(); ++s) { - cmSourceFile* sf = *s; - if(sf->GetExtension() == "obj") - { - continue; - } + cmSourceFile* sf = s->SourceFile; std::string const& source = sf->GetFullPath(); cmSourceGroup& sourceGroup = this->Makefile->FindSourceGroup(source.c_str(), sourceGroups); const char* filter = sourceGroup.GetFullName(); this->WriteString("<", 2); - std::string path = source; - // custom command sources must use relative paths or they will - // not show up in the GUI. - if(sf->GetCustomCommand()) - { - path = cmSystemTools::RelativePath( - this->Makefile->GetCurrentOutputDirectory(), - source.c_str()); - } + std::string path = this->ConvertPath(source, s->RelativePath); this->ConvertToWindowsSlash(path); (*this->BuildFileStream) << name << " Include=\"" << path; @@ -795,15 +749,47 @@ WriteGroupSources(const char* name, } void cmVisualStudio10TargetGenerator::WriteSource( - const char* tool, cmSourceFile* sf, bool end) + const char* tool, cmSourceFile* sf, const char* end) { - std::string sourceFile = sf->GetFullPath(); - // do not use a relative path here because it means that you - // can not use as long a path to the file. + // Visual Studio tools append relative paths to the current dir, as in: + // + // c:\path\to\current\dir\..\..\..\relative\path\to\source.c + // + // and fail if this exceeds the maximum allowed path length. Our path + // conversion uses full paths outside the build tree to allow deeper trees. + bool forceRelative = false; + std::string sourceFile = this->ConvertPath(sf->GetFullPath(), false); + if(this->LocalGenerator->GetVersion() == cmLocalVisualStudioGenerator::VS10 + && cmSystemTools::FileIsFullPath(sourceFile.c_str())) + { + // Normal path conversion resulted in a full path. VS 10 (but not 11) + // refuses to show the property page in the IDE for a source file with a + // full path (not starting in a '.' or '/' AFAICT). CMake <= 2.8.4 used a + // relative path but to allow deeper build trees CMake 2.8.[5678] used a + // full path except for custom commands. Custom commands do not work + // without a relative path, but they do not seem to be involved in tools + // with the above behavior. For other sources we now use a relative path + // when the combined path will not be too long so property pages appear. + std::string sourceRel = this->ConvertPath(sf->GetFullPath(), true); + size_t const maxLen = 250; + if(sf->GetCustomCommand() || + ((strlen(this->Makefile->GetCurrentOutputDirectory()) + 1 + + sourceRel.length()) <= maxLen)) + { + forceRelative = true; + sourceFile = sourceRel; + } + else + { + this->GlobalGenerator->PathTooLong(this->Target, sf, sourceRel); + } + } this->ConvertToWindowsSlash(sourceFile); this->WriteString("<", 2); (*this->BuildFileStream ) << tool << - " Include=\"" << sourceFile << (end? "\" />\n" : "\" "); + " Include=\"" << sourceFile << "\"" << (end? end : " />\n"); + ToolSource toolSource = {sf, forceRelative}; + this->Tools[tool].push_back(toolSource); } void cmVisualStudio10TargetGenerator::WriteSources( @@ -835,7 +821,7 @@ void cmVisualStudio10TargetGenerator::WriteAllSources() bool cl = strcmp(lang, "C") == 0 || strcmp(lang, "CXX") == 0; bool rc = strcmp(lang, "RC") == 0; const char* tool = cl? "ClCompile" : (rc? "ResourceCompile" : "None"); - this->WriteSource(tool, *si, false); + this->WriteSource(tool, *si, " "); // ouput any flags specific to this source file if(cl && this->OutputSourceSpecificFlags(*si)) { diff --git a/Source/cmVisualStudio10TargetGenerator.h b/Source/cmVisualStudio10TargetGenerator.h index 20a443b..2d5ec2a 100644 --- a/Source/cmVisualStudio10TargetGenerator.h +++ b/Source/cmVisualStudio10TargetGenerator.h @@ -43,11 +43,19 @@ public: ); private: + struct ToolSource + { + cmSourceFile* SourceFile; + bool RelativePath; + }; + struct ToolSources: public std::vector<ToolSource> {}; + + std::string ConvertPath(std::string const& path, bool forceRelative); void ConvertToWindowsSlash(std::string& s); void WriteString(const char* line, int indentLevel); void WriteProjectConfigurations(); void WriteProjectConfigurationValues(); - void WriteSource(const char* tool, cmSourceFile* sf, bool end = true); + void WriteSource(const char* tool, cmSourceFile* sf, const char* end = 0); void WriteSources(const char* tool, std::vector<cmSourceFile*> const&); void WriteAllSources(); void WriteDotNetReferences(); @@ -77,8 +85,7 @@ private: void WriteEvents(std::string const& configName); void WriteEvent(const char* name, std::vector<cmCustomCommand> & commands, std::string const& configName); - void WriteGroupSources(const char* name, - std::vector<cmSourceFile*> const& sources, + void WriteGroupSources(const char* name, ToolSources const& sources, std::vector<cmSourceGroup>& ); void AddMissingSourceGroups(std::set<cmSourceGroup*>& groupsUsed, const std::vector<cmSourceGroup>& allGroups); @@ -99,6 +106,9 @@ private: cmGeneratedFileStream* BuildFileStream; cmLocalVisualStudio7Generator* LocalGenerator; std::set<cmSourceFile*> SourcesVisited; + + typedef std::map<cmStdString, ToolSources> ToolSourceMap; + ToolSourceMap Tools; }; #endif diff --git a/Source/cmake.cxx b/Source/cmake.cxx index 846aef5..2ffff42 100644 --- a/Source/cmake.cxx +++ b/Source/cmake.cxx @@ -70,6 +70,7 @@ # include "cmGlobalVisualStudio10Win64Generator.h" # include "cmGlobalVisualStudio11Generator.h" # include "cmGlobalVisualStudio11Win64Generator.h" +# include "cmGlobalVisualStudio11ARMGenerator.h" # include "cmGlobalVisualStudio8Win64Generator.h" # include "cmGlobalBorlandMakefileGenerator.h" # include "cmGlobalNMakeMakefileGenerator.h" @@ -2569,6 +2570,8 @@ void cmake::AddDefaultGenerators() &cmGlobalVisualStudio11Generator::New; this->Generators[cmGlobalVisualStudio11Win64Generator::GetActualName()] = &cmGlobalVisualStudio11Win64Generator::New; + this->Generators[cmGlobalVisualStudio11ARMGenerator::GetActualName()] = + &cmGlobalVisualStudio11ARMGenerator::New; this->Generators[cmGlobalVisualStudio71Generator::GetActualName()] = &cmGlobalVisualStudio71Generator::New; this->Generators[cmGlobalVisualStudio8Generator::GetActualName()] = diff --git a/Source/kwsys/CMakeLists.txt b/Source/kwsys/CMakeLists.txt index 0ef4e28..a132357 100644 --- a/Source/kwsys/CMakeLists.txt +++ b/Source/kwsys/CMakeLists.txt @@ -123,7 +123,6 @@ IF(KWSYS_STANDALONE OR CMake_SOURCE_DIR) SET(KWSYS_USE_FundamentalType 1) SET(KWSYS_USE_Terminal 1) SET(KWSYS_USE_IOStream 1) - SET(KWSYS_USE_DateStamp 1) SET(KWSYS_USE_String 1) SET(KWSYS_USE_SystemInformation 1) SET(KWSYS_USE_CPU 1) @@ -142,7 +141,6 @@ IF(KWSYS_USE_Process) SET(KWSYS_USE_System 1) ENDIF(KWSYS_USE_Process) IF(KWSYS_USE_SystemInformation) - SET(KWSYS_USE_FundamentalType 1) SET(KWSYS_USE_Process 1) ENDIF(KWSYS_USE_SystemInformation) @@ -414,6 +412,39 @@ IF(UNIX) "Checking whether struct stat has st_mtim member" DIRECT) ENDIF(UNIX) +# Check existence and uniqueness of long long and __int64. +KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_LONG_LONG + "Checking whether C++ compiler has 'long long'" DIRECT) +KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS___INT64 + "Checking whether C++ compiler has '__int64'" DIRECT) +IF(KWSYS_CXX_HAS___INT64) + KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_AND___INT64 + "Checking whether long and __int64 are the same type" DIRECT) + IF(KWSYS_CXX_HAS_LONG_LONG) + KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_LONG_AND___INT64 + "Checking whether long long and __int64 are the same type" DIRECT) + ENDIF() +ENDIF() + +# Enable the "long long" type if it is available. It is standard in +# C99 and C++03 but not in earlier standards. +IF(KWSYS_CXX_HAS_LONG_LONG) + SET(KWSYS_USE_LONG_LONG 1) +ELSE() + SET(KWSYS_USE_LONG_LONG 0) +ENDIF() + +# Enable the "__int64" type if it is available and unique. It is not +# standard. +SET(KWSYS_USE___INT64 0) +IF(KWSYS_CXX_HAS___INT64) + IF(NOT KWSYS_CXX_SAME_LONG_AND___INT64) + IF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64) + SET(KWSYS_USE___INT64 1) + ENDIF() + ENDIF() +ENDIF() + IF(KWSYS_USE_FundamentalType) # Look for type size helper macros. KWSYS_PLATFORM_INFO_TEST(C KWSYS_C_TYPE_MACROS @@ -464,34 +495,6 @@ IF(KWSYS_USE_FundamentalType) ENDIF() ENDFOREACH() - # Check uniqueness of types. - IF(KWSYS_SIZEOF___INT64) - KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_AND___INT64 - "Checking whether long and __int64 are the same type" DIRECT) - IF(KWSYS_SIZEOF_LONG_LONG) - KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_SAME_LONG_LONG_AND___INT64 - "Checking whether long long and __int64 are the same type" DIRECT) - ENDIF(KWSYS_SIZEOF_LONG_LONG) - ENDIF(KWSYS_SIZEOF___INT64) - - # Enable the "long long" type if it is available. It is standard in - # C99 and C++03 but not in earlier standards. - IF(KWSYS_SIZEOF_LONG_LONG) - SET(KWSYS_USE_LONG_LONG 1) - ELSE(KWSYS_SIZEOF_LONG_LONG) - SET(KWSYS_USE_LONG_LONG 0) - ENDIF(KWSYS_SIZEOF_LONG_LONG) - - # Enable the "__int64" type if it is available and unique. It is not - # standard. - SET(KWSYS_USE___INT64 0) - IF(KWSYS_SIZEOF___INT64) - IF(NOT KWSYS_CXX_SAME_LONG_AND___INT64) - IF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64) - SET(KWSYS_USE___INT64 1) - ENDIF(NOT KWSYS_CXX_SAME_LONG_LONG_AND___INT64) - ENDIF(NOT KWSYS_CXX_SAME_LONG_AND___INT64) - ENDIF(KWSYS_SIZEOF___INT64) IF(KWSYS_USE___INT64) KWSYS_PLATFORM_CXX_TEST(KWSYS_CAN_CONVERT_UI64_TO_DOUBLE "Checking whether unsigned __int64 can convert to double" DIRECT) @@ -506,8 +509,6 @@ ENDIF(KWSYS_USE_FundamentalType) IF(KWSYS_USE_IOStream) # Determine whether iostreams support long long. - KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_LONG_LONG - "Checking whether C++ compiler has 'long long'" DIRECT) IF(KWSYS_CXX_HAS_LONG_LONG) SET(KWSYS_PLATFORM_CXX_TEST_DEFINES -DKWSYS_IOS_USE_ANSI=${KWSYS_IOS_USE_ANSI} @@ -553,11 +554,22 @@ SET_SOURCE_FILES_PROPERTIES(ProcessUNIX.c System.c PROPERTIES COMPILE_FLAGS "-DKWSYS_C_HAS_PTRDIFF_T=${KWSYS_C_HAS_PTRDIFF_T} -DKWSYS_C_HAS_SSIZE_T=${KWSYS_C_HAS_SSIZE_T}" ) -IF(KWSYS_DO_NOT_CLEAN_PUTENV) - # Disable cleanup of putenv memory for issues with GCOV. +IF(KWSYS_USE_SystemTools) + KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_SETENV + "Checking whether CXX compiler has setenv" DIRECT) + KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_UNSETENV + "Checking whether CXX compiler has unsetenv" DIRECT) + KWSYS_PLATFORM_CXX_TEST(KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H + "Checking whether CXX compiler has environ in stdlib.h" DIRECT) SET_SOURCE_FILES_PROPERTIES(SystemTools.cxx PROPERTIES - COMPILE_FLAGS -DKWSYS_DO_NOT_CLEAN_PUTENV=1) -ENDIF(KWSYS_DO_NOT_CLEAN_PUTENV) + COMPILE_FLAGS "-DKWSYS_CXX_HAS_SETENV=${KWSYS_CXX_HAS_SETENV} -DKWSYS_CXX_HAS_UNSETENV=${KWSYS_CXX_HAS_UNSETENV} -DKWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=${KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H}") +ENDIF() + +IF(KWSYS_USE_SystemInformation) + SET_PROPERTY(SOURCE SystemInformation.cxx PROPERTY + COMPILE_DEFINITIONS KWSYS_USE_LONG_LONG=${KWSYS_USE_LONG_LONG} + KWSYS_USE___INT64=${KWSYS_USE___INT64}) +ENDIF() #----------------------------------------------------------------------------- # Choose a directory for the generated headers. @@ -690,7 +702,7 @@ ENDFOREACH(cpp) # Add selected C components. FOREACH(c - Process Base64 FundamentalType MD5 Terminal System DateStamp String CPU + Process Base64 FundamentalType MD5 Terminal System String CPU ) IF(KWSYS_USE_${c}) # Use the corresponding header file. diff --git a/Source/kwsys/DateStamp.h.in b/Source/kwsys/DateStamp.h.in deleted file mode 100644 index c3d0099..0000000 --- a/Source/kwsys/DateStamp.h.in +++ /dev/null @@ -1,42 +0,0 @@ -/*============================================================================ - KWSys - Kitware System Library - Copyright 2000-2009 Kitware, Inc., Insight Software Consortium - - Distributed under the OSI-approved BSD License (the "License"); - see accompanying file Copyright.txt for details. - - This software is distributed WITHOUT ANY WARRANTY; without even the - implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. - See the License for more information. -============================================================================*/ -#ifndef @KWSYS_NAMESPACE@_DateStamp_h -#define @KWSYS_NAMESPACE@_DateStamp_h - -/** Version date integer year. The format is CCYY. */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_YEAR @KWSYS_DATE_STAMP_YEAR@ - -/** Version date integer month. The format is MM. */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_MONTH @KWSYS_DATE_STAMP_MONTH@ - -/** Version date integer day. The format is DD. */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_DAY @KWSYS_DATE_STAMP_DAY@ - -/** Version date full integer. The format is CCYYMMDD. */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_FULL @KWSYS_DATE_STAMP_YEAR@@KWSYS_DATE_STAMP_MONTH@@KWSYS_DATE_STAMP_DAY@ - -/** Version date string year. The format is "CCYY". */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_STRING_YEAR "@KWSYS_DATE_STAMP_YEAR@" - -/** Version date string month. The format is "MM". */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_STRING_MONTH "@KWSYS_DATE_STAMP_MONTH@" - -/** Version date string day. The format is "DD". */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_STRING_DAY "@KWSYS_DATE_STAMP_DAY@" - -/** Version date full string. The format is "CCYYMMDD". */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_STRING_FULL "@KWSYS_DATE_STAMP_YEAR@@KWSYS_DATE_STAMP_MONTH@@KWSYS_DATE_STAMP_DAY@" - -/** Version date formatted string. The format is "CCYY-MM-DD". */ -#define @KWSYS_NAMESPACE@_DATE_STAMP_STRING "@KWSYS_DATE_STAMP_YEAR@-@KWSYS_DATE_STAMP_MONTH@-@KWSYS_DATE_STAMP_DAY@" - -#endif diff --git a/Source/kwsys/SystemInformation.cxx b/Source/kwsys/SystemInformation.cxx index d49c0d7..e1ee873 100644 --- a/Source/kwsys/SystemInformation.cxx +++ b/Source/kwsys/SystemInformation.cxx @@ -26,7 +26,6 @@ // http://msdn.microsoft.com/en-us/library/ms683219(VS.85).aspx #include "kwsysPrivate.h" -#include KWSYS_HEADER(FundamentalType.h) #include KWSYS_HEADER(stl/string) #include KWSYS_HEADER(stl/vector) #include KWSYS_HEADER(ios/iosfwd) @@ -38,7 +37,6 @@ // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 -# include "FundamentalType.h.in" # include "SystemInformation.hxx.in" # include "Process.h.in" # include "Configure.hxx.in" diff --git a/Source/kwsys/SystemTools.cxx b/Source/kwsys/SystemTools.cxx index 4d83293..8ab580f 100644 --- a/Source/kwsys/SystemTools.cxx +++ b/Source/kwsys/SystemTools.cxx @@ -25,6 +25,8 @@ #include KWSYS_HEADER(ios/fstream) #include KWSYS_HEADER(ios/sstream) +#include KWSYS_HEADER(stl/set) + // Work-around CMake dependency scanning limitation. This must // duplicate the above list of headers. #if 0 @@ -78,6 +80,14 @@ # undef _WIN32 #endif +#if !KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H +# if defined(_WIN32) +extern __declspec(dllimport) char **environ; +# else +extern char **environ; +# endif +#endif + #ifdef __CYGWIN__ extern "C" void cygwin_conv_to_win32_path(const char *path, char *win32_path); #endif @@ -371,38 +381,224 @@ bool SystemTools::GetEnv(const char* key, kwsys_stl::string& result) } } -#ifdef __INTEL_COMPILER -#pragma warning disable 444 +//---------------------------------------------------------------------------- + +#if defined(__CYGWIN__) || defined(__GLIBC__) +# define KWSYS_PUTENV_NAME /* putenv("A") removes A. */ +#elif defined(_WIN32) +# define KWSYS_PUTENV_EMPTY /* putenv("A=") removes A. */ #endif -class kwsysDeletingCharVector : public kwsys_stl::vector<char*> +#if KWSYS_CXX_HAS_UNSETENV +/* unsetenv("A") removes A from the environment. + On older platforms it returns void instead of int. */ +static int kwsysUnPutEnv(const char* env) { -public: - ~kwsysDeletingCharVector(); -}; + if(const char* eq = strchr(env, '=')) + { + std::string name(env, eq-env); + unsetenv(name.c_str()); + } + else + { + unsetenv(env); + } + return 0; +} -kwsysDeletingCharVector::~kwsysDeletingCharVector() +#elif defined(KWSYS_PUTENV_EMPTY) || defined(KWSYS_PUTENV_NAME) +/* putenv("A=") or putenv("A") removes A from the environment. */ +static int kwsysUnPutEnv(const char* env) { -#ifndef KWSYS_DO_NOT_CLEAN_PUTENV - for(kwsys_stl::vector<char*>::iterator i = this->begin(); - i != this->end(); ++i) + int err = 0; + const char* eq = strchr(env, '='); + size_t const len = eq? (size_t)(eq-env) : strlen(env); +# ifdef KWSYS_PUTENV_EMPTY + size_t const sz = len + 2; +# else + size_t const sz = len + 1; +# endif + char local_buf[256]; + char* buf = sz > sizeof(local_buf) ? (char*)malloc(sz) : local_buf; + if(!buf) + { + return -1; + } + strncpy(buf, env, len); +# ifdef KWSYS_PUTENV_EMPTY + buf[len] = '='; + buf[len+1] = 0; + if(putenv(buf) < 0) + { + err = errno; + } +# else + buf[len] = 0; + if(putenv(buf) < 0 && errno != EINVAL) + { + err = errno; + } +# endif + if(buf != local_buf) + { + free(buf); + } + if(err) + { + errno = err; + return -1; + } + return 0; +} + +#else +/* Manipulate the "environ" global directly. */ +static int kwsysUnPutEnv(const char* env) +{ + const char* eq = strchr(env, '='); + size_t const len = eq? (size_t)(eq-env) : strlen(env); + int in = 0; + int out = 0; + while(environ[in]) + { + if(strlen(environ[in]) > len && + environ[in][len] == '=' && + strncmp(env, environ[in], len) == 0) + { + ++in; + } + else + { + environ[out++] = environ[in++]; + } + } + while(out < in) { - delete []*i; + environ[out++] = 0; } + return 0; +} #endif + +//---------------------------------------------------------------------------- + +#if KWSYS_CXX_HAS_SETENV + +/* setenv("A", "B", 1) will set A=B in the environment and makes its + own copies of the strings. */ +bool SystemTools::PutEnv(const char* env) +{ + if(const char* eq = strchr(env, '=')) + { + std::string name(env, eq-env); + return setenv(name.c_str(), eq+1, 1) == 0; + } + else + { + return kwsysUnPutEnv(env) == 0; + } } -bool SystemTools::PutEnv(const char* value) + +bool SystemTools::UnPutEnv(const char* env) { - static kwsysDeletingCharVector localEnvironment; - char* envVar = new char[strlen(value)+1]; - strcpy(envVar, value); - int ret = putenv(envVar); - // save the pointer in the static vector so that it can - // be deleted on exit - localEnvironment.push_back(envVar); - return ret == 0; + return kwsysUnPutEnv(env) == 0; } +#else + +/* putenv("A=B") will set A=B in the environment. Most putenv implementations + put their argument directly in the environment. They never free the memory + on program exit. Keep an active set of pointers to memory we allocate and + pass to putenv, one per environment key. At program exit remove any + environment values that may still reference memory we allocated. Then free + the memory. This will not affect any environment values we never set. */ + +# ifdef __INTEL_COMPILER +# pragma warning disable 444 /* base has non-virtual destructor */ +# endif + +/* Order by environment key only (VAR from VAR=VALUE). */ +struct kwsysEnvCompare +{ + bool operator() (const char* l, const char* r) const + { + const char* leq = strchr(l, '='); + const char* req = strchr(r, '='); + size_t llen = leq? (leq-l) : strlen(l); + size_t rlen = req? (req-r) : strlen(r); + if(llen == rlen) + { + return strncmp(l,r,llen) < 0; + } + else + { + return strcmp(l,r) < 0; + } + } +}; + +class kwsysEnv: public kwsys_stl::set<const char*, kwsysEnvCompare> +{ + class Free + { + const char* Env; + public: + Free(const char* env): Env(env) {} + ~Free() { free(const_cast<char*>(this->Env)); } + }; +public: + typedef kwsys_stl::set<const char*, kwsysEnvCompare> derived; + ~kwsysEnv() + { + for(derived::iterator i = this->begin(); i != this->end(); ++i) + { + kwsysUnPutEnv(*i); + free(const_cast<char*>(*i)); + } + } + const char* Release(const char* env) + { + const char* old = 0; + derived::iterator i = this->find(env); + if(i != this->end()) + { + old = *i; + this->erase(i); + } + return old; + } + bool Put(const char* env) + { + Free oldEnv(this->Release(env)); + static_cast<void>(oldEnv); + char* newEnv = strdup(env); + this->insert(newEnv); + return putenv(newEnv) == 0; + } + bool UnPut(const char* env) + { + Free oldEnv(this->Release(env)); + static_cast<void>(oldEnv); + return kwsysUnPutEnv(env) == 0; + } +}; + +static kwsysEnv kwsysEnvInstance; + +bool SystemTools::PutEnv(const char* env) +{ + return kwsysEnvInstance.Put(env); +} + +bool SystemTools::UnPutEnv(const char* env) +{ + return kwsysEnvInstance.UnPut(env); +} + +#endif + +//---------------------------------------------------------------------------- + const char* SystemTools::GetExecutableExtension() { #if defined(_WIN32) || defined(__CYGWIN__) || defined(__VMS) diff --git a/Source/kwsys/SystemTools.hxx.in b/Source/kwsys/SystemTools.hxx.in index 04f1978..5171125 100644 --- a/Source/kwsys/SystemTools.hxx.in +++ b/Source/kwsys/SystemTools.hxx.in @@ -749,7 +749,11 @@ public: /** Put a string into the environment of the form var=value */ - static bool PutEnv(const char* value); + static bool PutEnv(const char* env); + + /** Remove a string from the environment. + Input is of the form "var" or "var=value" (value is ignored). */ + static bool UnPutEnv(const char* env); /** * Get current working directory CWD diff --git a/Source/kwsys/hash_fun.hxx.in b/Source/kwsys/hash_fun.hxx.in index 8c5eb6a..6f787dd 100644 --- a/Source/kwsys/hash_fun.hxx.in +++ b/Source/kwsys/hash_fun.hxx.in @@ -38,7 +38,6 @@ #define @KWSYS_NAMESPACE@_hash_fun_hxx #include <@KWSYS_NAMESPACE@/Configure.hxx> -#include <@KWSYS_NAMESPACE@/FundamentalType.h> #include <@KWSYS_NAMESPACE@/cstddef> // size_t #include <@KWSYS_NAMESPACE@/stl/string> // string @@ -124,7 +123,7 @@ struct hash<unsigned long> { }; // use long long or __int64 -#if @KWSYS_NAMESPACE@_USE_LONG_LONG +#if @KWSYS_USE_LONG_LONG@ @KWSYS_NAMESPACE@_CXX_DEFINE_SPECIALIZATION struct hash<long long> { size_t operator()(long long __x) const { return __x; } @@ -134,7 +133,7 @@ struct hash<long long> { struct hash<unsigned long long> { size_t operator()(unsigned long long __x) const { return __x; } }; -#elif @KWSYS_NAMESPACE@_USE___INT64 +#elif @KWSYS_USE___INT64@ @KWSYS_NAMESPACE@_CXX_DEFINE_SPECIALIZATION struct hash<__int64> { size_t operator()(__int64 __x) const { return __x; } diff --git a/Source/kwsys/kwsysDateStamp.cmake b/Source/kwsys/kwsysDateStamp.cmake deleted file mode 100644 index f157607..0000000 --- a/Source/kwsys/kwsysDateStamp.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# Do not edit! Generated by kwsysDateStamp.py -#============================================================================= -# KWSys - Kitware System Library -# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= - -# KWSys version date year component. Format is CCYY. -SET(KWSYS_DATE_STAMP_YEAR 2012) - -# KWSys version date month component. Format is MM. -SET(KWSYS_DATE_STAMP_MONTH 04) - -# KWSys version date day component. Format is DD. -SET(KWSYS_DATE_STAMP_DAY 18) diff --git a/Source/kwsys/kwsysDateStamp.py b/Source/kwsys/kwsysDateStamp.py deleted file mode 100755 index bd2e49a..0000000 --- a/Source/kwsys/kwsysDateStamp.py +++ /dev/null @@ -1,54 +0,0 @@ -#!/usr/bin/python -#============================================================================= -# KWSys - Kitware System Library -# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= - -import sys,os -import time - -# Get the path to the directory containing this script. -if __name__ == '__main__': - selfdir = os.path.abspath(sys.path[0] or os.curdir) -else: - selfdir = os.path.abspath(os.path.dirname(__file__)) - -# Open the CMake code file. -fname = os.path.join(selfdir, 'kwsysDateStamp.cmake') -fout = open(fname, 'w'); - -# Get the current time. -ct = time.localtime() - -# Write the CMake code describing the date. -fout.write("""# Do not edit! Generated by kwsysDateStamp.py -#============================================================================= -# KWSys - Kitware System Library -# Copyright 2000-2009 Kitware, Inc., Insight Software Consortium -# -# Distributed under the OSI-approved BSD License (the "License"); -# see accompanying file Copyright.txt for details. -# -# This software is distributed WITHOUT ANY WARRANTY; without even the -# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. -# See the License for more information. -#============================================================================= - -# KWSys version date year component. Format is CCYY. -SET(KWSYS_DATE_STAMP_YEAR %04u) - -# KWSys version date month component. Format is MM. -SET(KWSYS_DATE_STAMP_MONTH %02u) - -# KWSys version date day component. Format is DD. -SET(KWSYS_DATE_STAMP_DAY %02u) -""" % (ct.tm_year, ct.tm_mon, ct.tm_mday)) - -fout.close() diff --git a/Source/kwsys/kwsysPlatformTestsCXX.cxx b/Source/kwsys/kwsysPlatformTestsCXX.cxx index 903be9b..7b73d06 100644 --- a/Source/kwsys/kwsysPlatformTestsCXX.cxx +++ b/Source/kwsys/kwsysPlatformTestsCXX.cxx @@ -122,6 +122,15 @@ int main() } #endif +#ifdef TEST_KWSYS_CXX_HAS___INT64 +__int64 f(__int64 n) { return n; } +int main() +{ + __int64 n = 0; + return static_cast<int>(f(n)); +} +#endif + #ifdef TEST_KWSYS_CXX_HAS_NULL_TEMPLATE_ARGS template <class T> class A; template <class T> int f(A<T>&); @@ -393,6 +402,32 @@ int main(int, char **argv) } #endif +#ifdef TEST_KWSYS_CXX_HAS_SETENV +#include <stdlib.h> +int main() +{ + return setenv("A", "B", 1); +} +#endif + +#ifdef TEST_KWSYS_CXX_HAS_UNSETENV +#include <stdlib.h> +int main() +{ + unsetenv("A"); + return 0; +} +#endif + +#ifdef TEST_KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H +#include <stdlib.h> +int main() +{ + char* e = environ[0]; + return e? 0:1; +} +#endif + #ifdef TEST_KWSYS_CXX_TYPE_INFO /* Collect fundamental type information and save it to a CMake script. */ diff --git a/Source/kwsys/testSystemTools.cxx b/Source/kwsys/testSystemTools.cxx index c0e74af..3ac0cb3 100644 --- a/Source/kwsys/testSystemTools.cxx +++ b/Source/kwsys/testSystemTools.cxx @@ -328,6 +328,58 @@ bool CheckStringOperations() } //---------------------------------------------------------------------------- + +bool CheckPutEnv(const char* env, const char* name, const char* value) +{ + if(!kwsys::SystemTools::PutEnv(env)) + { + kwsys_ios::cerr << "PutEnv(\"" << env + << "\") failed!" << kwsys_ios::endl; + return false; + } + const char* v = kwsys::SystemTools::GetEnv(name); + v = v? v : "(null)"; + if(strcmp(v, value) != 0) + { + kwsys_ios::cerr << "GetEnv(\"" << name << "\") returned \"" + << v << "\", not \"" << value << "\"!" << kwsys_ios::endl; + return false; + } + return true; +} + +bool CheckUnPutEnv(const char* env, const char* name) +{ + if(!kwsys::SystemTools::UnPutEnv(env)) + { + kwsys_ios::cerr << "UnPutEnv(\"" << env << "\") failed!" + << kwsys_ios::endl; + return false; + } + if(const char* v = kwsys::SystemTools::GetEnv(name)) + { + kwsys_ios::cerr << "GetEnv(\"" << name << "\") returned \"" + << v << "\", not (null)!" << kwsys_ios::endl; + return false; + } + return true; +} + +bool CheckEnvironmentOperations() +{ + bool res = true; + res &= CheckPutEnv("A=B", "A", "B"); + res &= CheckPutEnv("B=C", "B", "C"); + res &= CheckPutEnv("C=D", "C", "D"); + res &= CheckPutEnv("D=E", "D", "E"); + res &= CheckUnPutEnv("A", "A"); + res &= CheckUnPutEnv("B=", "B"); + res &= CheckUnPutEnv("C=D", "C"); + /* Leave "D=E" in environment so a memory checker can test for leaks. */ + return res; +} + +//---------------------------------------------------------------------------- int testSystemTools(int, char*[]) { bool res = true; @@ -356,5 +408,7 @@ int testSystemTools(int, char*[]) res &= CheckStringOperations(); + res &= CheckEnvironmentOperations(); + return res ? 0 : 1; } diff --git a/Tests/CMakeLists.txt b/Tests/CMakeLists.txt index c0b7cd6..3f5dd2c 100644 --- a/Tests/CMakeLists.txt +++ b/Tests/CMakeLists.txt @@ -1708,6 +1708,42 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/ PASS_REGULAR_EXPRESSION "Reading ctest configuration file: ${CTEST_TEST_ESCAPED_BINARY_DIR}.Tests.CTestTestConfigFileInBuildDir2.CTestConfig.cmake") + # test coverage for mumps + # create a MumpsCoverage dir in the binary tree under Testing to + # avoid the .NoDartCoverage files in the cmake testing tree + configure_file( + "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/DartConfiguration.tcl.in" + "${CMake_BINARY_DIR}/Testing/MumpsCoverage/DartConfiguration.tcl") + configure_file( + "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/gtm_coverage.mcov.in" + "${CMake_BINARY_DIR}/Testing/MumpsCoverage/gtm_coverage.mcov") + file(COPY "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/VistA-FOIA" + DESTINATION "${CMake_BINARY_DIR}/Testing/MumpsCoverage") + add_test(NAME CTestGTMCoverage + COMMAND cmake -E chdir + ${CMake_BINARY_DIR}/Testing/MumpsCoverage + $<TARGET_FILE:ctest> -T Coverage --debug) + set_tests_properties(CTestGTMCoverage PROPERTIES + PASS_REGULAR_EXPRESSION + "Process file.*XINDEX.m.*Total LOC:.*127.*Percentage Coverage: 85.83.*" + ENVIRONMENT COVFILE=) + + configure_file( + "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/DartConfiguration.cache.tcl.in" + "${CMake_BINARY_DIR}/Testing/MumpsCacheCoverage/DartConfiguration.tcl") + configure_file( + "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/cache_coverage.cmcov.in" + "${CMake_BINARY_DIR}/Testing/MumpsCacheCoverage/cache_coverage.cmcov") + file(COPY "${CMake_SOURCE_DIR}/Tests/MumpsCoverage/VistA-FOIA" + DESTINATION "${CMake_BINARY_DIR}/Testing/MumpsCacheCoverage") + add_test(NAME CTestCacheCoverage + COMMAND cmake -E chdir + ${CMake_BINARY_DIR}/Testing/MumpsCacheCoverage + $<TARGET_FILE:ctest> -T Coverage --debug) + set_tests_properties(CTestCacheCoverage PROPERTIES + PASS_REGULAR_EXPRESSION + "Process file.*XINDEX.m.*Total LOC:.*125.*Percentage Coverage: 85.60.*" + ENVIRONMENT COVFILE=) # Use macro, not function so that build can still be driven by CMake 2.4. # After 2.6 is required, this could be a function without the extra 'set' # calls. diff --git a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt index 6604208..fc65e58 100644 --- a/Tests/CMakeOnly/AllFindModules/CMakeLists.txt +++ b/Tests/CMakeOnly/AllFindModules/CMakeLists.txt @@ -71,7 +71,7 @@ endmacro(check_version_string) # reported. foreach(VTEST ALSA ARMADILLO BZIP2 CUPS CURL EXPAT FREETYPE GETTEXT GIT HSPELL - JASPER LIBXML2 LIBXSLT PERL PostgreSQL TIFF ZLIB) + JASPER LIBXML2 LIBXSLT PERL PKG_CONFIG PostgreSQL TIFF ZLIB) check_version_string(${VTEST} ${VTEST}_VERSION_STRING) endforeach(VTEST) @@ -82,4 +82,3 @@ endforeach(VTEST) check_version_string(PYTHONINTERP PYTHON_VERSION_STRING) check_version_string(SUBVERSION Subversion_VERSION_SVN) -check_version_string(PKGCONFIG PKG_CONFIG_VERSION_STRING) diff --git a/Tests/MumpsCoverage/.gitattributes b/Tests/MumpsCoverage/.gitattributes new file mode 100644 index 0000000..b680612 --- /dev/null +++ b/Tests/MumpsCoverage/.gitattributes @@ -0,0 +1,2 @@ +*.cmcov -crlf -whitespace +*.mcov -crlf -whitespace diff --git a/Tests/MumpsCoverage/Accounts_ReceivableTest.cmcov b/Tests/MumpsCoverage/Accounts_ReceivableTest.cmcov new file mode 100644 index 0000000..c3b3342 --- /dev/null +++ b/Tests/MumpsCoverage/Accounts_ReceivableTest.cmcov @@ -0,0 +1,304 @@ +Routine,Line,RtnLine,Code
+DDIOL,1,0,"DDIOL ;SFISC/MKO-THE LOADER ;1:53 PM 12 Sep 1995"
+,2,0," ;;22.0;VA FileMan;;Mar 30, 1999"
+,3,0," ;Per VHA Directive 10-93-142, this routine should not be modified."
+,4,0," ;"
+,5,0,"EN(A,G,FMT) ;Write the text contained in local array A or global array G"
+,6,0," ;If one string passed, use format FMT"
+,7,0," N %,Y,DINAKED"
+,8,0," S DINAKED=$$LGR^%ZOSV"
+,9,0," ;"
+,10,0," S:'$D(A) A="""""
+,11,0," I $G(A)="""",$D(A)<9,$G(FMT)="""",$G(G)'?1""^""1A.7AN,$G(G)'?1""^""1A.7AN1""("".E1"")"" Q"
+,12,0," ;"
+,13,0," G:$D(DDS) SM"
+,14,0," G:$D(DIQUIET) LD"
+,15,0," ;"
+,16,0," N F,I,S"
+,17,0," I $D(A)=1,$G(G)="""" D"
+,18,0," . S F=$S($G(FMT)]"""":FMT,1:""!"")"
+,19,0," . W @F,A"
+,20,0," ;"
+,21,0," E I $D(A)>9 S I=0 F S I=$O(A(I)) Q:I'=+$P(I,""E"") D"
+,22,0," . S F=$G(A(I,""F""),""!"") S:F="""" F=""?0"""
+,23,0," . W @F,$G(A(I))"
+,24,0," ;"
+,25,0," E S I=0 F S I=$O(@G@(I)) Q:I'=+$P(I,""E"") D"
+,26,0," . S S=$G(@G@(I,0),$G(@G@(I)))"
+,27,0," . S F=$G(@G@(I,""F""),""!"") S:F="""" F=""?0"""
+,28,0," . W @F,S"
+,29,0," ;"
+,30,0," I DINAKED]"""" S DINAKED=$S(DINAKED["""""""""""":$O(@DINAKED),1:$D(@DINAKED))"
+,31,0," Q"
+,32,0," ;"
+,33,0,"LD ;Load text into ^TMP"
+,34,0," N I,N,T"
+,35,0," S T=$S($G(DDIOLFLG)[""H"":""DIHELP"",1:""DIMSG"")"
+,36,0," S N=$O(^TMP(T,$J,"" ""),-1)"
+,37,0," ;"
+,38,0," I $D(A)=1,$G(G)="""" D"
+,39,0," . D LD1(A,$S($G(FMT)]"""":FMT,1:""!""))"
+,40,0," ;"
+,41,0," E I $D(A)>9 S I=0 F S I=$O(A(I)) Q:I'=+$P(I,""E"") D"
+,42,0," . D LD1($G(A(I)),$G(A(I,""F""),""!""))"
+,43,0," ;"
+,44,0," E S I=0 F S I=$O(@G@(I)) Q:I'=+$P(I,""E"") D"
+,45,0," . D LD1($G(@G@(I),$G(@G@(I,0))),$G(@G@(I,""F""),""!""))"
+,46,0," ;"
+,47,0," K:'N @T S:N @T=N"
+,48,0," I DINAKED]"""" S DINAKED=$S(DINAKED["""""""""""":$O(@DINAKED),1:$D(@DINAKED))"
+,49,0," Q"
+,50,0," ;"
+,51,0,"LD1(S,F) ;Load string S, with format F"
+,52,0," ;In: N and T"
+,53,0," N C,J,L"
+,54,0," S:S[$C(7) S=$TR(S,$C(7),"""")"
+,55,0," F J=1:1:$L(F,""!"")-1 S N=N+1,^TMP(T,$J,N)="""""
+,56,0," S:'N N=1"
+,57,0," S:F[""?"" @(""C=""_$P(F,""?"",2))"
+,58,0," S L=$G(^TMP(T,$J,N))"
+,59,0," S ^TMP(T,$J,N)=L_$J("""",$G(C)-$L(L))_S"
+,60,0," Q"
+,61,0," ;"
+,62,0,"SM ;Print text in ScreenMan's Command Area"
+,63,0," I $D(DDSID),$D(DTOUT)!$D(DUOUT) G SMQ"
+,64,0," N DDIOL"
+,65,0," S DDIOL=1"
+,66,0," ;"
+,67,0," I $D(A)=1&($G(G)="""")!($D(A)>9) D"
+,68,0," . D MSG^DDSMSG(.A,"""",$G(FMT))"
+,69,0," E I $D(@G@(+$O(@G@(0)),0))#2 D"
+,70,0," . D WP^DDSMSG(G)"
+,71,0," E D HLP^DDSMSG(G)"
+,72,0," ;"
+,73,0,"SMQ I DINAKED]"""" S DINAKED=$S(DINAKED["""""""""""":$O(@DINAKED),1:$D(@DINAKED))"
+,74,0," Q"
+Totals for DDIOL,,0,
+XINDEX,1,0,"XINDEX ;ISC/REL,GFT,GRK,RWF - INDEX & CROSS-REFERENCE ;08/04/08 13:19"
+,2,1," ;;7.3;TOOLKIT;**20,27,48,61,66,68,110,121,128**;Apr 25, 1995;Build 1"
+,3,0," ; Per VHA Directive 2004-038, this routine should not be modified."
+,4,1," G ^XINDX6"
+,5,107216,"SEP F I=1:1 S CH=$E(LIN,I) D QUOTE:CH=Q Q:"" ""[CH"
+,6,107216," S ARG=$E(LIN,1,I-1) S:CH="" "" I=I+1 S LIN=$E(LIN,I,999) Q"
+,7,36371,"QUOTE F I=I+1:1 S CH=$E(LIN,I) Q:CH=""""!(CH=Q)"
+,8,36371," Q:CH]"""" S ERR=6 G ^XINDX1"
+,9,0,"ALIVE ;enter here from taskman"
+,10,1," D SETUP^XINDX7 ;Get ready to process"
+,11,468,"A2 S RTN=$O(^UTILITY($J,RTN)) G ^XINDX5:RTN="""""
+,12,467," S INDLC=(RTN?1""|""1.4L.NP) D LOAD:'INDLC"
+,13,467," I $D(ZTQUEUED),$$S^%ZTLOAD S RTN=""~"",IND(""QUIT"")=1,ZTSTOP=1 G A2"
+,14,467," I 'INDDS,INDLC W !!?10,""Data Dictionaries"",! S INDDS=1"
+,15,467," D BEG"
+,16,467," G A2"
+,17,0," ;"
+,18,467,"LOAD S X=RTN,XCNP=0,DIF=""^UTILITY(""_$J_"",1,RTN,0,"" X ^%ZOSF(""TEST"") Q:'$T X ^%ZOSF(""LOAD"") S ^UTILITY($J,1,RTN,0,0)=XCNP-1"
+,19,467," I $D(^UTILITY($J,1,RTN,0,0)) S ^UTILITY($J,1,RTN,""RSUM"")=""B""_$$SUMB^XPDRSUM($NA(^UTILITY($J,1,RTN,0)))"
+,20,467," Q"
+,21,0,"BEG ;"
+,22,467," S %=INDLC*5 W:$X+10+%>IOM ! W RTN,$J("""",10+%-$L(RTN))"
+,23,467," S (IND(""DO""),IND(""SZT""),IND(""SZC""),LABO)=0,LC=$G(^UTILITY($J,1,RTN,0,0))"
+,24,467," I LC="""" W !,"">>>Routine '"",RTN,""' not found <<<"",! Q"
+,25,467," S TXT="""",LAB=$P(^UTILITY($J,1,RTN,0,1,0),"" "") I RTN'=$P(LAB,""("") D E^XINDX1(17)"
+,26,467," I 'INDLC,LAB[""("" D E^XINDX1(55) S LAB=$P(LAB,""("")"
+,27,0," ;if M routine(not compiled template or DD) and has more than 2 lines, check lines 1 & 2"
+,28,467," I 'INDLC,LC>2 D"
+,29,467," . N LABO S LABO=1"
+,30,467," . S LIN=$G(^UTILITY($J,1,RTN,0,1,0)),TXT=1"
+,31,0," . ;check 1st line (site/dev - ) patch 128"
+,32,467," . I $P(LIN,"";"",2,4)'?.E1""/"".E.1""-"".E D E^XINDX1(62)"
+,33,467," . S LIN=$G(^UTILITY($J,1,RTN,0,2,0)),TXT=2"
+,34,0," . ;check 2nd line (;;nn.nn[TV]nn;package;.anything)"
+,35,467," . I $P(LIN,"";"",3,99)'?1.2N1"".""1.2N.1(1""T"",1""V"").2N1"";""1A.AP1"";"".E D E^XINDX1(44) ;patch 121"
+,36,467," . I $L(INP(11)) X INP(11) ;Version number check"
+,37,467," . I $L(INP(12)) X INP(12) ;Patch number check"
+,38,467,"B5 F TXT=1:1:LC S LIN=^UTILITY($J,1,RTN,0,TXT,0),LN=$L(LIN),IND(""SZT"")=IND(""SZT"")+LN+2 D LN,ST ;Process Line"
+,39,467," S LAB="""",LABO=0,TXT=0,^UTILITY($J,1,RTN,0)=IND(""SZT"")_""^""_LC_""^""_IND(""SZC"")"
+,40,467," I IND(""SZT"")>INP(""MAX""),'INDLC S ERR=35,ERR(1)=IND(""SZT"") D ^XINDX1"
+,41,467," I IND(""SZT"")-IND(""SZC"")>INP(""CMAX""),'INDLC S ERR=58,ERR(1)=IND(""SZT"")-IND(""SZC"") D ^XINDX1"
+,42,467," D POSTRTN"
+,43,467," Q"
+,44,0," ;Proccess one line, LN = Length, LIN = Line."
+,45,44620,"LN K V S (ARG,GRB,IND(""COM""),IND(""DOL""),IND(""F""))="""",X=$P(LIN,"" "")"
+,46,44620," I '$L(X) S LABO=LABO+1 G CD"
+,47,5073," S (IND(""COM""),LAB)=$P(X,""(""),ARG=$P($P(X,""("",2),"")""),LABO=0,IND(""PP"")=X?1.8E1""("".E1"")"""
+,48,5073," D:$L(ARG) NE^XINDX3 ;Process formal parameters as New list."
+,49,5073," I 'INDLC,'$$VT^XINDX2(LAB) D E^XINDX1($S(LAB=$$CASE^XINDX52(LAB):37,1:55)) ;Check for bad labels"
+,50,5073," I $D(^UTILITY($J,1,RTN,""T"",LAB)) D E^XINDX1(15) G CD ;DUP label"
+,51,5073," S ^UTILITY($J,1,RTN,""T"",LAB)="""""
+,52,44620,"CD I LN>245 D:'(LN=246&($E(RTN,1,3)=""|dd"")) E^XINDX1(19) ;patch 119"
+,53,44620," D:LIN'?1.ANP E^XINDX1(18)"
+,54,44620," S LIN=$P(LIN,"" "",2,999),IND(""LCC"")=1"
+,55,44620," I LIN="""" D E^XINDX1(42) Q ;Blank line ;p110"
+,56,44620," S I=0 ;Watch the scope of I, counts dots"
+,57,44620," I "" .""[$E(LIN) D S X=$L($E(LIN,1,I),""."")-1,LIN=$E(LIN,I,999)"
+,58,10770," . F I=1:1:245 Q:"". ""'[$E(LIN,I)"
+,59,10770," . Q"
+,60,0," ;check dots against Do level IND(""DO""), IND(""DOL"")=dot level"
+,61,44620," D:'I&$G(IND(""DO1"")) E^XINDX1(51) S IND(""DO1"")=0 S:'I IND(""DO"")=0"
+,62,44620," I I D:X>IND(""DO"") E^XINDX1(51) S (IND(""DO""),IND(""DOL""))=X"
+,63,0," ;Count Comment lines, skip ;; lines"
+,64,44620," I $E(LIN)="";"",$E(LIN,2)'="";"" S IND(""SZC"")=IND(""SZC"")+$L(LIN) ;p110"
+,65,0," ;Process commands on line."
+,66,116081,"EE I LIN="""" D ^XINDX2 Q"
+,67,71461," S COM=$E(LIN),GK="""",ARG="""""
+,68,71461," I COM="";"" S LIN="""" G EE ;p110"
+,69,54870," I COM="" "" S ERR=$S(LIN?1."" "":13,1:0),LIN=$S(ERR:"""",1:$E(LIN,2,999)) D:ERR ^XINDX1 G EE"
+,70,53608," D SEP"
+,71,53608," S CM=$P(ARG,"":"",1),POST=$P(ARG,"":"",2,999),IND(""COM"")=IND(""COM"")_$C(9)_COM,ERR=48"
+,72,53608," D:ARG["":""&(POST']"""") ^XINDX1 S:POST]"""" GRB=GRB_$C(9)_POST,IND(""COM"")=IND(""COM"")_"":"""
+,73,0," ;SAC now allows lowercase commands"
+,74,53608," I CM?.E1L.E S CM=$$CASE^XINDX52(CM),COM=$E(CM) ;I IND(""LCC"") S IND(""LCC"")=0 D E^XINDX1(47)"
+,75,53608," I CM="""" D E^XINDX1(21) G EE ;Missing command"
+,76,53608," S CX=$G(IND(""CMD"",CM)) I CX="""" D G:CX="""" EE"
+,77,0," . I $E(CM)=""Z"" S CX=""^Z"" Q ;Proccess Z commands"
+,78,0," . D E^XINDX1(1) S LIN="""" Q"
+,79,53608," S CX=$P(CX,""^"",2,9)"
+,80,53608," D SEP I '$L(LIN),CH="" "" D E^XINDX1(13) ;trailing space"
+,81,53608," I ARG="""",""CGJMORSUWX""[COM S ERR=49 G ^XINDX1"
+,82,53608," I CX>0 D E^XINDX1(CX) S CX="""""
+,83,53608," D:$L(CX) @CX S:ARG'="""" GRB=GRB_$C(9)_ARG G EE"
+,84,0,"B S ERR=25 G ^XINDX1"
+,85,0,"C S ERR=29 G ^XINDX1"
+,86,0,"D G DG1^XINDX4"
+,87,0,"E Q:ARG="""" S ERR=7 G ^XINDX1"
+,88,1559,"F G:ARG]"""" FR^XINDX4 S IND(""F"")=1 Q"
+,89,1932,"G G DG^XINDX4"
+,90,11,"H Q:ARG'="""" S ERR=32 G ^XINDX1"
+,91,0,"J S ERR=36,ARG="""" G ^XINDX1"
+,92,2218,"K S ERR=$S(ARG?1""("".E:22,ARG?."" "":23,1:0) D:ERR ^XINDX1"
+,93,2218," G KL^XINDX3"
+,94,259,"L G LO^XINDX4"
+,95,30,"M G S^XINDX3"
+,96,1721,"N G NE^XINDX3"
+,97,0,"O S ERR=34 D ^XINDX1,O^XINDX3 Q"
+,98,7762,"Q Q:ARG="""" G Q^XINDX4"
+,99,85,"R S RDTIME=0 G RD^XINDX3"
+,100,17549,"S G S^XINDX3"
+,101,0,"TR Q ;What to process. p110"
+,102,72,"U S ARG=$P(ARG,"":"") Q"
+,103,0,"V S ARG="""",ERR=20 G ^XINDX1"
+,104,4584,"W G WR^XINDX4"
+,105,220,"X G XE^XINDX4"
+,106,0,"Z S ERR=2 D ^XINDX1 G ZC^XINDX4"
+,107,0," ;"
+,108,0," ;Save off items from line."
+,109,44620,"ST S R=LAB_$S(LABO:""+""_LABO,1:"""")"
+,110,0," ;Local variable, Global, Marked Items, Naked global, Internal ref, eXternal ref., Tag ref."
+,111,44620," S LOC="""" F S LOC=$O(V(LOC)),S="""" Q:LOC="""" F S S=$O(V(LOC,S)) Q:S="""" D SET"
+,112,44620," S ^UTILITY($J,1,RTN,""COM"",TXT)=IND(""COM"")"
+,113,44620," Q"
+,114,0," ;"
+,115,85079,"SET I V(LOC,S)]"""" F %=""!"",""~"" I V(LOC,S)[%,$G(^UTILITY($J,1,RTN,LOC,S))'[% S ^(S)=$G(^(S))_%"
+,116,85079," S %=0"
+,117,86891,"SE2 S ARG=$G(^UTILITY($J,1,RTN,LOC,S,%)) I $L(ARG)>230 S %=%+1 G SE2"
+,118,85079," S ^UTILITY($J,1,RTN,LOC,S,%)=ARG_R_V(LOC,S)_"","""
+,119,85079," Q"
+,120,0," ;"
+,121,0,"POSTRTN ;Do more overall checking"
+,122,467," N V,E,T,T1,T2"
+,123,467," S T="""" ;Check for missing Labels"
+,124,467," F S T=$O(^UTILITY($J,1,RTN,""I"",T)),T2=T Q:T="""" S T1=$G(^(T,0)) D"
+,125,2091," . Q:$E(T2,1,2)=""@("""
+,126,2044," . S:$E(T2,1,2)=""$$"" T2=$E(T2,3,99)"
+,127,2044," . I T2]"""",'$D(^UTILITY($J,1,RTN,""T"",$P(T2,""+"",1))) D"
+,128,0," . . F I=1:1:$L(T1,"","")-1 S LAB=$P(T1,"","",I),LABO=+$P(LAB,""+"",2),LAB=$P(LAB,""+""),E=14,E(1)=T D E^XINDX1(.E)"
+,129,0," . . Q"
+,130,2044," . Q"
+,131,467," S LAB="""",LABO=0 ;Check for valid label names"
+,132,467," I 'INDLC F S LAB=$O(^UTILITY($J,1,RTN,""T"",LAB)) Q:LAB="""" D"
+,133,5073," . I '$$VA^XINDX2(LAB) D E^XINDX1(55) Q"
+,134,5073," . D:'$$VT^XINDX2(LAB) E^XINDX1(37)"
+,135,5073," . Q"
+,136,467," S LAB="""",LABO=0 ;Check for valid variable names."
+,137,467," F S LAB=$O(^UTILITY($J,1,RTN,""L"",LAB)) Q:LAB="""" D"
+,138,15909," . D VLNF^XINDX3($P(LAB,""(""))"
+,139,15909," . Q"
+,140,467," Q"
+,141,0," ;"
+,142,0,"QUICK ;Quick, Just get a routine an print the results"
+,143,0," D QUICK^XINDX6()"
+,144,0," Q"
+Totals for XINDEX,,2446443,
+XINDX1,1,0,"XINDX1 ;ISC/REL,GRK,RWF - ERROR ROUTINE ;08/05/08 13:59"
+,2,2," ;;7.3;TOOLKIT;**20,61,66,68,110,121,128**;Apr 25, 1995;Build 1"
+,3,0," ; Per VHA Directive 2004-038, this routine should not be modified."
+,4,2," G A"
+,5,0,"E(ERR) ;"
+,6,75,"A N %,%1 ;TXT is the line of the error."
+,7,75," S ERTX=LAB_$S(LABO:""+""_LABO,1:"""")_$C(9),%1=$T(ERROR+ERR),ERTX=ERTX_$S(ERR:$P(%1,"";"",4,9),1:ERR) ;p110"
+,8,75," I ERTX[""|"" F %=1:1 S ERTX=$P(ERTX,""|"")_$S($D(ERR(%)):ERR(%),1:""??"")_$P(ERTX,""|"",%+1,99) Q:ERTX'[""|"""
+,9,75,"B I $P(%1,"";"",3)]"""" D Q:%1]"""" ;Don't flag kernel doing kernel."
+,10,0," . S %1=$P(%1,"";"",3)"
+,11,0," . F Q:RTN[$P(%1,"","") S %1=$P(%1,"","",2,99) ;quit if RTN[%1 or null."
+,12,0," . Q"
+,13,75," I ERR=17,$E(RTN)'=""%"",$E(LAB)=""%"" Q ;Don't flag %RTN w/o %."
+,14,0," ;Global is Error Line,tab,error tag,tab,error text"
+,15,75," S %=$G(^UTILITY($J,1,RTN,""E"",0))+1,^(0)=%,^(%)=TXT_$C(9)_ERTX"
+,16,75," Q"
+,17,0," ;"
+,18,0," ;F = Fatal, S = Standard, W = Warning, I = Info"
+,19,0,"ERROR ;"
+,20,0,"1 ;;;F - UNDEFINED COMMAND (rest of line not checked)."
+,21,0,"2 ;;;F - Non-standard (Undefined) 'Z' command."
+,22,0,"3 ;;XTRMON;F - Undefined Function."
+,23,0,"4 ;;;F - Undefined Special Variable."
+,24,0,"5 ;;;F - Unmatched Parenthesis."
+,25,0,"6 ;;;F - Unmatched Quotation Marks."
+,26,0,"7 ;;;F - ELSE Command followed by only one space."
+,27,0,"8 ;;;F - FOR Command did not contain '='."
+,28,0,"9 ;;;I - QUIT Command followed by only one space."
+,29,0,"10 ;;;F - Unrecognized argument in SET command."
+,30,0,"11 ;;;W - Invalid local variable name."
+,31,0,"12 ;;;W - Invalid global variable name."
+,32,0,"13 ;;;W - Blank(s) at end of line."
+,33,0,"14 ;;;F - Call to missing label '|' in this routine."
+,34,0,"15 ;;;W - Duplicate label. (M57)"
+,35,0,"16 ;;;F - Error in pattern code."
+,36,0,"17 ;;;W - First line label NOT routine name."
+,37,0,"18 ;;;W - Line contains a CONTROL (non-graphic) character."
+,38,0,"19 ;;;S - Line is longer than 245 bytes."
+,39,0,"20 ;;;S - View command used."
+,40,0,"21 ;;;F - General Syntax Error."
+,41,0,"22 ;;;S - Exclusive Kill."
+,42,0,"23 ;;;S - Unargumented Kill."
+,43,0,"24 ;;;S - Kill of an unsubscripted global."
+,44,0,"25 ;;;S - Break command used."
+,45,0,"26 ;;;S - Exclusive or Unargumented NEW command."
+,46,0,"27 ;;;S - $View function used."
+,47,0,"28 ;;ZOSV,ZIS,ZT;S - Non-standard $Z special variable used."
+,48,0,"29 ;;ZIS,ZTM;S - 'Close' command should be invoked through 'D ^%ZISC'."
+,49,0,"30 ;;;S - LABEL+OFFSET syntax."
+,50,0,"31 ;;ZOSV,ZIS,ZT;S - Non-standard $Z function used."
+,51,0,"32 ;;;S - 'HALT' command should be invoked through 'G ^XUSCLEAN'."
+,52,0,"33 ;;;S - Read command doesn't have a timeout."
+,53,0,"34 ;;ZIS;S - 'OPEN' command should be invoked through ^%ZIS."
+,54,0,"35 ;;;S - Routine exceeds SACC maximum size of 20000 (|)."
+,55,0,"36 ;;ZTM;S - Should use 'TASKMAN' instead of 'JOB' command."
+,56,0,"37 ;;;F - Label is not valid."
+,57,0,"38 ;;;F - Call to this |"
+,58,0,"39 ;;ZIS,XUS,XUP;S - Kill of a protected variable (|)."
+,59,0,"40 ;;;S - Space where a command should be."
+,60,0,"41 ;;;I - Star or pound READ used."
+,61,0,"42 ;;;W - Null line (no commands or comment)."
+,62,0,"43 ;;;F - Invalid or wrong number of arguments to a function."
+,63,0,"44 ;;;S - 2nd line of routine violates the SAC."
+,64,0,"45 ;;ZT,ZIS,XUTM,XTER;S - Set to a '%' global."
+,65,0,"46 ;;;F - Quoted string not followed by a separator."
+,66,0,"47 ;;;S - Lowercase command(s) used in line."
+,67,0,"48 ;;;F - Missing argument to a command post-conditional."
+,68,0,"49 ;;;F - Command missing an argument."
+,69,0,"50 ;;ZTM;S - Extended reference."
+,70,0,"51 ;;;F - Block structure mismatch."
+,71,0,"52 ;;;F - Reference to routine '^|'. That isn't in this UCI."
+,72,0,"53 ;;;F - Bad Number."
+,73,0,"54 ;;XG;S - Access to SSVN's restricted to Kernel."
+,74,0,"55 ;;;S - Violates VA programming standards."
+,75,0,"56 ;;;S - Patch number '|' missing from second line."
+,76,0,"57 ;;;S - Lower/Mixed case Variable name used."
+,77,0,"58 ;;;S - Routine code exceeds SACC maximum size of 15000 (|)."
+,78,0,"59 ;;;F - Bad WRITE syntax."
+,79,0,"60 ;;;S - Lock missing Timeout."
+,80,0,"61 ;;;S - Non-Incremental Lock."
+,81,0,"62 ;;;S - First line of routine violates the SAC."
+,82,0,"63 ;;;F - GO or DO mismatch from block structure (M45)."
+Totals for XINDX1,,529,
diff --git a/Tests/MumpsCoverage/Accounts_ReceivableTest.mcov b/Tests/MumpsCoverage/Accounts_ReceivableTest.mcov new file mode 100644 index 0000000..3c585f5 --- /dev/null +++ b/Tests/MumpsCoverage/Accounts_ReceivableTest.mcov @@ -0,0 +1,1445 @@ +%GO Global Output Utility +GT.M 17-APR-2012 17:18:27 ZWR +^ZZCOVERAGE("%RSEL","SRC")="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",1)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",2)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",3)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",4)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",5)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",6)="1:0:0:0" +^ZZCOVERAGE("%RSEL","SRC",7)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init")="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",1)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",3)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",4)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",5)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",6)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",7)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",8)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",8,"FOR_LOOP",1)=1 +^ZZCOVERAGE("%RSEL","init",9)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",10)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",11)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",12)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",13)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",14)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",15)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",16)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",17)="1:0:0:0" +^ZZCOVERAGE("%RSEL","init",17,"FOR_LOOP",1)=2 +^ZZCOVERAGE("%RSEL","init",18)="2:0:0:0" +^ZZCOVERAGE("%RSEL","init",19)="2:0:0:0" +^ZZCOVERAGE("%RSEL","init",20)="2:0:0:0" +^ZZCOVERAGE("%RSEL","init",40)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main")="1:32001:84004:116005" +^ZZCOVERAGE("%RSEL","main",1)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",2)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",3)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",3,"FOR_LOOP",1)=468 +^ZZCOVERAGE("%RSEL","main",4)="468:0:24003:24003" +^ZZCOVERAGE("%RSEL","main",5)="468:0:0:0" +^ZZCOVERAGE("%RSEL","main",6)="468:32001:48001:80002" +^ZZCOVERAGE("%RSEL","main",7)="467:0:12000:12000" +^ZZCOVERAGE("%RSEL","main",8)="467:0:0:0" +^ZZCOVERAGE("%RSEL","main",9)="467:0:0:0" +^ZZCOVERAGE("%RSEL","main",10)="467:0:0:0" +^ZZCOVERAGE("%RSEL","main",11)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",12)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",13)="1:0:0:0" +^ZZCOVERAGE("%RSEL","main",14)="1:0:0:0" +^ZZCOVERAGE("%RSEL","next")="1403:12001:20002:32003" +^ZZCOVERAGE("%RSEL","next",0)="1403:0:0:0" +^ZZCOVERAGE("%RSEL","next",1)="1403:12001:20002:32003" +^ZZCOVERAGE("%RSEL","next",1,"FOR_LOOP",1)=1403 +^ZZCOVERAGE("%RSEL","next",2)="1403:0:0:0" +^ZZCOVERAGE("%RSEL","save")="467:0:4001:4001" +^ZZCOVERAGE("%RSEL","save",1)="467:0:0:0" +^ZZCOVERAGE("%RSEL","save",5)="467:0:0:0" +^ZZCOVERAGE("%RSEL","save",6)="467:0:0:0" +^ZZCOVERAGE("%RSEL","save",7)="467:0:0:0" +^ZZCOVERAGE("%RSEL","save",8)="467:0:4001:4001" +^ZZCOVERAGE("%RSEL","save",9)="467:0:0:0" +^ZZCOVERAGE("%RSEL","search")="934:0:16001:16001" +^ZZCOVERAGE("%RSEL","search",0)="934:0:4000:4000" +^ZZCOVERAGE("%RSEL","search",1)="934:0:0:0" +^ZZCOVERAGE("%RSEL","search",2)="934:0:4001:4001" +^ZZCOVERAGE("%RSEL","search",2,"FOR_LOOP",1)=1868 +^ZZCOVERAGE("%RSEL","search",3)="934:0:8000:8000" +^ZZCOVERAGE("%RSEL","search",4)="934:0:0:0" +^ZZCOVERAGE("%RSEL","search",5)="934:0:0:0" +^ZZCOVERAGE("%RSEL","start")="468:0:4001:4001" +^ZZCOVERAGE("%RSEL","start",0)="468:0:0:0" +^ZZCOVERAGE("%RSEL","start",1)="468:0:0:0" +^ZZCOVERAGE("%RSEL","start",2)="468:0:0:0" +^ZZCOVERAGE("%RSEL","start",2,"FOR_LOOP",1)=936 +^ZZCOVERAGE("%RSEL","start",3)="468:0:0:0" +^ZZCOVERAGE("%RSEL","work")="467:20002:24001:44003" +^ZZCOVERAGE("%RSEL","work",1)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",2)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",3)="467:0:4000:4000" +^ZZCOVERAGE("%RSEL","work",4)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",6)="467:4000:12000:16000" +^ZZCOVERAGE("%RSEL","work",6,"FOR_LOOP",1)=3421 +^ZZCOVERAGE("%RSEL","work",7)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",8)="467:4001:0:4001" +^ZZCOVERAGE("%RSEL","work",9)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",10)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",11)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",12)="467:4000:0:4000" +^ZZCOVERAGE("%RSEL","work",13)="467:0:4000:4000" +^ZZCOVERAGE("%RSEL","work",14)="467:0:0:0" +^ZZCOVERAGE("%RSEL","work",15)="467:4001:4001:8002" +^ZZCOVERAGE("%RSEL","work",15,"FOR_LOOP",1)=934 +^ZZCOVERAGE("%RSEL","work",16)="467:0:0:0" +^ZZCOVERAGE("%ZIS","%ZIS")="2:0:0:0" +^ZZCOVERAGE("%ZIS","%ZIS",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS","%ZIS",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS","A",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS","A",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS","CLEAN")="3:0:0:0" +^ZZCOVERAGE("%ZIS","CLEAN",1)="3:0:0:0" +^ZZCOVERAGE("%ZIS","CLEAN",2)="3:0:0:0" +^ZZCOVERAGE("%ZIS","CLEAN",3)="3:0:0:0" +^ZZCOVERAGE("%ZIS","CLEAN",4)="3:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME")="2:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",3)="1:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",4)="1:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",5)="1:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",6)="1:0:0:0" +^ZZCOVERAGE("%ZIS","GETHOME",7)="1:0:0:0" +^ZZCOVERAGE("%ZIS","HOME")="1:0:0:0" +^ZZCOVERAGE("%ZIS","HOME",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS","HOME",2)="1:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",6)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",8)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",10)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",11)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",12)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",13)="2:0:0:0" +^ZZCOVERAGE("%ZIS","INIT",15)="2:0:0:0" +^ZZCOVERAGE("%ZIS","K2",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS","K2",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS","K2",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS","K2",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS","VIRTUAL")="2:0:0:0" +^ZZCOVERAGE("%ZIS","VIRTUAL",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS","VIRTUAL",4,"FOR_LOOP",1)=6 +^ZZCOVERAGE("%ZIS","VIRTUAL",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS","VIRTUAL",7)="2:0:0:0" +^ZZCOVERAGE("%ZIS","VTLKUP")="4:0:0:0" +^ZZCOVERAGE("%ZIS","VTLKUP",0)="4:0:0:0" +^ZZCOVERAGE("%ZIS","VTLKUP",0,"FOR_LOOP",1)=8 +^ZZCOVERAGE("%ZIS","VTLKUP",1)="4:0:0:0" +^ZZCOVERAGE("%ZIS1","EX2",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EX2",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",6)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",7)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",8)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","EXIT",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","G",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","IOP")="1:0:0:0" +^ZZCOVERAGE("%ZIS1","IOP",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","K2")="2:0:0:0" +^ZZCOVERAGE("%ZIS1","K2",1)="4:0:0:0" +^ZZCOVERAGE("%ZIS1","K2",2)="4:0:0:0" +^ZZCOVERAGE("%ZIS1","K2",3)="4:0:0:0" +^ZZCOVERAGE("%ZIS1","K2",4)="4:0:0:0" +^ZZCOVERAGE("%ZIS1","KIL",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","KIL",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","KIL",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",6)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",7)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",8)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",10)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",11)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","L1",12)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","LKUP")="2:0:0:0" +^ZZCOVERAGE("%ZIS1","LKUP",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","LKUP",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","LKUP",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","MAIN",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","R")="1:0:0:0" +^ZZCOVERAGE("%ZIS1","R",0)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","R",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","R",2)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",0)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",2)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",3)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",4)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","RD",5)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","SBR")="1:0:0:0" +^ZZCOVERAGE("%ZIS1","SBR",1)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","SBR",2)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","SBR",3)="1:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ")="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETQ",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",7)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",8)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",10)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",11)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",12)="2:0:0:0" +^ZZCOVERAGE("%ZIS1","SETVAR",13)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","CHECK",6)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","IOPAR")="4:0:0:0" +^ZZCOVERAGE("%ZIS2","IOPAR",0)="4:0:0:0" +^ZZCOVERAGE("%ZIS2","IOPAR",1)="4:0:0:0" +^ZZCOVERAGE("%ZIS2","L2")="2:0:0:0" +^ZZCOVERAGE("%ZIS2","L2",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OCPU",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OOS",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OOS",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU")="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",2,"FOR_LOOP",1)=4 +^ZZCOVERAGE("%ZIS2","OTHCPU",3)="4:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",4)="4:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",5)="4:0:0:0" +^ZZCOVERAGE("%ZIS2","OTHCPU",15)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","PTIME",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK")="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","QUECHK",13)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","SLAVE",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","T2",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","T2",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",10)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",11)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",12)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",15)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",16)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","TMPVAR",18)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","VTRM",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS2","VTRM",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",6)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",8)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","%ZIS3",11)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ALTP",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ASKMAR",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ASKMAR",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","MARGN")="2:0:0:0" +^ZZCOVERAGE("%ZIS3","MARGN",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","MARGN",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","MARGN",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","MARGN",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","Q",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","Q",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","Q",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","SETPAR")="2:0:0:0" +^ZZCOVERAGE("%ZIS3","SETPAR",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","SETPAR",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ST")="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ST",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ST",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ST",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","ST",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","STP",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","STP",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","STP",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","STP",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","TRM",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","TRM",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","TRM",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","TRM",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","TRM",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","W")="2:0:0:0" +^ZZCOVERAGE("%ZIS3","W",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","W",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS3","W",2)="1:0:0:0" +^ZZCOVERAGE("%ZIS3","W",3)="1:0:0:0" +^ZZCOVERAGE("%ZIS4","O")="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O1")="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O1",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O1",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O1",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","O1",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",4)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",5)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",9)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",10)="2:0:0:0" +^ZZCOVERAGE("%ZIS4","OPAR",12)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","ANSBAK",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","ANSBAK",2)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","ANSBAK",3)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","OXECUTE",1)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","QUIT",0)="2:0:0:0" +^ZZCOVERAGE("%ZIS6","QUIT",1)="2:0:0:0" +^ZZCOVERAGE("%ZISC","C0")="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",3)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",5)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",6)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",8)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",9)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",10)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",13)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",16)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",17)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",21)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",26)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",27)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",29)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",32)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",33)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",34)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",37)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",41)="1:0:0:0" +^ZZCOVERAGE("%ZISC","C0",43)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS")="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",3)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",4)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",5)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",6)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",7)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CIOS",8)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CLOSPP")="1:0:0:0" +^ZZCOVERAGE("%ZISC","CLOSPP",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CLOSPP",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","CLOSPP",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","END",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","END",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","END",4)="1:0:0:0" +^ZZCOVERAGE("%ZISC","FF")="1:0:0:0" +^ZZCOVERAGE("%ZISC","FF",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","FF",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","FF",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","RM")="1:0:0:0" +^ZZCOVERAGE("%ZISC","RM",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","RM",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","S1",0)="1:0:0:0" +^ZZCOVERAGE("%ZISC","S1",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",4)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",5)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",6)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",7)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",8)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",9)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",10)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SETIO",12)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SUBTYPE")="1:0:0:0" +^ZZCOVERAGE("%ZISC","SUBTYPE",1)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SUBTYPE",2)="1:0:0:0" +^ZZCOVERAGE("%ZISC","SUBTYPE",3)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT")="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",0)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",2)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",3)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",4)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",5)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LINEPORT",6)="1:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTIEN")="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTIEN",0)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTIEN",1)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM")="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",0)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",1)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",2)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",3)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",5)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTNAM",6)="3:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTSUB")="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTSUB",0)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTSUB",1)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTSUB",2)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","LNPRTSUB",3)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL")="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",0)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",1)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",3)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",4)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",5)="2:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",5,"FOR_LOOP",1)=40 +^ZZCOVERAGE("%ZISUTL","SYMBOL",6)="40:0:0:0" +^ZZCOVERAGE("%ZISUTL","SYMBOL",10)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","GETENV")="2:0:0:0" +^ZZCOVERAGE("%ZOSV","GETENV",1)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","GETENV",2)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","GETENV",3)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","LGR")="2:0:0:0" +^ZZCOVERAGE("%ZOSV","LGR",0)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","LGR",1)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","PRI")="1:0:0:0" +^ZZCOVERAGE("%ZOSV","PRI",0)="1:0:0:0" +^ZZCOVERAGE("%ZOSV","PRI",3)="1:0:0:0" +^ZZCOVERAGE("%ZOSV","RETURN")="2:0:4000:4000" +^ZZCOVERAGE("%ZOSV","RETURN",0)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","RETURN",2)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","RETURN",3)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","RETURN",4)="2:0:4000:4000" +^ZZCOVERAGE("%ZOSV","RETURN",5)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","RETURN",7)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","TEMP")="2:0:0:0" +^ZZCOVERAGE("%ZOSV","TEMP",0)="2:0:0:0" +^ZZCOVERAGE("%ZOSV","TEMP",2)="2:0:0:0" +^ZZCOVERAGE("%ZOSV2","LOAD")="467:1000060:340019:1340079" +^ZZCOVERAGE("%ZOSV2","LOAD",0)="467:0:0:0" +^ZZCOVERAGE("%ZOSV2","LOAD",1)="467:0:8001:8001" +^ZZCOVERAGE("%ZOSV2","LOAD",2)="467:1000060:320018:1320078" +^ZZCOVERAGE("%ZOSV2","LOAD",2,"FOR_LOOP",1)=45087 +^ZZCOVERAGE("%ZOSV2","LOAD",3)="467:0:12000:12000" +^ZZCOVERAGE("DIALOG","EZBLD")="2:0:4000:4000" +^ZZCOVERAGE("DIALOG","EZBLD",0)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",2)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",3)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",4)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",5)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",6)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",7)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",8)="2:0:0:0" +^ZZCOVERAGE("DIALOG","EZBLD",9)="2:0:0:0" +^ZZCOVERAGE("DIALOG","PARAM")="2:0:0:0" +^ZZCOVERAGE("DIALOG","PARAM",0)="4:0:0:0" +^ZZCOVERAGE("DIALOG","PARAM",1)="2:0:0:0" +^ZZCOVERAGE("DIALOG","PARAM",2)="2:0:0:0" +^ZZCOVERAGE("DIALOG","PARAM",3)="2:0:0:0" +^ZZCOVERAGE("DIALOG","Q1",0)="2:0:0:0" +^ZZCOVERAGE("DIALOG","Q2")="2:0:0:0" +^ZZCOVERAGE("DIALOG","Q2",0)="2:0:0:0" +^ZZCOVERAGE("DIALOG","QEZ",0)="2:0:4000:4000" +^ZZCOVERAGE("DIALOG","QEZ",1)="2:0:0:0" +^ZZCOVERAGE("DIALOG","QP",0)="2:0:0:0" +^ZZCOVERAGE("DIC","A1",0)="2:0:0:0" +^ZZCOVERAGE("DIC","ASK",0)="2:0:0:0" +^ZZCOVERAGE("DIC","ASK",1)="2:0:0:0" +^ZZCOVERAGE("DIC","ASK",2)="2:0:0:0" +^ZZCOVERAGE("DIC","ASK",3)="2:0:0:0" +^ZZCOVERAGE("DIC","ASK",4)="2:0:0:0" +^ZZCOVERAGE("DIC","DIC")="2:0:0:0" +^ZZCOVERAGE("DIC","DIC",3)="2:0:0:0" +^ZZCOVERAGE("DIC","DIC",4)="2:0:0:0" +^ZZCOVERAGE("DIC","DIC",5)="2:0:0:0" +^ZZCOVERAGE("DIC","DIC",6)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",0)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",1)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",2)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",3)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",4)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",5)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",6)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",7)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",8)="2:0:0:0" +^ZZCOVERAGE("DIC","EN",9)="2:0:0:0" +^ZZCOVERAGE("DIC","RTN",0)="2:0:0:0" +^ZZCOVERAGE("DIC","RTN",3)="2:0:0:0" +^ZZCOVERAGE("DIC","RTN",6)="2:0:0:0" +^ZZCOVERAGE("DIC","X",1)="2:0:0:0" +^ZZCOVERAGE("DIC","X",4)="2:0:0:0" +^ZZCOVERAGE("DIC","X",5)="2:0:0:0" +^ZZCOVERAGE("DIC","X",6)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE")="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",0)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",1)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",2)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",3)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",4)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",7)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",8)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",11)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",12)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",13)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",14)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",15)="2:0:0:0" +^ZZCOVERAGE("DIC0","GETFILE",16)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT")="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",1)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",2)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",3)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",4)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",5)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",6)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",7)="2:0:0:0" +^ZZCOVERAGE("DIC0","INIT",8)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN")="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",0)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",1)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",2)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",3)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",4)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",5)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",5,"FOR_LOOP",1)=2 +^ZZCOVERAGE("DIC0","SETIEN",6)="2:0:0:0" +^ZZCOVERAGE("DIC0","SETIEN",7)="2:0:0:0" +^ZZCOVERAGE("DIC1","B",0)="2:0:0:0" +^ZZCOVERAGE("DIC1","DIC1")="2:0:0:0" +^ZZCOVERAGE("DIC1","DIC1",3)="2:0:0:0" +^ZZCOVERAGE("DIC1","DIC1",4)="2:0:0:0" +^ZZCOVERAGE("DIC1","DIC1",5)="2:0:0:0" +^ZZCOVERAGE("DIC1","DO")="4:0:0:0" +^ZZCOVERAGE("DIC1","DO",1)="4:0:0:0" +^ZZCOVERAGE("DIC1","DO",2)="2:0:0:0" +^ZZCOVERAGE("DIC1","DO2",0)="2:0:0:0" +^ZZCOVERAGE("DIC1","DO2",1)="2:0:0:0" +^ZZCOVERAGE("DIC1","DO2",2)="2:0:0:0" +^ZZCOVERAGE("DIC1","DO2",3)="2:0:0:0" +^ZZCOVERAGE("DIC1","GETFA")="4:0:0:0" +^ZZCOVERAGE("DIC1","GETFA",0)="4:0:0:0" +^ZZCOVERAGE("DIC1","GETFA",2)="4:0:0:0" +^ZZCOVERAGE("DIC1","P",1)="2:0:0:0" +^ZZCOVERAGE("DIC1","P",2)="2:0:0:0" +^ZZCOVERAGE("DIC1","PROMPT",1)="2:0:0:0" +^ZZCOVERAGE("DIC1","PROMPT",2)="2:0:0:0" +^ZZCOVERAGE("DIC1","W",0)="2:0:0:0" +^ZZCOVERAGE("DIC1","W",0,"FOR_LOOP",1)=4 +^ZZCOVERAGE("DIC1","W",1)="3:0:0:0" +^ZZCOVERAGE("DIC1","W",2)="3:0:0:0" +^ZZCOVERAGE("DIC1","W",3)="2:0:0:0" +^ZZCOVERAGE("DIC1","W",4)="2:0:0:0" +^ZZCOVERAGE("DIC1","W",5)="2:0:0:0" +^ZZCOVERAGE("DIC1","W",6)="2:0:0:0" +^ZZCOVERAGE("DIC1","WOV")="1:0:0:0" +^ZZCOVERAGE("DIC1","WOV",0)="1:0:0:0" +^ZZCOVERAGE("DIC1","WOV",1)="1:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT")="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",0)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",1)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",2)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",3)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",3,"FOR_LOOP",1)=2 +^ZZCOVERAGE("DIC11","GETPRMT",4)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",8)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",9)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",10)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",11)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",12)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",13)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",14)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",15)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",16)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",17)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",18)="2:0:0:0" +^ZZCOVERAGE("DIC11","GETPRMT",19)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",0)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",1)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",2)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",3)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",4)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",6)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",8)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",9)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",11)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",12)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",13)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",14)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",15)="2:0:0:0" +^ZZCOVERAGE("DIC11","PR1",16)="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT")="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT",0)="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT",1)="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT",1,"FOR_LOOP",1)=2 +^ZZCOVERAGE("DIC11","PROMPT",2)="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT",3)="2:0:0:0" +^ZZCOVERAGE("DIC11","PROMPT",5)="2:0:0:0" +^ZZCOVERAGE("DIC2","PGM")="4:0:0:0" +^ZZCOVERAGE("DIC2","PGM",0)="4:0:0:0" +^ZZCOVERAGE("DIC2","PGM",1)="4:0:0:0" +^ZZCOVERAGE("DIC2","PGM",2)="4:0:0:0" +^ZZCOVERAGE("DIC2","Q")="2:0:0:0" +^ZZCOVERAGE("DIC2","Q",0)="2:0:0:0" +^ZZCOVERAGE("DIC2","Q",1)="2:0:0:0" +^ZZCOVERAGE("DIC2","Q",2)="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX")="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX",0)="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX",1)="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX",2)="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX",5)="2:0:0:0" +^ZZCOVERAGE("DICL","DINDEX",6)="2:0:0:0" +^ZZCOVERAGE("DICUIX","I1",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX","I1",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX","I1",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX","I1",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX","INDEX")="2:0:0:0" +^ZZCOVERAGE("DICUIX","INDEX",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X1",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X1",8)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X1",9)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",8)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",11)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",12)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",13)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",14)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",15)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",15,"FOR_LOOP",1)=2 +^ZZCOVERAGE("DICUIX","X2",16)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",17)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",18)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",19)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",20)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",21)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",22)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",23)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",24)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",25)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",26)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",27)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",28)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",29)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",30)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",31)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",32)="2:0:0:0" +^ZZCOVERAGE("DICUIX","X2",33)="2:0:0:0" +^ZZCOVERAGE("DICUIX","XREF")="2:0:0:0" +^ZZCOVERAGE("DICUIX","XREF",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G1",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G1",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G1",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G2",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G2",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G3",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G30",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",6)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G4",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G5",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G5",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","G5",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX1","GET")="2:0:0:0" +^ZZCOVERAGE("DICUIX1","GET",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C1",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C1",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C2",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C2",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C3",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C3",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C3",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C3",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",6)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",8)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",9)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",10)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",11)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",12)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",17)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",18)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",23)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C4",24)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C5",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C5",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C6",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C6",18)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C6",19)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C6",20)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C7",0)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","C7",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1")="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",6)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON1",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2")="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",1)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",2)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",3)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",4)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",5)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",6)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",7)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",8)="2:0:0:0" +^ZZCOVERAGE("DICUIX2","COMMON2",9)="2:0:0:0" +^ZZCOVERAGE("DIEFU","IENX",1)="2:0:0:0" +^ZZCOVERAGE("DIEFU","IENX",2)="2:0:0:0" +^ZZCOVERAGE("DIEFU","IENX",3)="2:0:0:0" +^ZZCOVERAGE("DIEFU","IENX",3,"FOR_LOOP",1)=4 +^ZZCOVERAGE("DIEFU","IENX",4)="2:0:0:0" +^ZZCOVERAGE("DIEFU","IENX",5)="2:0:0:0" +^ZZCOVERAGE("DILF","CREF")="4:0:0:0" +^ZZCOVERAGE("DILF","CREF",0)="4:0:0:0" +^ZZCOVERAGE("DILF","IENS")="2:0:0:0" +^ZZCOVERAGE("DILF","IENS",0)="2:0:0:0" +^ZZCOVERAGE("DILF","IENS",1)="2:0:0:0" +^ZZCOVERAGE("DILF","OREF")="2:0:0:0" +^ZZCOVERAGE("DILF","OREF",0)="2:0:0:0" +^ZZCOVERAGE("DILIBF","FNO")="2:0:0:0" +^ZZCOVERAGE("DILIBF","FNO",0)="2:0:0:0" +^ZZCOVERAGE("DILIBF","FNO",1)="2:0:0:0" +^ZZCOVERAGE("DILIBF","FNO",2)="2:0:0:0" +^ZZCOVERAGE("DIQGU","ENCREF",0)="4:0:0:0" +^ZZCOVERAGE("DIQGU","ENOREF",0)="2:0:0:0" +^ZZCOVERAGE("DIQGU","OR2")="2:0:0:0" +^ZZCOVERAGE("DIQGU","OR2",0)="2:0:0:0" +^ZZCOVERAGE("XINDEX","A2",0)="468:0:4000:4000" +^ZZCOVERAGE("XINDEX","A2",1)="467:0:0:0" +^ZZCOVERAGE("XINDEX","A2",2)="467:0:0:0" +^ZZCOVERAGE("XINDEX","A2",3)="467:4000:0:4000" +^ZZCOVERAGE("XINDEX","A2",4)="467:0:4000:4000" +^ZZCOVERAGE("XINDEX","A2",5)="467:0:0:0" +^ZZCOVERAGE("XINDEX","ALIVE",1)="1:0:0:0" +^ZZCOVERAGE("XINDEX","B5",0)="467:188012:220012:408024" +^ZZCOVERAGE("XINDEX","B5",0,"FOR_LOOP",1)=44620 +^ZZCOVERAGE("XINDEX","B5",1)="467:20000:8000:28000" +^ZZCOVERAGE("XINDEX","B5",2)="467:4000:0:4000" +^ZZCOVERAGE("XINDEX","B5",3)="467:0:0:0" +^ZZCOVERAGE("XINDEX","B5",4)="467:4000:0:4000" +^ZZCOVERAGE("XINDEX","B5",5)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG")="467:2460149:2872194:5332343" +^ZZCOVERAGE("XINDEX","BEG",1)="467:8000:0:8000" +^ZZCOVERAGE("XINDEX","BEG",2)="467:4000:0:4000" +^ZZCOVERAGE("XINDEX","BEG",3)="467:0:4000:4000" +^ZZCOVERAGE("XINDEX","BEG",4)="467:0:4000:4000" +^ZZCOVERAGE("XINDEX","BEG",5)="467:4001:0:4001" +^ZZCOVERAGE("XINDEX","BEG",7)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG",8)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG",9)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG",11)="467:4000:0:4000" +^ZZCOVERAGE("XINDEX","BEG",12)="467:0:4000:4000" +^ZZCOVERAGE("XINDEX","BEG",14)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG",15)="467:0:0:0" +^ZZCOVERAGE("XINDEX","BEG",16)="467:0:0:0" +^ZZCOVERAGE("XINDEX","CD",0)="44620:32001:36002:68003" +^ZZCOVERAGE("XINDEX","CD",1)="44620:40002:60004:100006" +^ZZCOVERAGE("XINDEX","CD",2)="44620:40001:60002:100003" +^ZZCOVERAGE("XINDEX","CD",3)="44620:36002:44004:80006" +^ZZCOVERAGE("XINDEX","CD",4)="44620:28000:40002:68002" +^ZZCOVERAGE("XINDEX","CD",5)="44620:28002:52001:80003" +^ZZCOVERAGE("XINDEX","CD",6)="10770:28003:20000:48003" +^ZZCOVERAGE("XINDEX","CD",6,"FOR_LOOP",1)=57531 +^ZZCOVERAGE("XINDEX","CD",7)="10770:24004:16000:40004" +^ZZCOVERAGE("XINDEX","CD",9)="44620:60005:40004:100009" +^ZZCOVERAGE("XINDEX","CD",10)="44620:44003:48005:92008" +^ZZCOVERAGE("XINDEX","CD",12)="44620:52004:44002:96006" +^ZZCOVERAGE("XINDEX","EE",0)="116081:148007:200014:348021" +^ZZCOVERAGE("XINDEX","EE",1)="71461:44004:44002:88006" +^ZZCOVERAGE("XINDEX","EE",2)="71461:100007:80003:180010" +^ZZCOVERAGE("XINDEX","EE",3)="54870:44001:48001:92002" +^ZZCOVERAGE("XINDEX","EE",4)="53608:88008:100009:188017" +^ZZCOVERAGE("XINDEX","EE",5)="53608:72006:68004:140010" +^ZZCOVERAGE("XINDEX","EE",6)="53608:76005:72004:148009" +^ZZCOVERAGE("XINDEX","EE",8)="53608:60003:64005:124008" +^ZZCOVERAGE("XINDEX","EE",9)="53608:48003:72003:120006" +^ZZCOVERAGE("XINDEX","EE",10)="53608:52002:96008:148010" +^ZZCOVERAGE("XINDEX","EE",13)="53608:52003:44001:96004" +^ZZCOVERAGE("XINDEX","EE",14)="53608:96007:112006:208013" +^ZZCOVERAGE("XINDEX","EE",15)="53608:24001:52004:76005" +^ZZCOVERAGE("XINDEX","EE",16)="53608:52005:88007:140012" +^ZZCOVERAGE("XINDEX","EE",17)="53608:128008:208017:336025" +^ZZCOVERAGE("XINDEX","F")="1559:4000:4001:8001" +^ZZCOVERAGE("XINDEX","F",0)="1559:4000:0:4000" +^ZZCOVERAGE("XINDEX","G")="1932:56003:96009:152012" +^ZZCOVERAGE("XINDEX","G",0)="1932:4000:8002:12002" +^ZZCOVERAGE("XINDEX","H")="11:0:0:0" +^ZZCOVERAGE("XINDEX","H",0)="11:0:0:0" +^ZZCOVERAGE("XINDEX","K")="2218:40001:24002:64003" +^ZZCOVERAGE("XINDEX","K",0)="2218:4000:4000:8000" +^ZZCOVERAGE("XINDEX","K",1)="2218:0:4001:4001" +^ZZCOVERAGE("XINDEX","L")="259:4001:4000:8001" +^ZZCOVERAGE("XINDEX","L",0)="259:0:0:0" +^ZZCOVERAGE("XINDEX","LN",0)="44620:68005:104005:172010" +^ZZCOVERAGE("XINDEX","LN",1)="44620:40001:64004:104005" +^ZZCOVERAGE("XINDEX","LN",2)="5073:12000:4001:16001" +^ZZCOVERAGE("XINDEX","LN",3)="5073:4000:8000:12000" +^ZZCOVERAGE("XINDEX","LN",4)="5073:20001:0:20001" +^ZZCOVERAGE("XINDEX","LN",5)="5073:20003:12002:32005" +^ZZCOVERAGE("XINDEX","LN",6)="5073:12002:16000:28002" +^ZZCOVERAGE("XINDEX","LOAD")="467:88003:196019:284022" +^ZZCOVERAGE("XINDEX","LOAD",0)="467:88003:196019:284022" +^ZZCOVERAGE("XINDEX","LOAD",1)="467:0:0:0" +^ZZCOVERAGE("XINDEX","LOAD",2)="467:0:0:0" +^ZZCOVERAGE("XINDEX","M")="30:4000:0:4000" +^ZZCOVERAGE("XINDEX","M",0)="30:0:0:0" +^ZZCOVERAGE("XINDEX","N")="1721:88005:80004:168009" +^ZZCOVERAGE("XINDEX","N",0)="1721:4000:0:4000" +^ZZCOVERAGE("XINDEX","POSTRTN")="467:108009:96003:204012" +^ZZCOVERAGE("XINDEX","POSTRTN",1)="467:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",2)="467:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",3)="467:12000:8000:20000" +^ZZCOVERAGE("XINDEX","POSTRTN",3,"FOR_LOOP",1)=2558 +^ZZCOVERAGE("XINDEX","POSTRTN",4)="2091:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",5)="2044:4000:0:4000" +^ZZCOVERAGE("XINDEX","POSTRTN",6)="2044:4000:0:4000" +^ZZCOVERAGE("XINDEX","POSTRTN",9)="2044:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",10)="467:0:4000:4000" +^ZZCOVERAGE("XINDEX","POSTRTN",11)="467:12002:16001:28003" +^ZZCOVERAGE("XINDEX","POSTRTN",11,"FOR_LOOP",1)=5540 +^ZZCOVERAGE("XINDEX","POSTRTN",12)="5073:0:4000:4000" +^ZZCOVERAGE("XINDEX","POSTRTN",13)="5073:8000:4000:12000" +^ZZCOVERAGE("XINDEX","POSTRTN",14)="5073:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",15)="467:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",16)="467:28001:20001:48002" +^ZZCOVERAGE("XINDEX","POSTRTN",16,"FOR_LOOP",1)=16376 +^ZZCOVERAGE("XINDEX","POSTRTN",17)="15909:40006:40001:80007" +^ZZCOVERAGE("XINDEX","POSTRTN",18)="15909:0:0:0" +^ZZCOVERAGE("XINDEX","POSTRTN",19)="467:0:0:0" +^ZZCOVERAGE("XINDEX","Q")="7762:12000:20001:32001" +^ZZCOVERAGE("XINDEX","Q",0)="7762:4000:16001:20001" +^ZZCOVERAGE("XINDEX","QUOTE")="36371:188012:232009:420021" +^ZZCOVERAGE("XINDEX","QUOTE",0)="36371:156010:192008:348018" +^ZZCOVERAGE("XINDEX","QUOTE",0,"FOR_LOOP",1)=323268 +^ZZCOVERAGE("XINDEX","QUOTE",1)="36371:20002:20001:40003" +^ZZCOVERAGE("XINDEX","R")="85:0:8001:8001" +^ZZCOVERAGE("XINDEX","R",0)="85:0:0:0" +^ZZCOVERAGE("XINDEX","S")="17549:716055:988057:1704112" +^ZZCOVERAGE("XINDEX","S",0)="17549:28003:28003:56006" +^ZZCOVERAGE("XINDEX","SE2",0)="86891:176010:272017:448027" +^ZZCOVERAGE("XINDEX","SE2",1)="85079:264015:376016:640031" +^ZZCOVERAGE("XINDEX","SE2",2)="85079:72005:112010:184015" +^ZZCOVERAGE("XINDEX","SEP")="107216:736054:648038:1384092" +^ZZCOVERAGE("XINDEX","SEP",0)="107216:580045:440030:1020075" +^ZZCOVERAGE("XINDEX","SEP",0,"FOR_LOOP",1)=1019212 +^ZZCOVERAGE("XINDEX","SEP",1)="107216:120007:144005:264012" +^ZZCOVERAGE("XINDEX","SET")="85079:772044:1124063:1896107" +^ZZCOVERAGE("XINDEX","SET",0)="85079:176007:168008:344015" +^ZZCOVERAGE("XINDEX","SET",0,"FOR_LOOP",1)=74812 +^ZZCOVERAGE("XINDEX","SET",1)="85079:64005:144010:208015" +^ZZCOVERAGE("XINDEX","ST",0)="44620:68001:56004:124005" +^ZZCOVERAGE("XINDEX","ST",2)="44620:260012:376038:636050" +^ZZCOVERAGE("XINDEX","ST",2,"FOR_LOOP",1)=85813 +^ZZCOVERAGE("XINDEX","ST",2,"FOR_LOOP",2)=126272 +^ZZCOVERAGE("XINDEX","ST",3)="44620:224014:184014:408028" +^ZZCOVERAGE("XINDEX","ST",4)="44620:0:0:0" +^ZZCOVERAGE("XINDEX","U")="72:0:0:0" +^ZZCOVERAGE("XINDEX","U",0)="72:0:0:0" +^ZZCOVERAGE("XINDEX","W")="4584:156009:200014:356023" +^ZZCOVERAGE("XINDEX","W",0)="4584:0:16001:16001" +^ZZCOVERAGE("XINDEX","X")="220:0:0:0" +^ZZCOVERAGE("XINDEX","X",0)="220:0:0:0" +^ZZCOVERAGE("XINDEX","XINDEX")="1:32002:36000:68002" +^ZZCOVERAGE("XINDEX","XINDEX",3)="1:0:0:0" +^ZZCOVERAGE("XINDX1","A",0)="75:0:4000:4000" +^ZZCOVERAGE("XINDX1","A",1)="75:0:0:0" +^ZZCOVERAGE("XINDX1","A",2)="75:0:0:0" +^ZZCOVERAGE("XINDX1","B",0)="75:0:0:0" +^ZZCOVERAGE("XINDX1","B",4)="75:0:0:0" +^ZZCOVERAGE("XINDX1","B",6)="75:0:0:0" +^ZZCOVERAGE("XINDX1","B",7)="75:0:0:0" +^ZZCOVERAGE("XINDX1","E")="73:0:4000:4000" +^ZZCOVERAGE("XINDX1","E",0)="73:0:0:0" +^ZZCOVERAGE("XINDX1","XINDX1")="2:0:0:0" +^ZZCOVERAGE("XINDX1","XINDX1",3)="2:0:0:0" +^ZZCOVERAGE("XINDX10","ASK")="1:0:0:0" +^ZZCOVERAGE("XINDX10","ASK",1)="1:0:0:0" +^ZZCOVERAGE("XINDX10","ASK",2)="1:0:0:0" +^ZZCOVERAGE("XINDX10","ASK",3)="1:0:0:0" +^ZZCOVERAGE("XINDX10","ASK",8)="1:0:0:0" +^ZZCOVERAGE("XINDX2","%")="44620:132010:232014:364024" +^ZZCOVERAGE("XINDX2","%",0)="44620:96008:92005:188013" +^ZZCOVERAGE("XINDX2","%",0,"FOR_LOOP",1)=62810 +^ZZCOVERAGE("XINDX2","%",1)="44620:16001:68003:84004" +^ZZCOVERAGE("XINDX2","ARG")="329774:1516089:2124136:3640225" +^ZZCOVERAGE("XINDX2","ARG",1)="330498:328020:360021:688041" +^ZZCOVERAGE("XINDX2","ARG",2)="262221:228015:296022:524037" +^ZZCOVERAGE("XINDX2","ARG",3)="226556:260020:468034:728054" +^ZZCOVERAGE("XINDX2","ARG",4)="126854:104004:160011:264015" +^ZZCOVERAGE("XINDX2","ARG",5)="117750:136007:148011:284018" +^ZZCOVERAGE("XINDX2","ARG",6)="88629:60001:96003:156004" +^ZZCOVERAGE("XINDX2","ARG",7)="88424:80005:100006:180011" +^ZZCOVERAGE("XINDX2","ARG",8)="86550:72002:108007:180009" +^ZZCOVERAGE("XINDX2","ARGG")="18715:288018:352019:640037" +^ZZCOVERAGE("XINDX2","ARGG",0)="18715:76007:84005:160012" +^ZZCOVERAGE("XINDX2","ARGG",0,"FOR_LOOP",1)=49672 +^ZZCOVERAGE("XINDX2","ARGS")="44410:464031:676031:1140062" +^ZZCOVERAGE("XINDX2","ARGS",1)="63125:620038:844037:1464075" +^ZZCOVERAGE("XINDX2","ARGS",1,"FOR_LOOP",1)=291597 +^ZZCOVERAGE("XINDX2","ARGS",2)="63125:24001:60004:84005" +^ZZCOVERAGE("XINDX2","DN")="44410:208011:284017:492028" +^ZZCOVERAGE("XINDX2","DN",0)="44410:44003:108008:152011" +^ZZCOVERAGE("XINDX2","DN",1)="44410:152008:144006:296014" +^ZZCOVERAGE("XINDX2","EXT",1)="1970:4000:8001:12001" +^ZZCOVERAGE("XINDX2","EXT",2)="1970:0:0:0" +^ZZCOVERAGE("XINDX2","EXT",3)="1970:8001:12001:20002" +^ZZCOVERAGE("XINDX2","EXT",4)="1970:0:4000:4000" +^ZZCOVERAGE("XINDX2","FLUSH")="94:0:0:0" +^ZZCOVERAGE("XINDX2","FLUSH",0)="94:0:0:0" +^ZZCOVERAGE("XINDX2","FLUSH",1)="94:0:0:0" +^ZZCOVERAGE("XINDX2","FLUSH",1,"FOR_LOOP",1)=415 +^ZZCOVERAGE("XINDX2","FLUSH",2)="94:0:0:0" +^ZZCOVERAGE("XINDX2","FNC")="12:0:0:0" +^ZZCOVERAGE("XINDX2","FNC",0)="12:0:0:0" +^ZZCOVERAGE("XINDX2","FNC",1)="12:0:0:0" +^ZZCOVERAGE("XINDX2","FNC",2)="12:0:0:0" +^ZZCOVERAGE("XINDX2","FNC",3)="12:0:0:0" +^ZZCOVERAGE("XINDX2","FNC",4)="12:0:0:0" +^ZZCOVERAGE("XINDX2","FUN")="29121:340019:424027:764046" +^ZZCOVERAGE("XINDX2","FUN",0)="29121:36004:40002:76006" +^ZZCOVERAGE("XINDX2","FUN",1)="23452:48002:72003:120005" +^ZZCOVERAGE("XINDX2","FUN",2)="23452:20000:44003:64003" +^ZZCOVERAGE("XINDX2","FUN",3)="23393:96004:56005:152009" +^ZZCOVERAGE("XINDX2","FUN",3,"FOR_LOOP",1)=147754 +^ZZCOVERAGE("XINDX2","FUN",4)="23393:48003:56005:104008" +^ZZCOVERAGE("XINDX2","FUN",5)="23393:60004:92005:152009" +^ZZCOVERAGE("XINDX2","GLO",0)="9104:28002:28001:56003" +^ZZCOVERAGE("XINDX2","GLO",1)="9104:12001:20001:32002" +^ZZCOVERAGE("XINDX2","GLO",2)="9104:16000:28001:44001" +^ZZCOVERAGE("XINDX2","GLO",3)="9104:36002:80004:116006" +^ZZCOVERAGE("XINDX2","GLO",4)="9104:8000:4000:12000" +^ZZCOVERAGE("XINDX2","INC")="322910:416022:652029:1068051" +^ZZCOVERAGE("XINDX2","INC",0)="365505:320019:472020:792039" +^ZZCOVERAGE("XINDX2","INC2")="42595:104006:148008:252014" +^ZZCOVERAGE("XINDX2","INC2",0)="42595:48001:40003:88004" +^ZZCOVERAGE("XINDX2","LOC")="99702:576031:736052:1312083" +^ZZCOVERAGE("XINDX2","LOC",0)="99702:144010:156013:300023" +^ZZCOVERAGE("XINDX2","LOC",1)="99702:124004:148011:272015" +^ZZCOVERAGE("XINDX2","LOC",2)="99702:212011:272014:484025" +^ZZCOVERAGE("XINDX2","LOC",3)="99702:52005:96006:148011" +^ZZCOVERAGE("XINDX2","NAK",0)="996:0:0:0" +^ZZCOVERAGE("XINDX2","NAK",1)="996:0:0:0" +^ZZCOVERAGE("XINDX2","PAT")="205:4000:0:4000" +^ZZCOVERAGE("XINDX2","PAT",0)="205:0:0:0" +^ZZCOVERAGE("XINDX2","PAT",1)="205:4000:0:4000" +^ZZCOVERAGE("XINDX2","PAT",1,"FOR_LOOP",1)=457 +^ZZCOVERAGE("XINDX2","PAT",2)="205:0:0:0" +^ZZCOVERAGE("XINDX2","PATCODE")="457:4000:4000:8000" +^ZZCOVERAGE("XINDX2","PATCODE",0)="457:0:4000:4000" +^ZZCOVERAGE("XINDX2","PATCODE",1)="358:4000:0:4000" +^ZZCOVERAGE("XINDX2","PATCODE",1,"FOR_LOOP",1)=791 +^ZZCOVERAGE("XINDX2","PATCODE",2)="358:0:0:0" +^ZZCOVERAGE("XINDX2","PATCODE",3)="358:0:0:0" +^ZZCOVERAGE("XINDX2","PATCODE",4)="358:0:0:0" +^ZZCOVERAGE("XINDX2","PATQ")="99:4000:4000:8000" +^ZZCOVERAGE("XINDX2","PATQ",0)="99:0:4000:4000" +^ZZCOVERAGE("XINDX2","PATQ",0,"FOR_LOOP",1)=247 +^ZZCOVERAGE("XINDX2","PATQ",1)="99:4000:0:4000" +^ZZCOVERAGE("XINDX2","PATQ",2)="99:0:0:0" +^ZZCOVERAGE("XINDX2","PEEK")="112687:168013:248022:416035" +^ZZCOVERAGE("XINDX2","PEEK",0)="112687:120009:164010:284019" +^ZZCOVERAGE("XINDX2","PEEKDN")="17373:56002:40000:96002" +^ZZCOVERAGE("XINDX2","PEEKDN",0)="17373:48002:32000:80002" +^ZZCOVERAGE("XINDX2","REPCNT")="457:0:0:0" +^ZZCOVERAGE("XINDX2","REPCNT",0)="457:0:0:0" +^ZZCOVERAGE("XINDX2","REPCNT",0,"FOR_LOOP",1)=1004 +^ZZCOVERAGE("XINDX2","REPCNT",1)="457:0:0:0" +^ZZCOVERAGE("XINDX2","REPCNT",2)="457:0:0:0" +^ZZCOVERAGE("XINDX2","SPV",1)="3699:0:8001:8001" +^ZZCOVERAGE("XINDX2","SPV",2)="3699:0:0:0" +^ZZCOVERAGE("XINDX2","ST")="110835:464030:648049:1112079" +^ZZCOVERAGE("XINDX2","ST",0)="110835:192009:248021:440030" +^ZZCOVERAGE("XINDX2","ST",1)="110835:100008:156011:256019" +^ZZCOVERAGE("XINDX2","ST",2)="110835:76005:116005:192010" +^ZZCOVERAGE("XINDX2","TEXT",0)="59:0:0:0" +^ZZCOVERAGE("XINDX2","TEXT",1)="59:0:0:0" +^ZZCOVERAGE("XINDX2","TEXT",2)="59:0:0:0" +^ZZCOVERAGE("XINDX2","TEXT",3)="59:0:0:0" +^ZZCOVERAGE("XINDX2","UP")="44410:116012:180012:296024" +^ZZCOVERAGE("XINDX2","UP",1)="44410:112012:116006:228018" +^ZZCOVERAGE("XINDX2","VA")="5073:16001:20000:36001" +^ZZCOVERAGE("XINDX2","VA",0)="5073:4000:12000:16000" +^ZZCOVERAGE("XINDX2","VA",1)="5073:8000:4000:12000" +^ZZCOVERAGE("XINDX2","VT")="10205:4001:24002:28003" +^ZZCOVERAGE("XINDX2","VT",0)="10205:0:8000:8000" +^ZZCOVERAGE("XINDX2","VT",1)="10205:0:4000:4000" +^ZZCOVERAGE("XINDX3","A",0)="8136:36001:12001:48002" +^ZZCOVERAGE("XINDX3","ASM")="312:12001:0:12001" +^ZZCOVERAGE("XINDX3","ASM",0)="312:0:0:0" +^ZZCOVERAGE("XINDX3","ASM",1)="312:8001:0:8001" +^ZZCOVERAGE("XINDX3","ASM",1,"FOR_LOOP",1)=2110 +^ZZCOVERAGE("XINDX3","ASM",2)="312:0:0:0" +^ZZCOVERAGE("XINDX3","DN")="498:4000:4000:8000" +^ZZCOVERAGE("XINDX3","DN",0)="498:0:4000:4000" +^ZZCOVERAGE("XINDX3","DN",1)="498:4000:0:4000" +^ZZCOVERAGE("XINDX3","FL")="63250:152007:260014:412021" +^ZZCOVERAGE("XINDX3","FL",1)="63250:72000:144009:216009" +^ZZCOVERAGE("XINDX3","FL",2)="63250:64006:80004:144010" +^ZZCOVERAGE("XINDX3","INC")="145482:224018:308026:532044" +^ZZCOVERAGE("XINDX3","INC",0)="145482:188015:196015:384030" +^ZZCOVERAGE("XINDX3","KL",1)="2218:0:4000:4000" +^ZZCOVERAGE("XINDX3","KL1")="28:0:0:0" +^ZZCOVERAGE("XINDX3","KL1",0)="28:0:0:0" +^ZZCOVERAGE("XINDX3","KL2")="724:4000:28000:32000" +^ZZCOVERAGE("XINDX3","KL2",0)="724:0:0:0" +^ZZCOVERAGE("XINDX3","KL2",1)="724:0:4000:4000" +^ZZCOVERAGE("XINDX3","KL2",2)="724:0:0:0" +^ZZCOVERAGE("XINDX3","KL3")="3320:12002:36002:48004" +^ZZCOVERAGE("XINDX3","KL3",0)="3320:4000:8000:12000" +^ZZCOVERAGE("XINDX3","KL3",1)="3320:4001:4000:8001" +^ZZCOVERAGE("XINDX3","KL5",0)="3320:0:20002:20002" +^ZZCOVERAGE("XINDX3","MULT")="498:8001:4000:12001" +^ZZCOVERAGE("XINDX3","MULT",0)="498:4001:0:4001" +^ZZCOVERAGE("XINDX3","MULT",1)="498:4000:4000:8000" +^ZZCOVERAGE("XINDX3","MULT",1,"FOR_LOOP",1)=2401 +^ZZCOVERAGE("XINDX3","MULT",2)="498:0:0:0" +^ZZCOVERAGE("XINDX3","N2",0)="23604:68004:36003:104007" +^ZZCOVERAGE("XINDX3","N2",3)="11802:16002:4000:20002" +^ZZCOVERAGE("XINDX3","N2",4)="187:0:0:0" +^ZZCOVERAGE("XINDX3","N2",5)="187:0:0:0" +^ZZCOVERAGE("XINDX3","N2",6)="11628:12001:20002:32003" +^ZZCOVERAGE("XINDX3","N2",7)="11628:12000:8000:20000" +^ZZCOVERAGE("XINDX3","NE")="779:32002:16001:48003" +^ZZCOVERAGE("XINDX3","NE",1)="2500:4000:4000:8000" +^ZZCOVERAGE("XINDX3","NE",2)="2500:4000:20000:24000" +^ZZCOVERAGE("XINDX3","PEEK")="498:0:0:0" +^ZZCOVERAGE("XINDX3","PEEK",0)="498:0:0:0" +^ZZCOVERAGE("XINDX3","PEEKDN")="39:0:0:0" +^ZZCOVERAGE("XINDX3","PEEKDN",0)="39:0:0:0" +^ZZCOVERAGE("XINDX3","RD",0)="85:0:0:0" +^ZZCOVERAGE("XINDX3","RD1",0)="278:0:4001:4001" +^ZZCOVERAGE("XINDX3","RD1",3)="193:0:4000:4000" +^ZZCOVERAGE("XINDX3","RD1",4)="85:0:0:0" +^ZZCOVERAGE("XINDX3","RD1",5)="85:0:0:0" +^ZZCOVERAGE("XINDX3","RD2")="85:0:4000:4000" +^ZZCOVERAGE("XINDX3","RD2",0)="255:0:0:0" +^ZZCOVERAGE("XINDX3","RD2",1)="170:0:0:0" +^ZZCOVERAGE("XINDX3","RD2",2)="170:0:4000:4000" +^ZZCOVERAGE("XINDX3","RD2",3)="85:0:0:0" +^ZZCOVERAGE("XINDX3","RD3")="108:0:0:0" +^ZZCOVERAGE("XINDX3","RD3",0)="161:0:0:0" +^ZZCOVERAGE("XINDX3","RD3",1)="37:0:0:0" +^ZZCOVERAGE("XINDX3","RD3",2)="37:0:0:0" +^ZZCOVERAGE("XINDX3","S",1)="17579:48005:56003:104008" +^ZZCOVERAGE("XINDX3","S2",0)="110559:164008:220011:384019" +^ZZCOVERAGE("XINDX3","S2",1)="92980:64007:96005:160012" +^ZZCOVERAGE("XINDX3","S2",2)="92980:52004:100005:152009" +^ZZCOVERAGE("XINDX3","S2",3)="87238:60005:68003:128008" +^ZZCOVERAGE("XINDX3","S2",4)="63916:68007:68004:136011" +^ZZCOVERAGE("XINDX3","S2",5)="846:0:0:0" +^ZZCOVERAGE("XINDX3","S2",6)="846:0:4000:4000" +^ZZCOVERAGE("XINDX3","S2",10)="63916:56004:60003:116007" +^ZZCOVERAGE("XINDX3","S2",11)="62481:40002:60003:100005" +^ZZCOVERAGE("XINDX3","S2",12)="62313:56003:56005:112008" +^ZZCOVERAGE("XINDX3","S2",13)="61815:76007:152010:228017" +^ZZCOVERAGE("XINDX3","UP")="498:8000:4000:12000" +^ZZCOVERAGE("XINDX3","UP",1)="498:8000:4000:12000" +^ZZCOVERAGE("XINDX3","VLN",1)="15909:32002:16001:48003" +^ZZCOVERAGE("XINDX3","VLN",2)="15909:44002:28003:72005" +^ZZCOVERAGE("XINDX3","VLNF")="15909:120006:60005:180011" +^ZZCOVERAGE("XINDX3","VLNF",0)="15909:32002:12001:44003" +^ZZCOVERAGE("XINDX4","CNG")="2186:0:24001:24001" +^ZZCOVERAGE("XINDX4","CNG",0)="2186:0:0:0" +^ZZCOVERAGE("XINDX4","CNG",2)="2186:0:8001:8001" +^ZZCOVERAGE("XINDX4","CNG",2,"FOR_LOOP",1)=2202 +^ZZCOVERAGE("XINDX4","CNG",3)="2186:0:12000:12000" +^ZZCOVERAGE("XINDX4","DG",0)="8937:20003:16000:36003" +^ZZCOVERAGE("XINDX4","DG",1)="8937:12000:16001:28001" +^ZZCOVERAGE("XINDX4","DG",2)="8937:8001:20002:28003" +^ZZCOVERAGE("XINDX4","DG",3)="8937:16000:12000:28000" +^ZZCOVERAGE("XINDX4","DG",4)="8937:4000:12001:16001" +^ZZCOVERAGE("XINDX4","DG",5)="8937:0:12002:12002" +^ZZCOVERAGE("XINDX4","DG",6)="8937:12001:12000:24001" +^ZZCOVERAGE("XINDX4","DG",7)="8937:12000:20003:32003" +^ZZCOVERAGE("XINDX4","DG",8)="8937:24001:4001:28002" +^ZZCOVERAGE("XINDX4","DG",9)="8937:4000:12001:16001" +^ZZCOVERAGE("XINDX4","DG",10)="8937:16001:28001:44002" +^ZZCOVERAGE("XINDX4","DG",11)="8937:8000:12000:20000" +^ZZCOVERAGE("XINDX4","DG",12)="8937:4000:16002:20002" +^ZZCOVERAGE("XINDX4","DG",13)="8937:8000:12002:20002" +^ZZCOVERAGE("XINDX4","DG",14)="8937:0:4000:4000" +^ZZCOVERAGE("XINDX4","DG",15)="8937:36002:32002:68004" +^ZZCOVERAGE("XINDX4","DG",16)="8937:8001:4001:12002" +^ZZCOVERAGE("XINDX4","DG",17)="8387:12002:4000:16002" +^ZZCOVERAGE("XINDX4","DG1")="8449:168011:180013:348024" +^ZZCOVERAGE("XINDX4","DG1",0)="8449:12001:16001:28002" +^ZZCOVERAGE("XINDX4","FR",0)="525:0:4001:4001" +^ZZCOVERAGE("XINDX4","FR",1)="525:0:0:0" +^ZZCOVERAGE("XINDX4","FR",2)="525:0:0:0" +^ZZCOVERAGE("XINDX4","INSIDE")="2202:4001:32001:36002" +^ZZCOVERAGE("XINDX4","INSIDE",0)="2202:0:16000:16000" +^ZZCOVERAGE("XINDX4","INSIDE",1)="2202:0:4000:4000" +^ZZCOVERAGE("XINDX4","INSIDE",2)="2202:4001:4000:8001" +^ZZCOVERAGE("XINDX4","LO",1)="259:0:0:0" +^ZZCOVERAGE("XINDX4","LO",2)="259:0:0:0" +^ZZCOVERAGE("XINDX4","LO",3)="259:0:0:0" +^ZZCOVERAGE("XINDX4","LO",4)="259:0:4000:4000" +^ZZCOVERAGE("XINDX4","LO",4,"FOR_LOOP",1)=260 +^ZZCOVERAGE("XINDX4","LO",5)="260:0:0:0" +^ZZCOVERAGE("XINDX4","LO",6)="260:0:0:0" +^ZZCOVERAGE("XINDX4","LO",7)="260:0:0:0" +^ZZCOVERAGE("XINDX4","LO",8)="89:0:0:0" +^ZZCOVERAGE("XINDX4","LO",9)="89:0:0:0" +^ZZCOVERAGE("XINDX4","LO",10)="89:4001:0:4001" +^ZZCOVERAGE("XINDX4","LO",12)="259:0:0:0" +^ZZCOVERAGE("XINDX4","LO",13)="259:0:0:0" +^ZZCOVERAGE("XINDX4","LOOP")="14735:44003:108008:152011" +^ZZCOVERAGE("XINDX4","LOOP",0)="14735:28002:72005:100007" +^ZZCOVERAGE("XINDX4","LOOP",0,"FOR_LOOP",1)=68121 +^ZZCOVERAGE("XINDX4","LOOP",1)="14735:4000:32003:36003" +^ZZCOVERAGE("XINDX4","PAREN")="2638:24000:36004:60004" +^ZZCOVERAGE("XINDX4","PAREN",0)="2638:4000:8000:12000" +^ZZCOVERAGE("XINDX4","PAREN",1)="2638:20000:16001:36001" +^ZZCOVERAGE("XINDX4","PAREN",1,"FOR_LOOP",1)=50171 +^ZZCOVERAGE("XINDX4","PAREN",2)="2638:0:8002:8002" +^ZZCOVERAGE("XINDX4","PAREN",3)="2638:0:0:0" +^ZZCOVERAGE("XINDX4","PRUNE")="2186:8001:16001:24002" +^ZZCOVERAGE("XINDX4","PRUNE",0)="2186:8001:4000:12001" +^ZZCOVERAGE("XINDX4","PRUNE",1)="2186:0:8001:8001" +^ZZCOVERAGE("XINDX4","PRUNE",1,"FOR_LOOP",1)=2186 +^ZZCOVERAGE("XINDX4","PRUNE",2)="2186:0:4000:4000" +^ZZCOVERAGE("XINDX4","PRUNE",2,"FOR_LOOP",1)=2187 +^ZZCOVERAGE("XINDX4","PRUNE",3)="2186:0:0:0" +^ZZCOVERAGE("XINDX4","Q",1)="747:8000:0:8000" +^ZZCOVERAGE("XINDX4","Q",2)="747:0:0:0" +^ZZCOVERAGE("XINDX4","QUOTE")="2402:28002:28000:56002" +^ZZCOVERAGE("XINDX4","QUOTE",0)="2402:20002:20000:40002" +^ZZCOVERAGE("XINDX4","QUOTE",0,"FOR_LOOP",1)=23674 +^ZZCOVERAGE("XINDX4","QUOTE",1)="2402:0:0:0" +^ZZCOVERAGE("XINDX4","QUOTE",2)="2402:8000:4000:12000" +^ZZCOVERAGE("XINDX4","ST")="8937:24000:16002:40002" +^ZZCOVERAGE("XINDX4","ST",0)="8937:12000:8000:20000" +^ZZCOVERAGE("XINDX4","ST",1)="8937:8000:8002:16002" +^ZZCOVERAGE("XINDX4","WR",0)="4584:12001:12000:24001" +^ZZCOVERAGE("XINDX4","WR",1)="4584:0:8000:8000" +^ZZCOVERAGE("XINDX4","WR",2)="4584:72004:56006:128010" +^ZZCOVERAGE("XINDX4","WR",2,"FOR_LOOP",1)=27607 +^ZZCOVERAGE("XINDX4","WR",3)="23023:8002:32003:40005" +^ZZCOVERAGE("XINDX4","WR",4)="20835:12000:32001:44001" +^ZZCOVERAGE("XINDX4","WR",5)="20835:24002:8001:32003" +^ZZCOVERAGE("XINDX4","WR",6)="20835:24000:36002:60002" +^ZZCOVERAGE("XINDX4","WR",7)="20835:0:0:0" +^ZZCOVERAGE("XINDX4","WR",8)="4584:4000:0:4000" +^ZZCOVERAGE("XINDX4","XE",0)="220:0:0:0" +^ZZCOVERAGE("XINDX4","XE",1)="220:0:0:0" +^ZZCOVERAGE("XINDX5","A",0)="468:0:4000:4000" +^ZZCOVERAGE("XINDX5","A",1)="467:28002:24000:52002" +^ZZCOVERAGE("XINDX5","A",1,"FOR_LOOP",1)=4011 +^ZZCOVERAGE("XINDX5","A",2)="467:0:0:0" +^ZZCOVERAGE("XINDX5","AA")="3544:48004:68006:116010" +^ZZCOVERAGE("XINDX5","AA",0)="3544:8002:16003:24005" +^ZZCOVERAGE("XINDX5","AA",1)="1902:0:4000:4000" +^ZZCOVERAGE("XINDX5","AA",2)="1902:4001:0:4001" +^ZZCOVERAGE("XINDX5","AA",3)="1902:12001:4001:16002" +^ZZCOVERAGE("XINDX5","AA",4)="1902:12000:32002:44002" +^ZZCOVERAGE("XINDX5","AA",5)="1902:0:0:0" +^ZZCOVERAGE("XINDX5","AA",6)="1209:0:0:0" +^ZZCOVERAGE("XINDX5","AA",7)="1209:8000:4000:12000" +^ZZCOVERAGE("XINDX5","AA",8)="1209:0:0:0" +^ZZCOVERAGE("XINDX5","AA",9)="1642:0:4000:4000" +^ZZCOVERAGE("XINDX5","AA",10)="1594:0:0:0" +^ZZCOVERAGE("XINDX5","AA",11)="1594:4000:4000:8000" +^ZZCOVERAGE("XINDX5","AA",12)="1642:0:0:0" +^ZZCOVERAGE("XINDX5","B",0)="1:0:0:0" +^ZZCOVERAGE("XINDX5","CLEAN",1)="1:0:0:0" +^ZZCOVERAGE("XINDX5","CLEAN",2)="1:0:0:0" +^ZZCOVERAGE("XINDX5","CLEAN",3)="1:0:0:0" +^ZZCOVERAGE("XINDX5","END",0)="1:0:0:0" +^ZZCOVERAGE("XINDX5","END",1)="1:0:0:0" +^ZZCOVERAGE("XINDX5","END",2)="1:0:0:0" +^ZZCOVERAGE("XINDX5","END",3)="1:0:0:0" +^ZZCOVERAGE("XINDX5","VTAG")="4320:12000:16001:28001" +^ZZCOVERAGE("XINDX5","VTAG",0)="4320:12000:8001:20001" +^ZZCOVERAGE("XINDX5","VTAG",1)="4320:0:4000:4000" +^ZZCOVERAGE("XINDX5","XINDX5",3)="1:0:0:0" +^ZZCOVERAGE("XINDX5","XINDX5",4)="1:0:0:0" +^ZZCOVERAGE("XINDX5","XINDX5",5)="1:0:0:0" +^ZZCOVERAGE("XINDX5","XINDX5",7)="1:0:0:0" +^ZZCOVERAGE("XINDX51","B")="1:0:4001:4001" +^ZZCOVERAGE("XINDX51","B",0)="1:0:0:0" +^ZZCOVERAGE("XINDX51","B",1)="1:0:0:0" +^ZZCOVERAGE("XINDX51","B",3)="1:0:4001:4001" +^ZZCOVERAGE("XINDX51","B",3,"FOR_LOOP",1)=468 +^ZZCOVERAGE("XINDX51","B",4)="1:0:0:0" +^ZZCOVERAGE("XINDX51","B",6)="1:0:0:0" +^ZZCOVERAGE("XINDX51","BHDR")="60:0:4000:4000" +^ZZCOVERAGE("XINDX51","BHDR",0)="60:0:4000:4000" +^ZZCOVERAGE("XINDX51","BHDR",1)="60:0:0:0" +^ZZCOVERAGE("XINDX51","END",0)="1:0:0:0" +^ZZCOVERAGE("XINDX51","HD")="60:0:0:0" +^ZZCOVERAGE("XINDX51","HD",0)="60:0:0:0" +^ZZCOVERAGE("XINDX51","HD",1)="60:0:0:0" +^ZZCOVERAGE("XINDX51","HD1")="1:0:0:0" +^ZZCOVERAGE("XINDX51","HD1",0)="1:0:0:0" +^ZZCOVERAGE("XINDX51","HD1",1)="1:0:0:0" +^ZZCOVERAGE("XINDX51","HD2")="60:4000:0:4000" +^ZZCOVERAGE("XINDX51","HD2",0)="60:4000:0:4000" +^ZZCOVERAGE("XINDX51","HD2",1)="60:0:0:0" +^ZZCOVERAGE("XINDX51","WAIT")="1:0:0:0" +^ZZCOVERAGE("XINDX51","WAIT",0)="1:0:0:0" +^ZZCOVERAGE("XINDX51","WAIT",1)="1:0:0:0" +^ZZCOVERAGE("XINDX51","WAIT",2)="1:0:0:0" +^ZZCOVERAGE("XINDX51","WERR")="60:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",0)="60:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",1)="60:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",2)="60:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",2,"FOR_LOOP",1)=135 +^ZZCOVERAGE("XINDX51","WERR",3)="75:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",4)="75:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",5)="75:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",6)="75:0:0:0" +^ZZCOVERAGE("XINDX51","WERR",7)="60:0:0:0" +^ZZCOVERAGE("XINDX51","WORL")="70:0:0:0" +^ZZCOVERAGE("XINDX51","WORL",0)="70:0:0:0" +^ZZCOVERAGE("XINDX51","WORL",1)="70:0:0:0" +^ZZCOVERAGE("XINDX51","WORL",2)="70:0:0:0" +^ZZCOVERAGE("XINDX51","WORL",3)="70:0:0:0" +^ZZCOVERAGE("XINDX51","WORL",3,"FOR_LOOP",1)=76 +^ZZCOVERAGE("XINDX51","WORL",4)="70:0:0:0" +^ZZCOVERAGE("XINDX52","CASE")="2:0:0:0" +^ZZCOVERAGE("XINDX52","CASE",0)="2:0:0:0" +^ZZCOVERAGE("XINDX52","CASE",1)="2:0:0:0" +^ZZCOVERAGE("XINDX6","ANS")="2:0:0:0" +^ZZCOVERAGE("XINDX6","ANS",0)="2:0:0:0" +^ZZCOVERAGE("XINDX6","ANS",1)="2:0:0:0" +^ZZCOVERAGE("XINDX6","ANS",1,"FOR_LOOP",1)=2 +^ZZCOVERAGE("XINDX6","ANS",2)="2:0:0:0" +^ZZCOVERAGE("XINDX6","ASKRTN")="1:4000:0:4000" +^ZZCOVERAGE("XINDX6","ASKRTN",1)="1:0:0:0" +^ZZCOVERAGE("XINDX6","ASKRTN",1,"FOR_LOOP",1)=468 +^ZZCOVERAGE("XINDX6","ASKRTN",2)="1:4000:0:4000" +^ZZCOVERAGE("XINDX6","ASKRTN",2,"FOR_LOOP",1)=468 +^ZZCOVERAGE("XINDX6","ASKRTN",3)="1:0:0:0" +^ZZCOVERAGE("XINDX6","DEVICE",0)="1:0:0:0" +^ZZCOVERAGE("XINDX6","DEVICE",2)="1:0:0:0" +^ZZCOVERAGE("XINDX6","DEVICE",3)="1:0:0:0" +^ZZCOVERAGE("XINDX6","L7",0)="1:0:0:0" +^ZZCOVERAGE("XINDX6","L7",1)="1:0:0:0" +^ZZCOVERAGE("XINDX6","NY")="1:0:0:0" +^ZZCOVERAGE("XINDX6","NY",0)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM")="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",1)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",2)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",2,"FOR_LOOP",1)=10 +^ZZCOVERAGE("XINDX6","PARAM",3)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",4)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",5)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",6)="1:0:0:0" +^ZZCOVERAGE("XINDX6","PARAM",7)="1:0:0:0" +^ZZCOVERAGE("XINDX6","RD")="2:0:0:0" +^ZZCOVERAGE("XINDX6","RD",0)="2:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",5)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",6)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",7)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",8)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",9)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",10)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",11)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",12)="1:0:0:0" +^ZZCOVERAGE("XINDX6","XINDX6",13)="1:0:0:0" +^ZZCOVERAGE("XINDX6","YN")="1:0:0:0" +^ZZCOVERAGE("XINDX6","YN",0)="1:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD")="1:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",0)="1:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",1)="1:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",1,"FOR_LOOP",1)=10 +^ZZCOVERAGE("XINDX7","BUILD",2)="9:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",3)="6:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",3,"FOR_LOOP",1)=85 +^ZZCOVERAGE("XINDX7","BUILD",4)="79:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",5)="79:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",6)="6:0:0:0" +^ZZCOVERAGE("XINDX7","BUILD",7)="1:0:0:0" +^ZZCOVERAGE("XINDX7","HDR")="2:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",0)="2:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",1)="2:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",2)="1:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",3)="1:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",4)="1:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",5)="1:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",6)="2:0:0:0" +^ZZCOVERAGE("XINDX7","HDR",7)="2:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP")="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",1)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",2)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",3)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",4)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",6)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",7)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",7,"FOR_LOOP",1)=468 +^ZZCOVERAGE("XINDX7","SETUP",8)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",9)="1:0:0:0" +^ZZCOVERAGE("XINDX7","SETUP",10)="1:0:0:0" +^ZZCOVERAGE("XINDX9","ADD")="406841:436032:684041:1120073" +^ZZCOVERAGE("XINDX9","ADD",0)="598820:552042:692040:1244082" +^ZZCOVERAGE("XINDX9","AR")="197699:748039:1052073:1800112" +^ZZCOVERAGE("XINDX9","AR",0)="197699:708036:936061:1644097" +^ZZCOVERAGE("XINDX9","CASE")="23461:28003:92005:120008" +^ZZCOVERAGE("XINDX9","CASE",0)="23461:12002:48003:60005" +^ZZCOVERAGE("XINDX9","CASE",1)="23461:12001:28000:40001" +^ZZCOVERAGE("XINDX9","DN")="45002:204010:248016:452026" +^ZZCOVERAGE("XINDX9","DN",0)="45002:176008:196011:372019" +^ZZCOVERAGE("XINDX9","DN",1)="45002:16001:24003:40004" +^ZZCOVERAGE("XINDX9","EXT",1)="1970:4000:12001:16001" +^ZZCOVERAGE("XINDX9","FNC")="29146:96005:104009:200014" +^ZZCOVERAGE("XINDX9","FNC",0)="29146:28001:20003:48004" +^ZZCOVERAGE("XINDX9","FNC",1)="29146:44002:72005:116007" +^ZZCOVERAGE("XINDX9","FNC",2)="12:0:0:0" +^ZZCOVERAGE("XINDX9","FNC",3)="12:0:0:0" +^ZZCOVERAGE("XINDX9","FUNC")="29134:284015:400024:684039" +^ZZCOVERAGE("XINDX9","FUNC",1)="29134:112005:120007:232012" +^ZZCOVERAGE("XINDX9","FUNC",2)="23461:48003:72004:120007" +^ZZCOVERAGE("XINDX9","FUNC",3)="23461:20000:32001:52001" +^ZZCOVERAGE("XINDX9","FX",0)="23461:68004:116009:184013" +^ZZCOVERAGE("XINDX9","GVAR")="29134:96004:180015:276019" +^ZZCOVERAGE("XINDX9","GVAR",0)="29134:28000:44003:72003" +^ZZCOVERAGE("XINDX9","GVAR",1)="29134:32001:72005:104006" +^ZZCOVERAGE("XINDX9","GVAR",2)="29134:16000:24002:40002" +^ZZCOVERAGE("XINDX9","INC")="29134:64003:64007:128010" +^ZZCOVERAGE("XINDX9","INC",0)="29134:20001:12001:32002" +^ZZCOVERAGE("XINDX9","INC",1)="29134:32002:40004:72006" +^ZZCOVERAGE("XINDX9","NEW")="287703:532032:660032:1192064" +^ZZCOVERAGE("XINDX9","NEW",0)="287703:200012:244014:444026" +^ZZCOVERAGE("XINDX9","NEW",1)="287703:220014:248008:468022" +^ZZCOVERAGE("XINDX9","NUM")="45379:292023:340026:632049" +^ZZCOVERAGE("XINDX9","NUM",0)="45379:92006:84006:176012" +^ZZCOVERAGE("XINDX9","NUM",0,"FOR_LOOP",1)=71145 +^ZZCOVERAGE("XINDX9","NUM",1)="45379:40005:48002:88007" +^ZZCOVERAGE("XINDX9","NUM",2)="45379:40004:56005:96009" +^ZZCOVERAGE("XINDX9","NUM",3)="45379:76003:88008:164011" +^ZZCOVERAGE("XINDX9","NUM",4)="45379:24003:40003:64006" +^ZZCOVERAGE("XINDX9","PA2",0)="518346:544028:668032:1212060" +^ZZCOVERAGE("XINDX9","PA2",1)="472665:532043:620035:1152078" +^ZZCOVERAGE("XINDX9","PA2",2)="317803:264019:292021:556040" +^ZZCOVERAGE("XINDX9","PA2",3)="317803:200013:324018:524031" +^ZZCOVERAGE("XINDX9","PA2",4)="307072:348020:492025:840045" +^ZZCOVERAGE("XINDX9","PA2",5)="197397:160015:296011:456026" +^ZZCOVERAGE("XINDX9","PA2",6)="152018:120016:132005:252021" +^ZZCOVERAGE("XINDX9","PA2",7)="152018:116009:112008:228017" +^ZZCOVERAGE("XINDX9","PA2",8)="151813:96008:168010:264018" +^ZZCOVERAGE("XINDX9","PA2",9)="151813:100008:172009:272017" +^ZZCOVERAGE("XINDX9","PA2",10)="151813:220008:324022:544030" +^ZZCOVERAGE("XINDX9","PA2",11)="151813:168011:152010:320021" +^ZZCOVERAGE("XINDX9","PA2",12)="151813:128009:148012:276021" +^ZZCOVERAGE("XINDX9","PA2",13)="151813:136005:104009:240014" +^ZZCOVERAGE("XINDX9","PARSE")="45681:3356226:4340257:7696483" +^ZZCOVERAGE("XINDX9","PARSE",0)="45681:104007:108007:212014" +^ZZCOVERAGE("XINDX9","PAT")="205:0:0:0" +^ZZCOVERAGE("XINDX9","PAT",0)="205:0:0:0" +^ZZCOVERAGE("XINDX9","PAT",1)="205:0:0:0" +^ZZCOVERAGE("XINDX9","PAT",1,"FOR_LOOP",1)=1185 +^ZZCOVERAGE("XINDX9","PAT",2)="205:0:0:0" +^ZZCOVERAGE("XINDX9","PAT",3)="205:0:0:0" +^ZZCOVERAGE("XINDX9","PAT",4)="205:0:0:0" +^ZZCOVERAGE("XINDX9","PATC")="28:0:0:0" +^ZZCOVERAGE("XINDX9","PATC",0)="28:0:0:0" +^ZZCOVERAGE("XINDX9","PATQ")="99:0:8000:8000" +^ZZCOVERAGE("XINDX9","PATQ",0)="99:0:0:0" +^ZZCOVERAGE("XINDX9","PATQ",0,"FOR_LOOP",1)=247 +^ZZCOVERAGE("XINDX9","PATQ",1)="99:0:0:0" +^ZZCOVERAGE("XINDX9","PATQ",2)="99:0:8000:8000" +^ZZCOVERAGE("XINDX9","PATU")="15:0:0:0" +^ZZCOVERAGE("XINDX9","PATU",0)="15:0:0:0" +^ZZCOVERAGE("XINDX9","PEND",0)="45681:68001:140014:208015" +^ZZCOVERAGE("XINDX9","PEND",1)="45681:36004:52005:88009" +^ZZCOVERAGE("XINDX9","QUOTE")="35724:244013:304019:548032" +^ZZCOVERAGE("XINDX9","QUOTE",0)="36272:172010:140009:312019" +^ZZCOVERAGE("XINDX9","QUOTE",0,"FOR_LOOP",1)=323021 +^ZZCOVERAGE("XINDX9","QUOTE",1)="36272:28001:72004:100005" +^ZZCOVERAGE("XINDX9","QUOTE",2)="35724:28001:24003:52004" +^ZZCOVERAGE("XINDX9","QUOTE",3)="35724:16001:52002:68003" +^ZZCOVERAGE("XINDX9","SPV",0)="3703:4000:12000:16000" +^ZZCOVERAGE("XINDX9","SPV",1)="3703:8001:4000:12001" +^ZZCOVERAGE("XINDX9","SPV",2)="3703:8001:4000:12001" +^ZZCOVERAGE("XINDX9","SPV",3)="3703:4000:8001:12001" +^ZZCOVERAGE("XINDX9","STR")="287703:560037:724043:1284080" +^ZZCOVERAGE("XINDX9","STR",0)="287703:300018:312020:612038" +^ZZCOVERAGE("XINDX9","SUM")="213322:612034:916052:1528086" +^ZZCOVERAGE("XINDX9","SUM",0)="213322:160009:208011:368020" +^ZZCOVERAGE("XINDX9","SUM",1)="213322:212007:280018:492025" +^ZZCOVERAGE("XINDX9","SUM",2)="213322:136012:268012:404024" +^ZZCOVERAGE("XINDX9","UP")="45002:396026:440029:836055" +^ZZCOVERAGE("XINDX9","UP",0)="45002:24003:44001:68004" +^ZZCOVERAGE("XINDX9","UP",1)="45002:180008:192016:372024" +^ZZCOVERAGE("XINDX9","UP",2)="45002:136010:128005:264015" +^ZZCOVERAGE("XINDX9","UP",3)="45002:40003:52003:92006" +^ZZCOVERAGE("XINDX9","VAR")="138809:828044:1004072:1832116" +^ZZCOVERAGE("XINDX9","VAR",0)="138809:376018:336017:712035" +^ZZCOVERAGE("XINDX9","VAR",0,"FOR_LOOP",1)=462128 +^ZZCOVERAGE("XINDX9","VAR",1)="138809:292018:376034:668052" +^ZZCOVERAGE("XINDX9","VAR",2)="138809:116003:144008:260011" +^ZZCOVERAGE("XINDX9","XINDX9")="45681:296016:320021:616037" +^ZZCOVERAGE("XINDX9","XINDX9",3)="45681:52003:128006:180009" +^ZZCOVERAGE("XINDX9","XINDX9",4)="45681:164006:112008:276014" +^ZZCOVERAGE("XINDX9","XINDX9",4,"FOR_LOOP",1)=128269 +^ZZCOVERAGE("XINDX9","XINDX9",5)="45681:48004:52005:100009" +^ZZCOVERAGE("XLFDT","DT")="1:0:0:0" +^ZZCOVERAGE("XLFDT","DT",0)="1:0:0:0" +^ZZCOVERAGE("XLFDT","DT",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT","HR")="3:0:0:0" +^ZZCOVERAGE("XLFDT","HR",0)="3:0:0:0" +^ZZCOVERAGE("XLFDT","HR",1)="3:0:0:0" +^ZZCOVERAGE("XLFDT","HTE")="1:0:0:0" +^ZZCOVERAGE("XLFDT","HTE",0)="1:0:0:0" +^ZZCOVERAGE("XLFDT","HTE",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT","HTE",2)="1:0:0:0" +^ZZCOVERAGE("XLFDT","HTE",3)="1:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM")="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",0)="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",1)="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",2)="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",3)="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",4)="2:0:0:0" +^ZZCOVERAGE("XLFDT","HTFM",5)="2:0:0:0" +^ZZCOVERAGE("XLFDT","T2",0)="1:0:0:0" +^ZZCOVERAGE("XLFDT","T2",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT","YMD")="2:0:0:0" +^ZZCOVERAGE("XLFDT","YMD",1)="2:0:0:0" +^ZZCOVERAGE("XLFDT","YMD",2)="2:0:0:0" +^ZZCOVERAGE("XLFDT","YMD",3)="2:0:0:0" +^ZZCOVERAGE("XLFDT","YMD",4)="2:0:0:0" +^ZZCOVERAGE("XLFDT","YMD",5)="2:0:0:0" +^ZZCOVERAGE("XLFDT1","F1",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","FMT")="1:0:0:0" +^ZZCOVERAGE("XLFDT1","FMT",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","FMT",2)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","M")="1:0:0:0" +^ZZCOVERAGE("XLFDT1","M",0)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","TM",1)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","TM",2)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","TM",3)="1:0:0:0" +^ZZCOVERAGE("XLFDT1","TM",7)="1:0:0:0" +^ZZCOVERAGE("XPDRSUM","SUMB")="467:1808124:180014:1988138" +^ZZCOVERAGE("XPDRSUM","SUMB",0)="467:8000:0:8000" +^ZZCOVERAGE("XPDRSUM","SUMB",2)="467:0:0:0" +^ZZCOVERAGE("XPDRSUM","SUMB",3)="467:1796124:180014:1976138" +^ZZCOVERAGE("XPDRSUM","SUMB",3,"FOR_LOOP",1)=44620 +^ZZCOVERAGE("XPDRSUM","SUMB",3,"FOR_LOOP",2)=1566704 +^ZZCOVERAGE("XPDRSUM","SUMB",4)="467:0:0:0" +^ZZCOVERAGE("XTRUTL1","BUILD")="1:0:0:0" +^ZZCOVERAGE("XTRUTL1","BUILD",0)="1:0:0:0" +^ZZCOVERAGE("XTRUTL1","BUILD",1)="1:0:0:0" +^ZZCOVERAGE("XTRUTL1","BUILD",2)="1:0:0:0" +^ZZCOVERAGE("XTRUTL1","BUILD",3)="1:0:0:0" + + diff --git a/Tests/MumpsCoverage/DartConfiguration.cache.tcl.in b/Tests/MumpsCoverage/DartConfiguration.cache.tcl.in new file mode 100644 index 0000000..a1c6b17 --- /dev/null +++ b/Tests/MumpsCoverage/DartConfiguration.cache.tcl.in @@ -0,0 +1,8 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: ${CMake_SOURCE_DIR}/Testing/MumpsCoverage +BuildDirectory: ${CMake_BINARY_DIR}/Testing/MumpsCacheCoverage diff --git a/Tests/MumpsCoverage/DartConfiguration.tcl.in b/Tests/MumpsCoverage/DartConfiguration.tcl.in new file mode 100644 index 0000000..2d7eaa5 --- /dev/null +++ b/Tests/MumpsCoverage/DartConfiguration.tcl.in @@ -0,0 +1,8 @@ +# This file is configured by CMake automatically as DartConfiguration.tcl +# If you choose not to use CMake, this file may be hand configured, by +# filling in the required variables. + + +# Configuration directories and files +SourceDirectory: ${CMake_SOURCE_DIR}/Testing/MumpsCoverage +BuildDirectory: ${CMake_BINARY_DIR}/Testing/MumpsCoverage diff --git a/Tests/MumpsCoverage/VistA-FOIA/Packages/Toolkit/Routines/XINDEX.m b/Tests/MumpsCoverage/VistA-FOIA/Packages/Toolkit/Routines/XINDEX.m new file mode 100644 index 0000000..b045221 --- /dev/null +++ b/Tests/MumpsCoverage/VistA-FOIA/Packages/Toolkit/Routines/XINDEX.m @@ -0,0 +1,144 @@ +XINDEX ;ISC/REL,GFT,GRK,RWF - INDEX & CROSS-REFERENCE ;08/04/08 13:19 + ;;7.3;TOOLKIT;**20,27,48,61,66,68,110,121,128**;Apr 25, 1995;Build 1 + ; Per VHA Directive 2004-038, this routine should not be modified. + G ^XINDX6 +SEP F I=1:1 S CH=$E(LIN,I) D QUOTE:CH=Q Q:" "[CH + S ARG=$E(LIN,1,I-1) S:CH=" " I=I+1 S LIN=$E(LIN,I,999) Q +QUOTE F I=I+1:1 S CH=$E(LIN,I) Q:CH=""!(CH=Q) + Q:CH]"" S ERR=6 G ^XINDX1 +ALIVE ;enter here from taskman + D SETUP^XINDX7 ;Get ready to process +A2 S RTN=$O(^UTILITY($J,RTN)) G ^XINDX5:RTN="" + S INDLC=(RTN?1"|"1.4L.NP) D LOAD:'INDLC + I $D(ZTQUEUED),$$S^%ZTLOAD S RTN="~",IND("QUIT")=1,ZTSTOP=1 G A2 + I 'INDDS,INDLC W !!?10,"Data Dictionaries",! S INDDS=1 + D BEG + G A2 + ; +LOAD S X=RTN,XCNP=0,DIF="^UTILITY("_$J_",1,RTN,0," X ^%ZOSF("TEST") Q:'$T X ^%ZOSF("LOAD") S ^UTILITY($J,1,RTN,0,0)=XCNP-1 + I $D(^UTILITY($J,1,RTN,0,0)) S ^UTILITY($J,1,RTN,"RSUM")="B"_$$SUMB^XPDRSUM($NA(^UTILITY($J,1,RTN,0))) + Q +BEG ; + S %=INDLC*5 W:$X+10+%>IOM ! W RTN,$J("",10+%-$L(RTN)) + S (IND("DO"),IND("SZT"),IND("SZC"),LABO)=0,LC=$G(^UTILITY($J,1,RTN,0,0)) + I LC="" W !,">>>Routine '",RTN,"' not found <<<",! Q + S TXT="",LAB=$P(^UTILITY($J,1,RTN,0,1,0)," ") I RTN'=$P(LAB,"(") D E^XINDX1(17) + I 'INDLC,LAB["(" D E^XINDX1(55) S LAB=$P(LAB,"(") + ;if M routine(not compiled template or DD) and has more than 2 lines, check lines 1 & 2 + I 'INDLC,LC>2 D + . N LABO S LABO=1 + . S LIN=$G(^UTILITY($J,1,RTN,0,1,0)),TXT=1 + . ;check 1st line (site/dev - ) patch 128 + . I $P(LIN,";",2,4)'?.E1"/".E.1"-".E D E^XINDX1(62) + . S LIN=$G(^UTILITY($J,1,RTN,0,2,0)),TXT=2 + . ;check 2nd line (;;nn.nn[TV]nn;package;.anything) + . I $P(LIN,";",3,99)'?1.2N1"."1.2N.1(1"T",1"V").2N1";"1A.AP1";".E D E^XINDX1(44) ;patch 121 + . I $L(INP(11)) X INP(11) ;Version number check + . I $L(INP(12)) X INP(12) ;Patch number check +B5 F TXT=1:1:LC S LIN=^UTILITY($J,1,RTN,0,TXT,0),LN=$L(LIN),IND("SZT")=IND("SZT")+LN+2 D LN,ST ;Process Line + S LAB="",LABO=0,TXT=0,^UTILITY($J,1,RTN,0)=IND("SZT")_"^"_LC_"^"_IND("SZC") + I IND("SZT")>INP("MAX"),'INDLC S ERR=35,ERR(1)=IND("SZT") D ^XINDX1 + I IND("SZT")-IND("SZC")>INP("CMAX"),'INDLC S ERR=58,ERR(1)=IND("SZT")-IND("SZC") D ^XINDX1 + D POSTRTN + Q + ;Proccess one line, LN = Length, LIN = Line. +LN K V S (ARG,GRB,IND("COM"),IND("DOL"),IND("F"))="",X=$P(LIN," ") + I '$L(X) S LABO=LABO+1 G CD + S (IND("COM"),LAB)=$P(X,"("),ARG=$P($P(X,"(",2),")"),LABO=0,IND("PP")=X?1.8E1"(".E1")" + D:$L(ARG) NE^XINDX3 ;Process formal parameters as New list. + I 'INDLC,'$$VT^XINDX2(LAB) D E^XINDX1($S(LAB=$$CASE^XINDX52(LAB):37,1:55)) ;Check for bad labels + I $D(^UTILITY($J,1,RTN,"T",LAB)) D E^XINDX1(15) G CD ;DUP label + S ^UTILITY($J,1,RTN,"T",LAB)="" +CD I LN>245 D:'(LN=246&($E(RTN,1,3)="|dd")) E^XINDX1(19) ;patch 119 + D:LIN'?1.ANP E^XINDX1(18) + S LIN=$P(LIN," ",2,999),IND("LCC")=1 + I LIN="" D E^XINDX1(42) Q ;Blank line ;p110 + S I=0 ;Watch the scope of I, counts dots + I " ."[$E(LIN) D S X=$L($E(LIN,1,I),".")-1,LIN=$E(LIN,I,999) + . F I=1:1:245 Q:". "'[$E(LIN,I) + . Q + ;check dots against Do level IND("DO"), IND("DOL")=dot level + D:'I&$G(IND("DO1")) E^XINDX1(51) S IND("DO1")=0 S:'I IND("DO")=0 + I I D:X>IND("DO") E^XINDX1(51) S (IND("DO"),IND("DOL"))=X + ;Count Comment lines, skip ;; lines + I $E(LIN)=";",$E(LIN,2)'=";" S IND("SZC")=IND("SZC")+$L(LIN) ;p110 + ;Process commands on line. +EE I LIN="" D ^XINDX2 Q + S COM=$E(LIN),GK="",ARG="" + I COM=";" S LIN="" G EE ;p110 + I COM=" " S ERR=$S(LIN?1." ":13,1:0),LIN=$S(ERR:"",1:$E(LIN,2,999)) D:ERR ^XINDX1 G EE + D SEP + S CM=$P(ARG,":",1),POST=$P(ARG,":",2,999),IND("COM")=IND("COM")_$C(9)_COM,ERR=48 + D:ARG[":"&(POST']"") ^XINDX1 S:POST]"" GRB=GRB_$C(9)_POST,IND("COM")=IND("COM")_":" + ;SAC now allows lowercase commands + I CM?.E1L.E S CM=$$CASE^XINDX52(CM),COM=$E(CM) ;I IND("LCC") S IND("LCC")=0 D E^XINDX1(47) + I CM="" D E^XINDX1(21) G EE ;Missing command + S CX=$G(IND("CMD",CM)) I CX="" D G:CX="" EE + . I $E(CM)="Z" S CX="^Z" Q ;Proccess Z commands + . D E^XINDX1(1) S LIN="" Q + S CX=$P(CX,"^",2,9) + D SEP I '$L(LIN),CH=" " D E^XINDX1(13) ;trailing space + I ARG="","CGJMORSUWX"[COM S ERR=49 G ^XINDX1 + I CX>0 D E^XINDX1(CX) S CX="" + D:$L(CX) @CX S:ARG'="" GRB=GRB_$C(9)_ARG G EE +B S ERR=25 G ^XINDX1 +C S ERR=29 G ^XINDX1 +D G DG1^XINDX4 +E Q:ARG="" S ERR=7 G ^XINDX1 +F G:ARG]"" FR^XINDX4 S IND("F")=1 Q +G G DG^XINDX4 +H Q:ARG'="" S ERR=32 G ^XINDX1 +J S ERR=36,ARG="" G ^XINDX1 +K S ERR=$S(ARG?1"(".E:22,ARG?." ":23,1:0) D:ERR ^XINDX1 + G KL^XINDX3 +L G LO^XINDX4 +M G S^XINDX3 +N G NE^XINDX3 +O S ERR=34 D ^XINDX1,O^XINDX3 Q +Q Q:ARG="" G Q^XINDX4 +R S RDTIME=0 G RD^XINDX3 +S G S^XINDX3 +TR Q ;What to process. p110 +U S ARG=$P(ARG,":") Q +V S ARG="",ERR=20 G ^XINDX1 +W G WR^XINDX4 +X G XE^XINDX4 +Z S ERR=2 D ^XINDX1 G ZC^XINDX4 + ; + ;Save off items from line. +ST S R=LAB_$S(LABO:"+"_LABO,1:"") + ;Local variable, Global, Marked Items, Naked global, Internal ref, eXternal ref., Tag ref. + S LOC="" F S LOC=$O(V(LOC)),S="" Q:LOC="" F S S=$O(V(LOC,S)) Q:S="" D SET + S ^UTILITY($J,1,RTN,"COM",TXT)=IND("COM") + Q + ; +SET I V(LOC,S)]"" F %="!","~" I V(LOC,S)[%,$G(^UTILITY($J,1,RTN,LOC,S))'[% S ^(S)=$G(^(S))_% + S %=0 +SE2 S ARG=$G(^UTILITY($J,1,RTN,LOC,S,%)) I $L(ARG)>230 S %=%+1 G SE2 + S ^UTILITY($J,1,RTN,LOC,S,%)=ARG_R_V(LOC,S)_"," + Q + ; +POSTRTN ;Do more overall checking + N V,E,T,T1,T2 + S T="" ;Check for missing Labels + F S T=$O(^UTILITY($J,1,RTN,"I",T)),T2=T Q:T="" S T1=$G(^(T,0)) D + . Q:$E(T2,1,2)="@(" + . S:$E(T2,1,2)="$$" T2=$E(T2,3,99) + . I T2]"",'$D(^UTILITY($J,1,RTN,"T",$P(T2,"+",1))) D + . . F I=1:1:$L(T1,",")-1 S LAB=$P(T1,",",I),LABO=+$P(LAB,"+",2),LAB=$P(LAB,"+"),E=14,E(1)=T D E^XINDX1(.E) + . . Q + . Q + S LAB="",LABO=0 ;Check for valid label names + I 'INDLC F S LAB=$O(^UTILITY($J,1,RTN,"T",LAB)) Q:LAB="" D + . I '$$VA^XINDX2(LAB) D E^XINDX1(55) Q + . D:'$$VT^XINDX2(LAB) E^XINDX1(37) + . Q + S LAB="",LABO=0 ;Check for valid variable names. + F S LAB=$O(^UTILITY($J,1,RTN,"L",LAB)) Q:LAB="" D + . D VLNF^XINDX3($P(LAB,"(")) + . Q + Q + ; +QUICK ;Quick, Just get a routine an print the results + D QUICK^XINDX6() + Q diff --git a/Tests/MumpsCoverage/cache_coverage.cmcov.in b/Tests/MumpsCoverage/cache_coverage.cmcov.in new file mode 100644 index 0000000..b431dbd --- /dev/null +++ b/Tests/MumpsCoverage/cache_coverage.cmcov.in @@ -0,0 +1,2 @@ +packages:${CMake_BINARY_DIR}/Testing/MumpsCoverage/VistA-FOIA/Packages +coverage_dir:${CMake_SOURCE_DIR}/Tests/MumpsCoverage diff --git a/Tests/MumpsCoverage/gtm_coverage.mcov.in b/Tests/MumpsCoverage/gtm_coverage.mcov.in new file mode 100644 index 0000000..b431dbd --- /dev/null +++ b/Tests/MumpsCoverage/gtm_coverage.mcov.in @@ -0,0 +1,2 @@ +packages:${CMake_BINARY_DIR}/Testing/MumpsCoverage/VistA-FOIA/Packages +coverage_dir:${CMake_SOURCE_DIR}/Tests/MumpsCoverage diff --git a/Tests/Plugin/CMakeLists.txt b/Tests/Plugin/CMakeLists.txt index b0942c0..31ca59c 100644 --- a/Tests/Plugin/CMakeLists.txt +++ b/Tests/Plugin/CMakeLists.txt @@ -39,6 +39,50 @@ TARGET_LINK_LIBRARIES(example_exe kwsys) ADD_LIBRARY(example_mod_1 MODULE src/example_mod_1.c) TARGET_LINK_LIBRARIES(example_mod_1 example_exe) + +IF(CMAKE_SHARED_LIBRARY_SONAME_C_FLAG AND + "${CMAKE_C_CREATE_SHARED_MODULE}" MATCHES "SONAME_FLAG") + # Add a second plugin that should not have any soname. + ADD_LIBRARY(example_mod_2 MODULE src/example_mod_1.c) + TARGET_LINK_LIBRARIES(example_mod_2 example_exe) + SET_PROPERTY(TARGET example_mod_2 PROPERTY NO_SONAME 1) + + # Verify that targets export with proper IMPORTED SONAME properties. + EXPORT(TARGETS example_mod_1 example_mod_2 NAMESPACE exp_ + FILE ${CMAKE_CURRENT_BINARY_DIR}/mods.cmake) + INCLUDE(${CMAKE_CURRENT_BINARY_DIR}/mods.cmake) + GET_PROPERTY(configs TARGET exp_example_mod_1 PROPERTY IMPORTED_CONFIGURATIONS) + FOREACH(c ${configs}) + STRING(TOUPPER "${c}" CONFIG) + GET_PROPERTY(soname1 TARGET exp_example_mod_1 PROPERTY IMPORTED_SONAME_${CONFIG}) + GET_PROPERTY(soname2 TARGET exp_example_mod_2 PROPERTY IMPORTED_NO_SONAME_${CONFIG}) + IF(soname1) + MESSAGE(STATUS "exp_example_mod_1 has IMPORTED_SONAME_${CONFIG} as expected: ${soname1}") + ELSE() + MESSAGE(SEND_ERROR "exp_example_mod_1 does not have IMPORTED_SONAME_${CONFIG} but should") + ENDIF() + IF(soname2) + MESSAGE(STATUS "exp_example_mod_2 has IMPORTED_NO_SONAME_${CONFIG} as expected: ${soname2}") + ELSE() + MESSAGE(SEND_ERROR "exp_example_mod_2 does not have IMPORTED_NO_SONAME_${CONFIG} but should") + ENDIF() + ENDFOREACH() + + # Parse the binary to check for SONAME if possible. + IF("${CMAKE_EXECUTABLE_FORMAT}" MATCHES "ELF") + FIND_PROGRAM(READELF_EXE readelf) + IF(READELF_EXE) + ADD_CUSTOM_TARGET(check_mod_soname ALL COMMAND + ${CMAKE_COMMAND} -Dreadelf=${READELF_EXE} + -Dmod1=$<TARGET_FILE:example_mod_1> + -Dmod2=$<TARGET_FILE:example_mod_2> + -P ${CMAKE_CURRENT_SOURCE_DIR}/check_mod_soname.cmake + ) + ADD_DEPENDENCIES(check_mod_soname example_mod_1 example_mod_2) + ENDIF() + ENDIF() +ENDIF() + # TODO: # - create a plugin that links to a static lib # - create a plugin that links to a shared lib diff --git a/Tests/Plugin/check_mod_soname.cmake b/Tests/Plugin/check_mod_soname.cmake new file mode 100644 index 0000000..3737b45 --- /dev/null +++ b/Tests/Plugin/check_mod_soname.cmake @@ -0,0 +1,14 @@ +execute_process(COMMAND ${readelf} -d ${mod1} OUTPUT_FILE ${mod1}.readelf.txt) +execute_process(COMMAND ${readelf} -d ${mod2} OUTPUT_FILE ${mod2}.readelf.txt) +file(STRINGS ${mod1}.readelf.txt soname1 REGEX "\\(SONAME\\)") +file(STRINGS ${mod2}.readelf.txt soname2 REGEX "\\(SONAME\\)") +if(soname1) + message(STATUS "${mod1} has soname as expected: ${soname1}") +else() + message(FATAL_ERROR "${mod1} has no soname but should:\n ${soname1}") +endif() +if(soname2) + message(FATAL_ERROR "${mod2} has soname but should not:\n ${soname2}") +else() + message(STATUS "${mod2} has no soname as expected") +endif() diff --git a/Tests/RunCMake/CMakeLists.txt b/Tests/RunCMake/CMakeLists.txt index 0b79efa..1c6db39 100644 --- a/Tests/RunCMake/CMakeLists.txt +++ b/Tests/RunCMake/CMakeLists.txt @@ -24,11 +24,16 @@ # 4.) Create a <SubTest>.cmake file for each sub-test named above # containing the actual test code. Optionally create files # containing expected test results: -# <SubTest>-result.txt = Process result expected if not "0" -# <SubTest>-stdout.txt = Regex matching expected stdout content -# <SubTest>-stderr.txt = Regex matching expected stderr content +# <SubTest>-result.txt = Process result expected if not "0" +# <SubTest>-stdout.txt = Regex matching expected stdout content +# <SubTest>-stderr.txt = Regex matching expected stderr content +# <SubTest>-check.cmake = Custom result check # Note that trailing newlines will be stripped from actual test # output before matching against the stdout and stderr expressions. +# The code in <SubTest>-check.cmake may use variables +# RunCMake_TEST_SOURCE_DIR = Top of test source tree +# RunCMake_TEST_BINARY_DIR = Top of test binary tree +# and an failure must store a message in RunCMake_TEST_FAILED. macro(add_RunCMake_test test) add_test(RunCMake.${test} ${CMAKE_CMAKE_COMMAND} @@ -44,3 +49,8 @@ add_RunCMake_test(ObjectLibrary) add_RunCMake_test(build_command) add_RunCMake_test(find_package) +add_RunCMake_test(list) + +if("${CMAKE_TEST_GENERATOR}" MATCHES "Visual Studio [^6]") + add_RunCMake_test(include_external_msproject) +endif() diff --git a/Tests/RunCMake/RunCMake.cmake b/Tests/RunCMake/RunCMake.cmake index 2639463..c3c161a 100644 --- a/Tests/RunCMake/RunCMake.cmake +++ b/Tests/RunCMake/RunCMake.cmake @@ -25,14 +25,14 @@ function(run_cmake test) unset(expect_std${o}) endif() endforeach() - set(source_dir "${top_src}") - set(binary_dir "${top_bin}/${test}-build") - file(REMOVE_RECURSE "${binary_dir}") - file(MAKE_DIRECTORY "${binary_dir}") + set(RunCMake_TEST_SOURCE_DIR "${top_src}") + set(RunCMake_TEST_BINARY_DIR "${top_bin}/${test}-build") + file(REMOVE_RECURSE "${RunCMake_TEST_BINARY_DIR}") + file(MAKE_DIRECTORY "${RunCMake_TEST_BINARY_DIR}") execute_process( - COMMAND ${CMAKE_COMMAND} "${source_dir}" + COMMAND ${CMAKE_COMMAND} "${RunCMake_TEST_SOURCE_DIR}" -G "${RunCMake_GENERATOR}" -DRunCMake_TEST=${test} - WORKING_DIRECTORY "${binary_dir}" + WORKING_DIRECTORY "${RunCMake_TEST_BINARY_DIR}" OUTPUT_VARIABLE actual_stdout ERROR_VARIABLE actual_stderr RESULT_VARIABLE actual_result @@ -53,6 +53,11 @@ function(run_cmake test) endif() endif() endforeach() + unset(RunCMake_TEST_FAILED) + include(${top_src}/${test}-check.cmake OPTIONAL) + if(RunCMake_TEST_FAILED) + set(msg "${RunCMake_TEST_FAILED}\n${msg}") + endif() if(msg) string(REGEX REPLACE "\n" "\n actual-out> " actual_out " actual-out> ${actual_stdout}") string(REGEX REPLACE "\n" "\n actual-err> " actual_err " actual-err> ${actual_stderr}") diff --git a/Tests/RunCMake/include_external_msproject/CMakeLists.txt b/Tests/RunCMake/include_external_msproject/CMakeLists.txt new file mode 100644 index 0000000..e8db6b0 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake b/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake new file mode 100644 index 0000000..68dec4c --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomGuid-check.cmake @@ -0,0 +1 @@ +check_project(CustomGuid external "aaa-bbb-ccc-000" "" "") diff --git a/Tests/RunCMake/include_external_msproject/CustomGuid.cmake b/Tests/RunCMake/include_external_msproject/CustomGuid.cmake new file mode 100644 index 0000000..1dbe7da --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomGuid.cmake @@ -0,0 +1,2 @@ +include_external_msproject(external external.project + GUID aaa-bbb-ccc-000) diff --git a/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake new file mode 100644 index 0000000..614712e --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform-check.cmake @@ -0,0 +1 @@ +check_project(CustomGuidTypePlatform external "aaa-bbb-ccc-111" "aaa-bbb-ccc-ddd-eee" "Custom Platform") diff --git a/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform.cmake b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform.cmake new file mode 100644 index 0000000..ee4db65 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomGuidTypePlatform.cmake @@ -0,0 +1,5 @@ +# Test all optional parameters are set. +include_external_msproject(external external.project + GUID aaa-bbb-ccc-111 + TYPE aaa-bbb-ccc-ddd-eee + PLATFORM "Custom Platform") diff --git a/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake b/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake new file mode 100644 index 0000000..054eeb0 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomTypePlatform-check.cmake @@ -0,0 +1 @@ +check_project(CustomTypePlatform external "" "aaa-bbb-ccc-ddd-eee" "Custom Platform") diff --git a/Tests/RunCMake/include_external_msproject/CustomTypePlatform.cmake b/Tests/RunCMake/include_external_msproject/CustomTypePlatform.cmake new file mode 100644 index 0000000..8c76adb --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/CustomTypePlatform.cmake @@ -0,0 +1,3 @@ +include_external_msproject(external external.project + TYPE aaa-bbb-ccc-ddd-eee + PLATFORM "Custom Platform") diff --git a/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake b/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake new file mode 100644 index 0000000..90710f9 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/RunCMakeTest.cmake @@ -0,0 +1,6 @@ +include(RunCMake) +include(${CMAKE_CURRENT_LIST_DIR}/check_utils.cmake) + +run_cmake(CustomGuid) +run_cmake(CustomTypePlatform) +run_cmake(CustomGuidTypePlatform) diff --git a/Tests/RunCMake/include_external_msproject/check_utils.cmake b/Tests/RunCMake/include_external_msproject/check_utils.cmake new file mode 100644 index 0000000..7d6b8f8 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/check_utils.cmake @@ -0,0 +1,109 @@ +# Check that file contains line that matches regular expression. +# Sets IS_FOUND variable to TRUE if found and to FALSE otherwise. +macro(check_line_exists TARGET_FILE REG_EXP_REF) + set(IS_FOUND "FALSE") + + file(STRINGS ${TARGET_FILE} FOUND_LINE LIMIT_COUNT 1 REGEX "${${REG_EXP_REF}}") + list(LENGTH FOUND_LINE _VAR_LEN) + + if(_VAR_LEN GREATER 0) + set(IS_FOUND "TRUE") + endif(_VAR_LEN GREATER 0) +endmacro(check_line_exists TARGET_FILE REG_EXP_REF) + +# Search and parse project section line by project name. +# If search was successful stores found type and guid into FOUND_TYPE and FOUND_GUID variables respectively. +# Sets IS_FOUND variable to TRUE if found and to FALSE otherwise. +macro(parse_project_section TARGET_FILE PROJECT_NAME) + set(REG_EXP "^Project\\(\\\"{(.+)}\\\"\\) = \\\"${PROJECT_NAME}\\\", \\\".+\\..+\\\", \\\"{(.+)}\\\"$") + + check_line_exists(${TARGET_FILE} REG_EXP) + if(NOT IS_FOUND) + return() + endif(NOT IS_FOUND) + + string(REGEX REPLACE "${REG_EXP}" "\\1;\\2" _GUIDS "${FOUND_LINE}") + + list(GET _GUIDS 0 FOUND_TYPE) + list(GET _GUIDS 1 FOUND_GUID) +endmacro(parse_project_section TARGET_FILE PROJECT_NAME) + +# Search project section line by project name and type. +# Returns TRUE if found and FALSE otherwise +function(check_project_type TARGET_FILE PROJECT_NAME PROJECT_TYPE RESULT) + set(${RESULT} "FALSE" PARENT_SCOPE) + + parse_project_section(${TARGET_FILE} ${PROJECT_NAME}) + if(IS_FOUND AND FOUND_TYPE STREQUAL PROJECT_TYPE) + set(${RESULT} "TRUE" PARENT_SCOPE) + endif(IS_FOUND AND FOUND_TYPE STREQUAL PROJECT_TYPE) +endfunction(check_project_type TARGET_FILE PROJECT_NAME PROJECT_TYPE RESULT) + + +# Search project section line by project name and id. +# Returns TRUE if found and FALSE otherwise +function(check_project_guid TARGET_FILE PROJECT_NAME PROJECT_GUID RESULT) + set(${RESULT} "FALSE" PARENT_SCOPE) + + parse_project_section(${TARGET_FILE} ${PROJECT_NAME}) + if(IS_FOUND AND FOUND_GUID STREQUAL PROJECT_GUID) + set(${RESULT} "TRUE" PARENT_SCOPE) + endif(IS_FOUND AND FOUND_GUID STREQUAL PROJECT_GUID) +endfunction(check_project_guid TARGET_FILE PROJECT_NAME PROJECT_GUID RESULT) + + +# Search project's build configuration line by project name and target platform name. +# Returns TRUE if found and FALSE otherwise +function(check_custom_platform TARGET_FILE PROJECT_NAME PLATFORM_NAME RESULT) + set(${RESULT} "FALSE" PARENT_SCOPE) + + # extract project guid + parse_project_section(${TARGET_FILE} ${PROJECT_NAME}) + if(NOT IS_FOUND) + return() + endif(NOT IS_FOUND) + + # probably whould be better to use configuration name + # extracted from CMAKE_CONFIGURATION_TYPES than just hardcoded "Debug" instead + set(REG_EXP "^(\t)*\\{${FOUND_GUID}\\}\\.Debug[^ ]*\\.ActiveCfg = Debug\\|${PLATFORM_NAME}$") + check_line_exists(${TARGET_FILE} REG_EXP) + + set(${RESULT} ${IS_FOUND} PARENT_SCOPE) +endfunction(check_custom_platform TARGET_FILE PLATFORM_NAME RESULT) + +# RunCMake test check helper +function(check_project test name guid type platform) + set(sln "${RunCMake_TEST_BINARY_DIR}/${test}.sln") + set(sep "") + set(failed "") + if(NOT type) + set(type 8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942) + endif() + if(NOT platform) + if("${RunCMake_GENERATOR}" MATCHES "Win64") + set(platform "x64") + else() + set(platform "Win32") + endif() + endif() + if(guid) + check_project_guid("${sln}" "${name}" "${guid}" passed_guid) + if(NOT passed_guid) + set(failed "${failed}${sep}${name} solution has no project with expected GUID=${guid}") + set(sep "\n") + endif() + else() + set(passed_guid 1) + endif() + check_project_type("${sln}" "${name}" "${type}" passed_type) + if(NOT passed_type) + set(failed "${failed}${sep}${name} solution has no project with expected TYPE=${type}") + set(sep "\n") + endif() + check_custom_platform("${sln}" "${name}" "${platform}" passed_platform) + if(NOT passed_platform) + set(failed "${failed}${sep}${name} solution has no project with expected PLATFORM=${platform}") + set(sep "\n") + endif() + set(RunCMake_TEST_FAILED "${failed}" PARENT_SCOPE) +endfunction() diff --git a/Tests/RunCMake/include_external_msproject/main.cpp b/Tests/RunCMake/include_external_msproject/main.cpp new file mode 100644 index 0000000..9198103 --- /dev/null +++ b/Tests/RunCMake/include_external_msproject/main.cpp @@ -0,0 +1,3 @@ +void main() +{ +} diff --git a/Tests/RunCMake/list/CMakeLists.txt b/Tests/RunCMake/list/CMakeLists.txt new file mode 100644 index 0000000..e8db6b0 --- /dev/null +++ b/Tests/RunCMake/list/CMakeLists.txt @@ -0,0 +1,3 @@ +cmake_minimum_required(VERSION 2.8) +project(${RunCMake_TEST} NONE) +include(${RunCMake_TEST}.cmake) diff --git a/Tests/RunCMake/list/EmptyGet0-result.txt b/Tests/RunCMake/list/EmptyGet0-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/EmptyGet0-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/list/EmptyGet0-stderr.txt b/Tests/RunCMake/list/EmptyGet0-stderr.txt new file mode 100644 index 0000000..0c61b01 --- /dev/null +++ b/Tests/RunCMake/list/EmptyGet0-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at EmptyGet0.cmake:2 \(list\): + list GET given empty list +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$ diff --git a/Tests/RunCMake/list/EmptyGet0.cmake b/Tests/RunCMake/list/EmptyGet0.cmake new file mode 100644 index 0000000..4947108 --- /dev/null +++ b/Tests/RunCMake/list/EmptyGet0.cmake @@ -0,0 +1,2 @@ +set(mylist "") +list(GET mylist 0 result) diff --git a/Tests/RunCMake/list/EmptyInsert-1-result.txt b/Tests/RunCMake/list/EmptyInsert-1-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/EmptyInsert-1-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/list/EmptyInsert-1-stderr.txt b/Tests/RunCMake/list/EmptyInsert-1-stderr.txt new file mode 100644 index 0000000..0900ff9 --- /dev/null +++ b/Tests/RunCMake/list/EmptyInsert-1-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at EmptyInsert-1.cmake:2 \(list\): + list index: -1 out of range \(0, 0\) +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$ diff --git a/Tests/RunCMake/list/EmptyInsert-1.cmake b/Tests/RunCMake/list/EmptyInsert-1.cmake new file mode 100644 index 0000000..140da5d --- /dev/null +++ b/Tests/RunCMake/list/EmptyInsert-1.cmake @@ -0,0 +1,2 @@ +set(mylist "") +list(INSERT mylist -1 x) diff --git a/Tests/RunCMake/list/EmptyRemoveAt0-result.txt b/Tests/RunCMake/list/EmptyRemoveAt0-result.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/Tests/RunCMake/list/EmptyRemoveAt0-result.txt @@ -0,0 +1 @@ +1 diff --git a/Tests/RunCMake/list/EmptyRemoveAt0-stderr.txt b/Tests/RunCMake/list/EmptyRemoveAt0-stderr.txt new file mode 100644 index 0000000..b24a0ed --- /dev/null +++ b/Tests/RunCMake/list/EmptyRemoveAt0-stderr.txt @@ -0,0 +1,4 @@ +CMake Error at EmptyRemoveAt0.cmake:2 \(list\): + list REMOVE_AT given empty list +Call Stack \(most recent call first\): + CMakeLists.txt:3 \(include\)$ diff --git a/Tests/RunCMake/list/EmptyRemoveAt0.cmake b/Tests/RunCMake/list/EmptyRemoveAt0.cmake new file mode 100644 index 0000000..d6a3e85 --- /dev/null +++ b/Tests/RunCMake/list/EmptyRemoveAt0.cmake @@ -0,0 +1,2 @@ +set(mylist "") +list(REMOVE_AT mylist 0) diff --git a/Tests/RunCMake/list/RunCMakeTest.cmake b/Tests/RunCMake/list/RunCMakeTest.cmake new file mode 100644 index 0000000..555051d --- /dev/null +++ b/Tests/RunCMake/list/RunCMakeTest.cmake @@ -0,0 +1,5 @@ +include(RunCMake) + +run_cmake(EmptyGet0) +run_cmake(EmptyRemoveAt0) +run_cmake(EmptyInsert-1) diff --git a/Utilities/.gitattributes b/Utilities/.gitattributes new file mode 100644 index 0000000..e3a9e61 --- /dev/null +++ b/Utilities/.gitattributes @@ -0,0 +1,2 @@ +/Git export-ignore +SetupForDevelopment.sh export-ignore diff --git a/Utilities/GitSetup/.gitattributes b/Utilities/GitSetup/.gitattributes new file mode 100644 index 0000000..facbbb2 --- /dev/null +++ b/Utilities/GitSetup/.gitattributes @@ -0,0 +1,7 @@ +.git* export-ignore + +# Exclude from source archives files specific to Git work tree. +* export-ignore + +tips eol=lf whitespace=indent-with-non-tab +setup-* eol=lf whitespace=indent-with-non-tab diff --git a/Utilities/GitSetup/LICENSE b/Utilities/GitSetup/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Utilities/GitSetup/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Utilities/GitSetup/NOTICE b/Utilities/GitSetup/NOTICE new file mode 100644 index 0000000..0d32c02 --- /dev/null +++ b/Utilities/GitSetup/NOTICE @@ -0,0 +1,5 @@ +Kitware Local Git Setup Scripts +Copyright 2010-2012 Kitware, Inc. + +This product includes software developed at Kitware, Inc. +(http://www.kitware.com/). diff --git a/Utilities/GitSetup/README b/Utilities/GitSetup/README new file mode 100644 index 0000000..cf468fb --- /dev/null +++ b/Utilities/GitSetup/README @@ -0,0 +1,80 @@ +Kitware Local Git Setup Scripts + + +Introduction +------------ + +This is a collection of local Git development setup scripts meant for +inclusion in project source trees to aid their development workflow. +Project-specific information needed by the scripts may be configured +in a "config" file added next to them in the project. + + +Import +------ + +A project may import these scripts into their source tree by +initializing a subtree merge. Bring up a Git prompt and set the +current working directory inside a clone of the target project. +Fetch the "setup" branch from the GitSetup repository: + + $ git fetch ../GitSetup setup:setup + +Prepare to merge the branch but place the content in a subdirectory. +Any prefix (with trailing '/') may be chosen so long as it is used +consistently within a project through the rest of these instructions: + + $ git merge -s ours --no-commit setup + $ git read-tree -u --prefix=Utilities/GitSetup/ setup + +Commit the merge with an informative message: + + $ git commit + ------------------------------------------------------------------------ + Merge branch 'setup' + + Add Utilities/GitSetup/ directory using subtree merge from + the general GitSetup repository "setup" branch. + ------------------------------------------------------------------------ + + +Configuration +------------- + +Read the "Project configuration instructions" comment in each script. +Add a "config" file next to the scripts with desired configuration +(optionally copy and modify "config.sample"). For example, to +configure the "setup-hooks" script: + + $ git config -f Utilities/GitSetup/config hooks.url "$url" + +where "$url" is the project repository publishing the "hooks" branch. +When finished, add and commit the configuration file: + + $ git add Utilities/GitSetup/config + $ git commit + + +Update +------ + +A project may update these scripts from the GitSetup repository. +Bring up a Git prompt and set the current working directory inside a +clone of the target project. Fetch the "setup" branch from the +GitSetup repository: + + $ git fetch ../GitSetup setup:setup + +Merge the "setup" branch into the subtree: + + $ git merge -X subtree=Utilities/GitSetup setup + +where "Utilities/GitSetup" is the same prefix used during the import +setup, but without a trailing '/'. + + +License +------- + +Distributed under the Apache License 2.0. +See LICENSE and NOTICE for details. diff --git a/Utilities/GitSetup/config b/Utilities/GitSetup/config new file mode 100644 index 0000000..b7d5423 --- /dev/null +++ b/Utilities/GitSetup/config @@ -0,0 +1,9 @@ +[hooks] + url = http://cmake.org/cmake.git +[ssh] + host = cmake.org + key = id_git_cmake + request-url = https://www.kitware.com/Admin/SendPassword.cgi +[stage] + url = git://cmake.org/stage/cmake.git + pushurl = git@cmake.org:stage/cmake.git diff --git a/Utilities/GitSetup/config.sample b/Utilities/GitSetup/config.sample new file mode 100644 index 0000000..bba2382 --- /dev/null +++ b/Utilities/GitSetup/config.sample @@ -0,0 +1,22 @@ +# Kitware Local Git Setup Scripts - Sample Project Configuration +# +# Copy to "config" and edit as necessary. + +[hooks] + url = http://public.kitware.com/GitSetup.git + #branch = hooks + +[ssh] + host = public.kitware.com + key = id_git_public + request-url = https://www.kitware.com/Admin/SendPassword.cgi + +[stage] + #url = git://public.kitware.com/stage/Project.git + #pushurl = git@public.kitware.com:stage/Project.git + +[gerrit] + #project = Project + site = http://review.source.kitware.com + # pushurl placeholder "$username" is literal + pushurl = $username@review.source.kitware.com:Project diff --git a/Utilities/GitSetup/setup-gerrit b/Utilities/GitSetup/setup-gerrit new file mode 100755 index 0000000..9e8fa62 --- /dev/null +++ b/Utilities/GitSetup/setup-gerrit @@ -0,0 +1,142 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# Run this script to set up the local Git repository to push to +# a Gerrit Code Review instance for this project. + +# Project configuration instructions: +# +# - Run a Gerrit Code Review server +# +# - Populate adjacent "config" file with: +# gerrit.site = Top Gerrit URL (not project-specific) +# gerrit.project = Name of project in Gerrit +# gerrit.pushurl = Review site push URL with "$username" placeholder +# gerrit.remote = Gerrit remote name, if not "gerrit" +# gerrit.url = Gerrit project URL, if not "$site/p/$project" + +die() { + echo 1>&2 "$@" ; exit 1 +} + +# Make sure we are inside the repository. +cd "${BASH_SOURCE%/*}" && + +# Load the project configuration. +site=$(git config -f config --get gerrit.site) && +project=$(git config -f config --get gerrit.project) && +pushurl_=$(git config -f config --get gerrit.pushurl) && +remote=$(git config -f config --get gerrit.remote || + echo "gerrit") && +fetchurl=$(git config -f config --get gerrit.url || + echo "$site/p/$project") || +die 'This project is not configured to use Gerrit.' + +# Get current gerrit push URL. +pushurl=$(git config --get remote."$remote".pushurl || + git config --get remote."$remote".url || echo '') && + +# Tell user about current configuration. +if test -n "$pushurl"; then + echo 'Remote "'"$remote"'" is currently configured to push to + + '"$pushurl"' +' && + read -ep 'Reconfigure Gerrit? [y/N]: ' ans && + if [ "$ans" == "y" ] || [ "$ans" == "Y" ]; then + setup=1 + else + setup='' + fi +else + echo 'Remote "'"$remote"'" is not yet configured. + +'"$project"' changes must be pushed to our Gerrit Code Review site: + + '"$fetchurl"' + +Register a Gerrit account and select a username (used below). +You will need an OpenID: + + http://openid.net/get-an-openid/ +' && + read -ep 'Configure Gerrit? [Y/n]: ' ans && + if [ "$ans" == "n" ] || [ "$ans" == "N" ]; then + exit 0 + else + setup=1 + fi +fi && + +# Perform setup if necessary. +if test -n "$setup"; then + echo 'Sign-in to Gerrit to get/set your username at + + '"$site"'/#/settings + +Add your SSH public keys at + + '"$site"'/#/settings/ssh-keys +' && + read -ep "Gerrit username? [$USER]: " gu && + if test -z "$gu"; then + gu="$USER" + fi && + if test -z "$pushurl"; then + git remote add "$remote" "$fetchurl" + else + git config remote."$remote".url "$fetchurl" + fi && + pushurl="${pushurl_/\$username/$gu}" && + git config remote."$remote".pushurl "$pushurl" && + echo 'Remote "'"$remote"'" is now configured to push to + + '"$pushurl"' +' +fi && + +# Optionally test Gerrit access. +if test -n "$pushurl"; then + read -ep 'Test access to Gerrit (SSH)? [y/N]: ' ans && + if [ "$ans" == "y" ] || [ "$ans" == "Y" ]; then + echo -n 'Testing Gerrit access by SSH...' + if git ls-remote --heads "$pushurl" >/dev/null; then + echo 'passed.' + else + echo 'failed.' && + die 'Could not access Gerrit. Add your SSH public keys at + + '"$site"'/#/settings/ssh-keys +' + fi + fi +fi && + +# Set up GerritId hook. +hook=$(git config --get hooks.GerritId || echo '') && +if test -z "$hook"; then + echo ' +Enabling GerritId hook to add a "Change-Id" footer to commit +messages for interaction with Gerrit. Run + + git config hooks.GerritId false + +to disable this feature (but you will be on your own).' && + git config hooks.GerritId true +else + echo 'GerritId hook already configured to "'"$hook"'".' +fi diff --git a/Utilities/GitSetup/setup-hooks b/Utilities/GitSetup/setup-hooks new file mode 100755 index 0000000..c07985a --- /dev/null +++ b/Utilities/GitSetup/setup-hooks @@ -0,0 +1,63 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# Run this script to set up local Git hooks for this project. + +# Project configuration instructions: +# +# - Publish a "hooks" branch in the project repository such that +# clones will have "refs/remotes/origin/hooks". +# +# - Populate adjacent "config" file with: +# hooks.url = Repository URL publishing "hooks" branch +# hooks.branch = Repository branch instead of "hooks" + +egrep-q() { + egrep "$@" >/dev/null 2>/dev/null +} + +die() { + echo 1>&2 "$@" ; exit 1 +} + +# Make sure we are inside the repository. +cd "${BASH_SOURCE%/*}" && + +# Select a hooks branch. +if url=$(git config --get hooks.url); then + # Fetch hooks from locally configured repository. + branch=$(git config hooks.branch || echo hooks) +elif git for-each-ref refs/remotes/origin/hooks 2>/dev/null | + egrep-q 'refs/remotes/origin/hooks$'; then + # Use hooks cloned from origin. + url=.. && branch=remotes/origin/hooks +elif url=$(git config -f config --get hooks.url); then + # Fetch hooks from project-configured repository. + branch=$(git config -f config hooks.branch || echo hooks) +else + die 'This project is not configured to install local hooks.' +fi && + +# Populate ".git/hooks". +echo 'Setting up git hooks...' && +git_dir=$(git rev-parse --git-dir) && +cd "$git_dir/hooks" && +if ! test -e .git; then + git init -q || die 'Could not run git init for hooks.' +fi && +git fetch -q "$url" "$branch" && +git reset -q --hard FETCH_HEAD || die 'Failed to install hooks' diff --git a/Utilities/GitSetup/setup-ssh b/Utilities/GitSetup/setup-ssh new file mode 100755 index 0000000..8920a5b --- /dev/null +++ b/Utilities/GitSetup/setup-ssh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# Run this script to set up ssh push access to the repository host. + +# Project configuration instructions: +# +# - Populate adjacent "config" file with: +# ssh.host = Repository host name +# ssh.user = Username on host, if not "git" +# ssh.key = Local ssh key name +# ssh.request-url = Web page URL to request ssh access + +egrep-q() { + egrep "$@" >/dev/null 2>/dev/null +} + +die() { + echo 1>&2 "$@" ; exit 1 +} + +# Make sure we are inside the repository. +cd "${BASH_SOURCE%/*}" && + +# Load the project configuration. +host=$(git config -f config --get ssh.host) && +user=$(git config -f config --get ssh.user || echo git) && +key=$(git config -f config --get ssh.key) && +request_url=$(git config -f config --get ssh.request-url) || +die 'This project is not configured for ssh push access.' + +# Check for existing configuration. +if test -r ~/.ssh/config && + egrep-q 'Host[= ]'"${host//\./\\.}" ~/.ssh/config; then + echo 'Host "'"$host"'" is already in ~/.ssh/config' && + setup= && + question='Test' +else + echo 'Host "'"$host"'" not found in ~/.ssh/config' && + setup=1 && + question='Setup and test' +fi && + +# Ask the user whether to make changes. +echo '' && +read -ep "${question} push access by ssh to $user@$host? [y/N]: " access && +if test "$access" != "y" -a "$access" != "Y"; then + exit 0 +fi && + +# Setup host configuration if necessary. +if test -n "$setup"; then + if ! test -d ~/.ssh; then + mkdir -p ~/.ssh && + chmod 700 ~/.ssh + fi && + if ! test -f ~/.ssh/config; then + touch ~/.ssh/config && + chmod 600 ~/.ssh/config + fi && + ssh_config='Host='"$host"' + IdentityFile ~/.ssh/'"$key" && + echo "Adding to ~/.ssh/config: + +$ssh_config +" && + echo "$ssh_config" >> ~/.ssh/config && + if ! test -e ~/.ssh/"$key"; then + if test -f ~/.ssh/id_rsa; then + # Take care of the common case. + ln -s id_rsa ~/.ssh/"$key" + echo ' +Assuming ~/.ssh/id_rsa is the private key corresponding to the public key for + + '"$user@$host"' + +If this is incorrect place private key at "~/.ssh/'"$key"'".' + else + echo ' +Place the private key corresponding to the public key registered for + + '"$user@$host"' + +at "~/.ssh/'"$key"'".' + fi + read -e -n 1 -p 'Press any key to continue...' + fi +fi || exit 1 + +# Test access configuration. +echo 'Testing ssh push access to "'"$user@$host"'"...' && +if ! ssh "$user@$host" info; then + die 'No ssh push access to "'"$user@$host"'". You may need to request access at + + '"$request_url"' +' +fi diff --git a/Utilities/GitSetup/setup-stage b/Utilities/GitSetup/setup-stage new file mode 100755 index 0000000..323e47a --- /dev/null +++ b/Utilities/GitSetup/setup-stage @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# Run this script to set up the topic stage for pushing changes. + +# Project configuration instructions: +# +# - Run a Topic Stage repository next to the main project repository. +# +# - Populate adjacent "config" file with: +# stage.url = Topic Stage repository URL +# stage.pushurl = Topic Stage push URL if not "$url" + +egrep-q() { + egrep "$@" >/dev/null 2>/dev/null +} + +die() { + echo 1>&2 "$@" ; exit 1 +} + +# Make sure we are inside the repository. +cd "${BASH_SOURCE%/*}" && + +# Load the project configuration. +fetchurl=$(git config -f config --get stage.url) && +pushurl_=$(git config -f config --get stage.pushurl || echo '') && +remote=$(git config -f config --get stage.remote || echo 'stage') || +die 'This project is not configured to use a topic stage.' + +# Get current stage push URL. +pushurl=$(git config --get remote."$remote".pushurl || + git config --get remote."$remote".url || echo '') && + +# Tell user about current configuration. +if test -n "$pushurl"; then + echo 'Remote "'"$remote"'" is currently configured to push to + + '"$pushurl"' +' && + read -ep 'Reconfigure Topic Stage? [y/N]: ' ans && + if [ "$ans" == "y" ] || [ "$ans" == "Y" ]; then + setup=1 + else + setup='' + fi +else + setup=1 +fi + +# Perform setup if necessary. +if test -n "$setup"; then + echo 'Setting up the topic stage...' && + if test -z "$pushurl"; then + git remote add "$remote" "$fetchurl" + else + git config remote."$remote".url "$fetchurl" + fi && + pushurl="${pushurl_}" && + git config remote."$remote".pushurl "$pushurl" && + echo 'Remote "'"$remote"'" is now configured to push to + + '"$pushurl"' +' +fi || die 'Could not configure the topic stage remote.' diff --git a/Utilities/GitSetup/setup-user b/Utilities/GitSetup/setup-user new file mode 100755 index 0000000..1af439c --- /dev/null +++ b/Utilities/GitSetup/setup-user @@ -0,0 +1,39 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# Run this script to configure Git user info in this repository. + +# Project configuration instructions: NONE + +for (( ; ; )); do + user_name=$(git config user.name || echo '') && + user_email=$(git config user.email || echo '') && + if test -n "$user_name" -a -n "$user_email"; then + echo 'Your commits will record as Author: + + '"$user_name <$user_email>"' +' && + read -ep 'Is the author name and email address above correct? [Y/n] ' correct && + if test "$correct" != "n" -a "$correct" != "N"; then + break + fi + fi && + read -ep 'Enter your full name e.g. "John Doe": ' name && + read -ep 'Enter your email address e.g. "john@gmail.com": ' email && + git config user.name "$name" && + git config user.email "$email" +done diff --git a/Utilities/GitSetup/tips b/Utilities/GitSetup/tips new file mode 100755 index 0000000..784e1ed --- /dev/null +++ b/Utilities/GitSetup/tips @@ -0,0 +1,55 @@ +#!/usr/bin/env bash +#============================================================================= +# Copyright 2010-2012 Kitware, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +#============================================================================= + +# This script makes optional suggestions for working with Git. + +# Project configuration instructions: NONE + +egrep-q() { + egrep "$@" >/dev/null 2>/dev/null +} + +# Suggest color configuration. +if test -z "$(git config --get color.ui)"; then + echo ' +One may enable color output from Git commands with + + git config --global color.ui auto +' +fi + +# Suggest bash completion. +if ! bash -i -c 'echo $PS1' | egrep-q '__git_ps1'; then + echo ' +A dynamic, informative Git shell prompt can be obtained by sourcing +the git bash-completion script in your "~/.bashrc". Set the PS1 +environmental variable as suggested in the comments at the top of the +bash-completion script. You may need to install the bash-completion +package from your distribution to obtain it. +' +fi + +# Suggest merge tool. +if test -z "$(git config --get merge.tool)"; then + echo ' +One may configure Git to load a merge tool with + + git config merge.tool <toolname> + +See "git help mergetool" for more information. +' +fi diff --git a/Utilities/SetupForDevelopment.sh b/Utilities/SetupForDevelopment.sh new file mode 100755 index 0000000..0a9df7e --- /dev/null +++ b/Utilities/SetupForDevelopment.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash + +cd "${BASH_SOURCE%/*}/.." && +Utilities/GitSetup/setup-user && echo && +Utilities/GitSetup/setup-hooks && echo && +Utilities/GitSetup/setup-stage && echo && +(Utilities/GitSetup/setup-ssh || + echo 'Failed to setup SSH. Run this again to retry.') && echo && +Utilities/GitSetup/tips + +# Rebase master by default +git config rebase.stat true +git config branch.master.rebase true diff --git a/Utilities/cmlibarchive/CMakeLists.txt b/Utilities/cmlibarchive/CMakeLists.txt index 7f7a69f..ebf28ae 100644 --- a/Utilities/cmlibarchive/CMakeLists.txt +++ b/Utilities/cmlibarchive/CMakeLists.txt @@ -2,7 +2,7 @@ # PROJECT(libarchive C) # -CMAKE_MINIMUM_REQUIRED(VERSION 2.6.3 FATAL_ERROR) +CMAKE_MINIMUM_REQUIRED(VERSION 2.8 FATAL_ERROR) SET(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/build/cmake") if(NOT CMAKE_RUNTIME_OUTPUT_DIRECTORY) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${libarchive_BINARY_DIR}/bin) diff --git a/Utilities/cmlibarchive/libarchive/archive_endian.h b/Utilities/cmlibarchive/libarchive/archive_endian.h index 1dd8536..c3c78b3 100644 --- a/Utilities/cmlibarchive/libarchive/archive_endian.h +++ b/Utilities/cmlibarchive/libarchive/archive_endian.h @@ -44,9 +44,12 @@ * - Watcom C++ in C code. (For any version?) * - SGI MIPSpro * - Microsoft Visual C++ 6.0 (supposedly newer versions too) + * - IBM VisualAge 6 (XL v6) */ #if defined(__WATCOMC__) || defined(__sgi) || defined(__hpux) || defined(__BORLANDC__) #define inline +#elif defined(__IBMC__) && __IBMC__ < 700 +#define inline #elif defined(_MSC_VER) || defined(__osf__) #define inline __inline #endif diff --git a/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c b/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c index 87136a6..0b9aaf9 100644 --- a/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c +++ b/Utilities/cmlibarchive/libarchive/archive_write_set_format_iso9660.c @@ -197,7 +197,7 @@ struct isofile { enum { NO = 0, BOOT_CATALOG, - BOOT_IMAGE, + BOOT_IMAGE } boot; /* @@ -850,7 +850,7 @@ enum dir_rec_type { DIR_REC_VD, /* Stored in Volume Descriptor. */ DIR_REC_SELF, /* Stored as Current Directory. */ DIR_REC_PARENT, /* Stored as Parent Directory. */ - DIR_REC_NORMAL, /* Stored as Child. */ + DIR_REC_NORMAL /* Stored as Child. */ }; /* @@ -860,7 +860,7 @@ enum vdc { VDC_STD, VDC_LOWERCASE, VDC_UCS2, - VDC_UCS2_DIRECT, + VDC_UCS2_DIRECT }; /* @@ -897,7 +897,7 @@ struct idr { enum char_type { A_CHAR, - D_CHAR, + D_CHAR }; @@ -3989,7 +3989,7 @@ enum keytype { KEY_FLG, KEY_STR, KEY_INT, - KEY_HEX, + KEY_HEX }; static void set_option_info(struct archive_string *info, int *opt, const char *key, @@ -18,18 +18,11 @@ die() { # Version number extraction function. cmake_version_component() { - cat "${cmake_source_dir}/CMakeLists.txt" | sed -n " + cat "${cmake_source_dir}/Source/CMakeVersion.cmake" | sed -n " /^SET(CMake_VERSION_${1}/ {s/SET(CMake_VERSION_${1} *\([0-9]*\))/\1/;p;} " } -cmake_date_stamp_component() -{ - cat "${cmake_source_dir}/Source/kwsys/kwsysDateStamp.cmake" | sed -n " -/KWSYS_DATE_STAMP_${1}/ {s/^.* \([0-9][0-9]*\))$/\1/;p;} -" -} - cmake_toupper() { echo "$1" | sed 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' @@ -46,9 +39,6 @@ cmake_version_minor="`cmake_version_component MINOR`" cmake_version_patch="`cmake_version_component PATCH`" cmake_version="${cmake_version_major}.${cmake_version_minor}.${cmake_version_patch}" cmake_version_tweak="`cmake_version_component TWEAK`" -if [ "x$cmake_version_tweak" = "x" ]; then - cmake_version_tweak="`cmake_date_stamp_component YEAR``cmake_date_stamp_component MONTH``cmake_date_stamp_component DAY`" -fi if [ "$cmake_version_tweak" != "0" ]; then cmake_version="${cmake_version}.${cmake_version_tweak}" fi @@ -405,7 +395,6 @@ cmake_kwsys_config_replace_string () echo "${APPEND}" > "${OUTFILE}${_tmp}" cat "${INFILE}" | sed "/./ {s/\@KWSYS_NAMESPACE\@/cmsys/g; - s/@KWSYS_DO_NOT_CLEAN_PUTENV@/0/g; s/@KWSYS_BUILD_SHARED@/${KWSYS_BUILD_SHARED}/g; s/@KWSYS_LFS_AVAILABLE@/${KWSYS_LFS_AVAILABLE}/g; s/@KWSYS_LFS_REQUESTED@/${KWSYS_LFS_REQUESTED}/g; @@ -1049,6 +1038,9 @@ KWSYS_STL_HAS_ALLOCATOR_NONTEMPLATE=0 KWSYS_STL_HAS_ALLOCATOR_REBIND=0 KWSYS_STL_HAS_ALLOCATOR_MAX_SIZE_ARGUMENT=0 KWSYS_STL_HAS_ALLOCATOR_OBJECTS=0 +KWSYS_CXX_HAS_SETENV=0 +KWSYS_CXX_HAS_UNSETENV=0 +KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=0 KWSYS_CXX_HAS_CSTDDEF=0 KWSYS_CXX_HAS_NULL_TEMPLATE_ARGS=0 KWSYS_CXX_HAS_MEMBER_TEMPLATES=0 @@ -1060,6 +1052,33 @@ KWSYS_STL_STRING_HAVE_ISTREAM=1 KWSYS_STL_STRING_HAVE_OSTREAM=1 if cmake_try_run "${cmake_cxx_compiler}" \ + "${cmake_cxx_flags} -DTEST_KWSYS_CXX_HAS_SETENV" \ + "${cmake_source_dir}/Source/kwsys/kwsysPlatformTestsCXX.cxx" >> cmake_bootstrap.log 2>&1; then + KWSYS_CXX_HAS_SETENV=1 + echo "${cmake_cxx_compiler} has setenv" +else + echo "${cmake_cxx_compiler} does not have setenv" +fi + +if cmake_try_run "${cmake_cxx_compiler}" \ + "${cmake_cxx_flags} -DTEST_KWSYS_CXX_HAS_UNSETENV" \ + "${cmake_source_dir}/Source/kwsys/kwsysPlatformTestsCXX.cxx" >> cmake_bootstrap.log 2>&1; then + KWSYS_CXX_HAS_UNSETENV=1 + echo "${cmake_cxx_compiler} has unsetenv" +else + echo "${cmake_cxx_compiler} does not have unsetenv" +fi + +if cmake_try_run "${cmake_cxx_compiler}" \ + "${cmake_cxx_flags} -DTEST_KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H" \ + "${cmake_source_dir}/Source/kwsys/kwsysPlatformTestsCXX.cxx" >> cmake_bootstrap.log 2>&1; then + KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=1 + echo "${cmake_cxx_compiler} has environ in stdlib.h" +else + echo "${cmake_cxx_compiler} does not have environ in stdlib.h" +fi + +if cmake_try_run "${cmake_cxx_compiler}" \ "${cmake_cxx_flags} -DTEST_KWSYS_STL_HAVE_STD" \ "${cmake_source_dir}/Source/kwsys/kwsysPlatformTestsCXX.cxx" >> cmake_bootstrap.log 2>&1; then KWSYS_STL_HAVE_STD=1 @@ -1375,7 +1394,7 @@ cmake_replace_string "${cmake_source_dir}/Source/kwsys/kwsys_stl.hxx.in" \ cmake_replace_string "${cmake_bootstrap_dir}/cmsys/stl/stl.hxx_a" \ "${cmake_bootstrap_dir}/cmsys/stl/stl.hxx_b" KWSYS_NAMESPACE cmsys -for a in string vector map algorithm; do +for a in string vector set map algorithm; do cmake_replace_string "${cmake_bootstrap_dir}/cmsys/stl/stl.hxx_b" \ "${cmake_bootstrap_dir}/cmsys/stl/${a}" KWSYS_STL_HEADER ${a} done @@ -1406,6 +1425,7 @@ if [ "x${cmake_cxx_flags}" != "x" ]; then fi cmake_c_flags_String="-DKWSYS_STRING_C" +cmake_cxx_flags_SystemTools="-DKWSYS_CXX_HAS_SETENV=${KWSYS_CXX_HAS_SETENV} -DKWSYS_CXX_HAS_UNSETENV=${KWSYS_CXX_HAS_UNSETENV} -DKWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H=${KWSYS_CXX_HAS_ENVIRON_IN_STDLIB_H}" cmake_c_flags="${cmake_c_flags}-I`cmake_escape \"${cmake_bootstrap_dir}\"` -I`cmake_escape \"${cmake_source_dir}/Source\"` \ -I`cmake_escape \"${cmake_bootstrap_dir}\"`" cmake_cxx_flags="${cmake_cxx_flags} -I`cmake_escape \"${cmake_bootstrap_dir}\"` -I`cmake_escape \"${cmake_source_dir}/Source\"` \ @@ -1431,8 +1451,9 @@ for a in ${KWSYS_C_SOURCES} ${KWSYS_C_MINGW_SOURCES}; do done for a in ${KWSYS_CXX_SOURCES}; do src=`cmake_escape "${cmake_source_dir}/Source/kwsys/${a}.cxx"` + src_flags=`eval echo \\${cmake_cxx_flags_\${a}}` echo "${a}.o : ${src} ${dep}" >> "${cmake_bootstrap_dir}/Makefile" - echo " ${cmake_cxx_compiler} ${cmake_cxx_flags} -DKWSYS_NAMESPACE=cmsys -c ${src} -o ${a}.o" >> "${cmake_bootstrap_dir}/Makefile" + echo " ${cmake_cxx_compiler} ${cmake_cxx_flags} -DKWSYS_NAMESPACE=cmsys ${src_flags} -c ${src} -o ${a}.o" >> "${cmake_bootstrap_dir}/Makefile" done if ${cmake_system_mingw}; then src=`cmake_escape "${cmake_bootstrap_dir}/cmsysProcessFwd9xEnc.c"` |