Merge branch release-2016
authorTeemu Murtola <teemu.murtola@gmail.com>
Mon, 12 Dec 2016 19:39:12 +0000 (21:39 +0200)
committerTeemu Murtola <teemu.murtola@gmail.com>
Mon, 12 Dec 2016 20:36:50 +0000 (22:36 +0200)
Conflicts:
    cmake/gmxVersionInfo.cmake

Add a suppression for Intel compiler warning in generated code in
scanner.cpp.

Change-Id: I3a6310c433a50202fbc76e53570a491bd3d06544

1  2 
CMakeLists.txt
admin/builds/gromacs.py
cmake/gmxVersionInfo.cmake
src/gromacs/CMakeLists.txt
src/gromacs/selection/scanner.cpp
src/gromacs/selection/scanner.l
src/gromacs/selection/scanner_flex.h

diff --combined CMakeLists.txt
index f0bca63a4c9ed80bba56912bca64d840f991d2c3,80c5ab8afcb8d856f2bd722764e458f4601b2eb6..c76572b9b2a8c4a6982575a67e9b53ca5691dc5d
  # To help us fund GROMACS development, we humbly ask that you cite
  # the research papers on the package. Check out http://www.gromacs.org.
  
 -cmake_minimum_required(VERSION 2.8.8)
 -# When we require cmake >= 2.8.12, it will provide
 -# CMAKE_MINIMUM_REQUIRED_VERSION automatically, but in the meantime we
 -# need to set a variable, and it must have a different name.
 -set(GMX_CMAKE_MINIMUM_REQUIRED_VERSION "2.8.8")
 +cmake_minimum_required(VERSION 3.4.3)
  
  # CMake modules/macros are in a subdirectory to keep this file cleaner
  # This needs to be set before project() in order to pick up toolchain files
@@@ -66,10 -70,11 +66,10 @@@ include(gmxBuildTypeMSAN
  include(gmxBuildTypeReleaseWithAssert)
  
  if(NOT CMAKE_BUILD_TYPE)
 -    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Reference RelWithAssert Profile." FORCE)
 -    # There's no need to offer a user the choice of ThreadSanitizer
 +    set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Choose the type of build, options are: Debug Release RelWithDebInfo MinSizeRel Reference RelWithAssert Profile TSAN ASAN MSAN." FORCE)
      # Set the possible values of build type for cmake-gui
      set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release"
 -        "MinSizeRel" "RelWithDebInfo" "Reference" "RelWithAssert" "Profile")
 +        "MinSizeRel" "RelWithDebInfo" "Reference" "RelWithAssert" "Profile" "TSAN" "ASAN" "MSAN")
  endif()
  if(CMAKE_CONFIGURATION_TYPES)
      # Add appropriate GROMACS-specific build types for the Visual
@@@ -85,8 -90,14 +85,8 @@@ set(build_types_with_explicit_flags REL
  
  set_property(GLOBAL PROPERTY FIND_LIBRARY_USE_LIB64_PATHS ON)
  
 -# Set a default valgrind suppression file.
 -# This unfortunately needs to duplicate information from CTest to work as
 -# expected...
 -set(MEMORYCHECK_SUPPRESSIONS_FILE
 -    "${CMAKE_SOURCE_DIR}/cmake/legacy_and_external.supp"
 -    CACHE FILEPATH
 -    "File that contains suppressions for the memory checker")
 -include(CTest)
 +include(gmxCTestUtilities)
 +gmx_ctest_init()
  
  include(gmxCPackUtilities)
  gmx_cpack_init()
@@@ -186,16 -197,12 +186,16 @@@ gmx_add_cache_dependency(GMX_COOL_QUOTE
  
  option(GMX_USE_OPENCL "Enable OpenCL acceleration" OFF)
  
 -# Decide on GPU settings based on user-settings and GPU/CUDA detection.
 -# GCC 4.6 requires CUDA 5.0 and VS2015 requires CUDA 8.0
 +# Decide on GPU settings based on user-settings and GPU/CUDA
 +# detection.  GCC 4.8 requires CUDA 6.0 (but we choose 6.5 for the
 +# preliminary C++11 support), icc 15 requires CUDA 7.0, and VS2015
 +# requires CUDA 8.0
  if(MSVC)
      set(REQUIRED_CUDA_VERSION 8.0)
 +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
 +    set(REQUIRED_CUDA_VERSION 7.0)
  else()
 -    set(REQUIRED_CUDA_VERSION 5.0)
 +    set(REQUIRED_CUDA_VERSION 6.5)
  endif()
  set(REQUIRED_CUDA_COMPUTE_CAPABILITY 2.0)
  
@@@ -321,15 -328,6 +321,15 @@@ include(gmxManageOpenMP
  include(gmxCFlags)
  gmx_c_flags()
  
 +# These collect libraries that Gromacs requires for linking:
 +#  - Libraries that are required for libgromacs (only)
 +set(GMX_EXTRA_LIBRARIES "")
 +#  - Libraries that are required for all code in the repository
 +set(GMX_COMMON_LIBRARIES "")
 +#  - Libraries that all code linked against libgromacs needs
 +#    (i.e., something that is exposed in installed headers).
 +set(GMX_PUBLIC_LIBRARIES "")
 +
  # This variable should be used for additional compiler flags which are not
  # generated in gmxCFlags nor are SIMD or MPI related.
  set(EXTRA_C_FLAGS "")
@@@ -338,6 -336,17 +338,6 @@@ set(EXTRA_CXX_FLAGS ""
  # Run through a number of tests for buggy compilers and other issues
  include(gmxTestCompilerProblems)
  gmx_test_compiler_problems()
 -# GMX_SIMD will not be set automatically until the second
 -# pass (which is not strictly guaranteed to occur), so putting this
 -# check here among logically-related tests is inefficient, but the
 -# potential loss is likely zero.
 -if(GMX_SIMD STREQUAL "AVX_256"
 -        AND CMAKE_COMPILER_IS_GNUCC
 -        AND (C_COMPILER_VERSION VERSION_EQUAL "4.6.1"
 -            OR CXX_COMPILER_VERSION VERSION_EQUAL "4.6.1"))
 -    message(FATAL_ERROR "gcc 4.6.1 has buggy support for AVX, and GROMACS mdrun will not work. If you want simulation performance, use a more recent compiler. Otherwise, use GMX_SIMD=SSE4.1")
 -    # See http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49002
 -endif()
  
  # Implement double-precision option. This is complicated because we
  # need installed headers to use the precision mode of the build that
@@@ -457,6 -466,11 +457,6 @@@ include(gmxManageSharedLibraries
  # Find external packages                                               #
  ########################################################################
  
 -# TNG wants zlib if it is available. And static libxml2 might have a dependency
 -find_package(ZLIB QUIET)
 -include(gmxTestZLib)
 -gmx_test_zlib(HAVE_ZLIB)
 -
  # Unconditionally find the package, as it is also required for unit
  # tests. This exports LIBXML2_FOUND, which we should not use because
  # it does not tell us that linking will succeed. Instead, we test that
@@@ -484,15 -498,25 +484,25 @@@ if(DEFINED HWLOC_LIBRARIES
    set(Hwloc_FIND_QUIETLY TRUE)
  endif()
  find_package(Hwloc 1.5)
- if(HWLOC_FOUND)
-     set(GMX_HWLOC_DEFAULT ON)
+ if (HWLOC_FOUND)
+     if (HWLOC_LIBRARIES MATCHES ".a$")
+         set(_STATIC_HWLOC TRUE)
+     endif()
+     gmx_check_if_changed(HWLOC_FOUND_CHANGED HWLOC_FOUND)
+     if (_STATIC_HWLOC AND HWLOC_FOUND_CHANGED)
+         message(STATUS "Static hwloc library found, will not attempt using it as it could lead to link-time errors. To use the detected library, manually set GMX_HWLOC=ON and you will likely have to pass appropriate linker flags too to satisfy the link-time dependencies of your hwloc library. Try "pkg-config --libs --static hwloc" for suggestions on what you will need.")
+         set(GMX_HWLOC_DEFAULT OFF)
+     else()
+         set(GMX_HWLOC_DEFAULT ON)
+     endif()
  else()
      set(GMX_HWLOC_DEFAULT OFF)
  endif()
  option(GMX_HWLOC "Add support for hwloc Portable Hardware locality library" ${GMX_HWLOC_DEFAULT})
  if(GMX_HWLOC)
      if(HWLOC_FOUND)
 -        include_directories(${HWLOC_INCLUDE_DIRS})
 +        include_directories(SYSTEM ${HWLOC_INCLUDE_DIRS})
          list(APPEND GMX_EXTRA_LIBRARIES ${HWLOC_LIBRARIES})
      else()
          message(FATAL_ERROR "Hwloc package support requested, but not found.")
@@@ -551,6 -575,7 +561,6 @@@ if (TMPI_ATOMICS_DISABLED
     add_definitions(-DTMPI_ATOMICS_DISABLED)
  endif()
  
 -# Note this relies on zlib detection having already run
  include(gmxManageTNG)
  
  include(gmxManageLmfit)
  if(GMX_GPU)
      # now that we have detected the dependencies, do the second configure pass
      gmx_gpu_setup()
 -else()
 -    mark_as_advanced(CUDA_HOST_COMPILER)
  endif()
  
  if(CYGWIN)
@@@ -590,9 -617,7 +600,9 @@@ gmx_add_cache_dependency(GMX_BUILD_UNIT
  
  add_definitions( -DHAVE_CONFIG_H )
  include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src)
 -include_directories(BEFORE ${CMAKE_SOURCE_DIR}/src/external/thread_mpi/include)
 +# TODO required at high level because both libgromacs and progs/mdrun
 +# require it, both for thread-MPI and its atomics and mutexes.
 +include_directories(BEFORE SYSTEM ${CMAKE_SOURCE_DIR}/src/external/thread_mpi/include)
  # Required for config.h, maybe should only be set in src/CMakeLists.txt
  include_directories(BEFORE ${CMAKE_BINARY_DIR}/src)
  
@@@ -711,8 -736,8 +721,8 @@@ if(HAVE_TIME_H AND HAVE_UNISTD_H AND HA
  endif()
  
  # Math and thread libraries must often come after all others when linking...
 -if(HAVE_LIBM)
 -    list(APPEND GMX_EXTRA_LIBRARIES m)
 +if (HAVE_LIBM)
 +    list(APPEND GMX_PUBLIC_LIBRARIES m)
  endif()
  
  option(GMX_NACL "Configure for Native Client builds" OFF)
@@@ -762,7 -787,7 +772,7 @@@ else(
      message("CMAKE_CXX_FLAGS_RELEASE: ${GMXC_CXXFLAGS_RELEASE}")
      message("CMAKE_CXX_FLAGS_DEBUG: ${GMXC_CXXFLAGS_DEBUG}")
      message("CMAKE_EXE_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
 -    message("CMAKE_SHARED_LINKER_FLAGS: ${MPI_LINKER_FLAGS}")
 +    message("CMAKE_SHARED_LINKER_FLAGS: ${FFT_LINKER_FLAGS} ${MPI_LINKER_FLAGS}")
  endif()
  
  if(NOT GMX_OPENMP)
@@@ -812,12 -837,17 +822,12 @@@ include(gmxManageSuffixes
  ################################################################
  # Shared library load path settings
  ################################################################
 -# CMake supports RPATH on OS X only from 2.8.12 upwards.
 -# CMAKE_SYSTEM_VERSION > 8.0 matches OS X 10.5 and above, where RPATH support
 -# was added.
 -
  if(NOT GMX_BUILD_SHARED_EXE)
      # No rpath
      set(CMAKE_SKIP_RPATH TRUE)
      set(CMAKE_EXE_LINK_DYNAMIC_C_FLAGS) # remove -Wl,-Bdynamic
      set(CMAKE_EXE_LINK_DYNAMIC_CXX_FLAGS)
 -elseif((NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") OR
 -   ((CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0) AND (NOT CMAKE_VERSION VERSION_LESS 2.8.12)))
 +else()
      # The build folder always has bin/ and lib/; if we are also going to
      # install to lib/, then the installation RPATH works also in the build
      # tree.  This makes installation slightly faster (no need to rewrite the
      endif()
      # Set the RPATH as relative to the executable location to make the
      # binaries relocatable.
 -    if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin")
 +    if(NOT CMAKE_SYSTEM_NAME STREQUAL "Darwin") #Assume OS X >=10.5
          set(CMAKE_INSTALL_RPATH "\$ORIGIN/../${GMX_LIB_INSTALL_DIR}")
      else()
          set(CMAKE_INSTALL_RPATH "@executable_path/../${GMX_LIB_INSTALL_DIR}")
      endif()
      set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
      set(CMAKE_MACOSX_RPATH 1)
 -else()
 -    # We are on Darwin/OSX, and CMake cannot handle RPATHs automatically.
 -    if(CMAKE_SYSTEM_VERSION VERSION_GREATER 8.0)
 -        # Set the RPATH options manually.
 -        set(CMAKE_INSTALL_NAME_DIR "@rpath")
 -        set(GMX_EXE_LINKER_FLAGS ${GMX_EXE_LINKER_FLAGS} "-Wl,-rpath,@executable_path/../${GMX_LIB_INSTALL_DIR}")
 -    else()
 -        # Use the old INSTALL_NAME_DIR mechanism if RPATH is not supported.
 -        set(CMAKE_INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/${LIB_INSTALL_DIR}")
 -    endif()
  endif()
  
  #COPYING file: Only necessary for binary distributions.
@@@ -850,7 -890,18 +860,7 @@@ if (GMX_BUILD_FOR_COVERAGE
  endif()
  
  if (BUILD_TESTING)
 -    # "tests" target builds all the separate test binaries.
 -    add_custom_target(tests)
 -    # "run-ctest" is an internal target that actually runs the tests.
 -    # This is necessary to be able to add separate targets that execute as part
 -    # of 'make check', but are ensured to be executed after the actual tests.
 -    add_custom_target(run-ctest
 -                      COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure
 -                      COMMENT "Running all tests"
 -                      VERBATIM)
 -    add_dependencies(run-ctest tests)
 -    # "check" target builds and runs all tests.
 -    add_custom_target(check DEPENDS run-ctest)
 +    include(tests/CheckTarget.cmake)
  endif()
  
  if (NOT GMX_BUILD_MDRUN_ONLY)
diff --combined admin/builds/gromacs.py
index 622c49165a5487646d4f4ab455faf4d539276ecb,2ef5be3327c11c47111e9a47649a16fa6a85996a..659d0b61283d02ba42e670f29de1c0710eccd481
@@@ -110,20 -110,9 +110,15 @@@ def do_build(context)
      if context.opts.x11:
          cmake_opts['GMX_X11'] = 'ON'
  
 +    # At least hwloc on Jenkins produces a massive amount of reports about
 +    # memory leaks, which cannot be reasonably suppressed because ASAN cannot
 +    # produce a reasonable stack trace for them.
 +    if context.opts.asan:
 +        cmake_opts['GMX_HWLOC'] = 'OFF'
 +
      regressiontests_path = context.workspace.get_project_dir(Project.REGRESSIONTESTS)
  
      if context.job_type == JobType.RELEASE:
-         # TODO: Consider using REGRESSIONTEST_DOWNLOAD here, after refactoring
-         # it to make that possible.  Or use some other mechanism to check the
-         # MD5 of the regressiontests tarball (also taking into account the -dev
-         # builds where the hardcoded value in gmxVersionInfo.cmake is not
-         # accurate).
          cmake_opts['REGRESSIONTEST_PATH'] = regressiontests_path
      else:
          if context.opts.mdrun_only:
      else:
          context.build_target(target='tests', keep_going=True)
  
 -        context.run_ctest(args=['--output-on-failure'])
 +        context.run_ctest(args=['--output-on-failure'], memcheck=context.opts.asan)
  
          context.build_target(target='install')
          # TODO: Consider what could be tested about the installed binaries.
              use_tmpi = not context.opts.mpi and context.opts.thread_mpi is not False
  
              cmd = 'perl gmxtest.pl -mpirun mpirun -xml -nosuffix all'
 -            if context.opts.asan:
 -                cmd+=' -parse asan_symbolize.py'
  
              # setting this stuff below is just a temporary solution,
              # it should all be passed as a proper the runconf from outside
                  cmd += ' -nt 2'
              if context.opts.double:
                  cmd += ' -double'
 +            if context.opts.asan:
 +                context.env.set_env_var('ASAN_OPTIONS', 'detect_leaks=0')
              context.run_cmd(cmd, shell=True, failure_message='Regression tests failed to execute')
index 44ffa8197828e9a36ab568fe663fca59cbcc3a08,700af4ffc3e1885a7f62a72fc4c4013409156f14..e886ff0825c5939310817136906dec0c19ad822a
  # The main interface to this machinery is the gmx_configure_version_file()
  # CMake function.  The signature is
  #   gmx_configure_version_file(<input> <output>
 -#                              [REMOTE_HASH] [SOURCE_FILE]
 +#                              [REMOTE_HASH]
  #                              [TARGET <target>]
  #                              [COMMENT <comment>])
  #   <input>      Specify the input and output files as for configure_file().
  #                This variable is much more expensive to initialize than the
  #                others, so this allows local changes in this file to only
  #                compute that value when required if that becomes necessary.
 -#   SOURCE_FILE  Signals that <output> will be used as a source file.
 -#                The function will set properties for the source file
 -#                appropriately to signify that it is generated.
  #   TARGET       By default, this function uses add_custom_command() to
  #                generate the output file.  If TARGET is specified, then
  #                add_custom_target() is used to create a target with the given
  
  # The GROMACS convention is that these are the version number of the next
  # release that is going to be made from this branch.
 -set(GMX_VERSION_MAJOR 2016)
 -set(GMX_VERSION_PATCH 2)
 +set(GMX_VERSION_MAJOR 2017)
 +set(GMX_VERSION_PATCH 0)
  # The suffix, on the other hand, is used mainly for betas and release
  # candidates, where it signifies the most recent such release from
  # this branch; it will be empty before the first such release, as well
@@@ -201,8 -204,8 +201,8 @@@ set(GMX_VERSION_SUFFIX ""
  # here. The important thing is to minimize the chance of third-party
  # code being able to dynamically link with a version of libgromacs
  # that might not work.
 -set(LIBRARY_SOVERSION_MAJOR 2)
 -set(LIBRARY_SOVERSION_MINOR 1)
 +set(LIBRARY_SOVERSION_MAJOR 3)
 +set(LIBRARY_SOVERSION_MINOR 0)
  set(LIBRARY_VERSION ${LIBRARY_SOVERSION_MAJOR}.${LIBRARY_SOVERSION_MINOR}.0)
  
  #####################################################################
@@@ -216,22 -219,28 +216,28 @@@ endif(
  set(GMX_VERSION_STRING "${GMX_VERSION}${GMX_VERSION_SUFFIX}")
  option(GMX_BUILD_TARBALL "Build tarball without -dev version suffix" OFF)
  mark_as_advanced(GMX_BUILD_TARBALL)
- if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND NOT GMX_BUILD_TARBALL)
+ # If run with cmake -P, the -dev suffix is managed elsewhere.
+ if (NOT SOURCE_IS_SOURCE_DISTRIBUTION AND
+     NOT GMX_BUILD_TARBALL AND
+     NOT CMAKE_SCRIPT_MODE_FILE)
      set(GMX_VERSION_STRING "${GMX_VERSION_STRING}-dev")
  endif()
  
  set(REGRESSIONTEST_VERSION "${GMX_VERSION_STRING}")
 -set(REGRESSIONTEST_BRANCH "refs/heads/release-2016")
 -set(REGRESSIONTEST_MD5SUM "366438549270d005fa6def6e56ca0256" CACHE INTERNAL "MD5 sum of the regressiontests tarball")
 +set(REGRESSIONTEST_BRANCH "refs/heads/master")
- # TODO Find some way of ensuring that this is bumped appropriately for
- # each release. It's hard to test because it is only used for
- # REGRESSIONTEST_DOWNLOAD, which doesn't work until that tarball has
- # been placed on the server.
 +set(REGRESSIONTEST_MD5SUM "366438549270d005fa6def6e56ca0256")
  
  math(EXPR GMX_VERSION_NUMERIC
       "${GMX_VERSION_MAJOR}*10000 + ${GMX_VERSION_PATCH}")
  set(GMX_API_VERSION ${GMX_VERSION_NUMERIC})
  
+ # If run with cmake -P from releng scripts, print out necessary version info
+ # as JSON.
+ if (CMAKE_SCRIPT_MODE_FILE)
+     message("{ \"version\": \"${GMX_VERSION_STRING}\", \"regressiontest-md5sum\": \"${REGRESSIONTEST_MD5SUM}\" }")
+     return()
+ endif()
  #####################################################################
  # git version info management
  
@@@ -347,7 -356,7 +353,7 @@@ unset(GMX_VERSION_CENTRAL_BASE_HASH
  # See documentation at the top of the script.
  function (gmx_configure_version_file INFILE OUTFILE)
      include(CMakeParseArguments)
 -    set(_options REMOTE_HASH SOURCE_FILE)
 +    set(_options REMOTE_HASH)
      set(_one_value_args COMMENT TARGET)
      set(_multi_value_args EXTRA_VARS)
      cmake_parse_arguments(
          add_custom_target(${ARG_TARGET} DEPENDS ${OUTFILE} VERBATIM)
          gmx_set_custom_target_output(${ARG_TARGET} ${OUTFILE})
      endif()
 -    if (ARG_SOURCE_FILE)
 -        set_source_files_properties(${OUTFILE} PROPERTIES GENERATED true)
 -    endif()
  endfunction()
index be72d3df3793f6d21eb29cb611ea3ead99c16fdc,a42e624e1d6d6ac7711d909d84f0feaa7a5d0bc2..65f2ac435360c91ea2ccf0d6d497b630ed4d5180
@@@ -71,7 -71,6 +71,7 @@@ endfunction(
  
  add_subdirectory(gmxlib)
  add_subdirectory(mdlib)
 +add_subdirectory(applied-forces)
  add_subdirectory(listed-forces)
  add_subdirectory(commandline)
  add_subdirectory(domdec)
@@@ -122,6 -121,13 +122,6 @@@ list(APPEND LIBGROMACS_SOURCES ${GMXLIB
  tmpi_get_source_list(THREAD_MPI_SOURCES ${CMAKE_SOURCE_DIR}/src/external/thread_mpi/src)
  list(APPEND LIBGROMACS_SOURCES ${THREAD_MPI_SOURCES})
  
 -if(GMX_USE_TNG)
 -    list(APPEND LIBGROMACS_SOURCES ${TNG_SOURCES})
 -    if (NOT GMX_EXTERNAL_TNG)
 -        tng_set_source_properties(WITH_ZLIB ${HAVE_ZLIB})
 -    endif()
 -endif()
 -
  get_lmfit_properties(LMFIT_SOURCES LMFIT_LIBRARIES_TO_LINK LMFIT_INCLUDE_DIRECTORY LMFIT_INCLUDE_DIR_ORDER)
  include_directories(${LMFIT_INCLUDE_DIR_ORDER} SYSTEM "${LMFIT_INCLUDE_DIRECTORY}")
  list(APPEND LIBGROMACS_SOURCES ${LMFIT_SOURCES})
@@@ -146,13 -152,10 +146,13 @@@ gmx_install_headers
  set(GENERATED_VERSION_FILE utility/baseversion-gen.c)
  gmx_configure_version_file(
      utility/baseversion-gen.c.cmakein ${GENERATED_VERSION_FILE}
 -    REMOTE_HASH SOURCE_FILE)
 +    REMOTE_HASH)
  list(APPEND LIBGROMACS_SOURCES ${GENERATED_VERSION_FILE})
  
  if (GMX_USE_CUDA)
 +    # Work around FindCUDA that prevents using target_link_libraries()
 +    # with keywords otherwise...
 +    set(CUDA_LIBRARIES PRIVATE ${CUDA_LIBRARIES})
      cuda_add_library(libgromacs ${LIBGROMACS_SOURCES})
  else()
      add_library(libgromacs ${LIBGROMACS_SOURCES})
@@@ -167,31 -170,17 +167,22 @@@ check_cxx_compiler_flag(-Wno-unused-par
  if (HAS_NO_UNUSED_PARAMETER)
      set(_scanner_cpp_compiler_flags "${_scanner_cpp_compiler_flags} -Wno-unused-parameter")
  endif()
- check_cxx_compiler_flag(-Wno-deprecated-register HAS_NO_DEPRECATED_REGISTER)
- if (HAS_NO_DEPRECATED_REGISTER)
-     set(_scanner_cpp_compiler_flags "${_scanner_cpp_compiler_flags} -Wno-deprecated-register")
- else()
-     check_cxx_compiler_flag(-Wno-deprecated HAS_NO_DEPRECATED)
-     if (HAS_NO_DEPRECATED)
-         set(_scanner_cpp_compiler_flags "${_scanner_cpp_compiler_flags} -Wno-deprecated")
-     endif()
- endif()
  set_source_files_properties(selection/scanner.cpp PROPERTIES COMPILE_FLAGS "${_scanner_cpp_compiler_flags}")
  
 +gmx_setup_tng_for_libgromacs()
 +
  target_link_libraries(libgromacs
 +                      PRIVATE
                        ${EXTRAE_LIBRARIES}
                        ${GMX_EXTRA_LIBRARIES}
 -                      ${TNG_IO_LIBRARIES}
 +                      ${GMX_COMMON_LIBRARIES}
                        ${FFT_LIBRARIES} ${LINEAR_ALGEBRA_LIBRARIES}
 -                      ${XML_LIBRARIES}
                        ${LMFIT_LIBRARIES_TO_LINK}
                        ${THREAD_LIB} ${GMX_SHARED_LINKER_FLAGS} ${OPENCL_LIBRARIES}
 -                      ${GMX_STDLIB_LIBRARIES})
 +                      ${GMX_STDLIB_LIBRARIES}
 +                      PUBLIC
 +                      ${GMX_PUBLIC_LIBRARIES}
 +                      )
  set_target_properties(libgromacs PROPERTIES
                        OUTPUT_NAME "gromacs${GMX_LIBS_SUFFIX}"
                        SOVERSION ${LIBRARY_SOVERSION_MAJOR}
index 3cdfb93e73b11554cb8984336cb319257c61e377,c16a479a6793abca29797c07e961632832fd5963..0f506f14d4a6481e960c3bdafded2c54fc9fb077
@@@ -19,8 -19,8 +19,8 @@@
  
  #define FLEX_SCANNER
  #define YY_FLEX_MAJOR_VERSION 2
- #define YY_FLEX_MINOR_VERSION 5
- #define YY_FLEX_SUBMINOR_VERSION 37
+ #define YY_FLEX_MINOR_VERSION 6
+ #define YY_FLEX_SUBMINOR_VERSION 0
  #if YY_FLEX_SUBMINOR_VERSION > 0
  #define FLEX_BETA
  #endif
@@@ -170,7 -170,15 +170,15 @@@ typedef void* yyscan_t
  
  /* Size of default input buffer. */
  #ifndef YY_BUF_SIZE
+ #ifdef __ia64__
+ /* On IA-64, the buffer size is 16k, not 8k.
+  * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+  * Ditto for the __ia64__ case accordingly.
+  */
+ #define YY_BUF_SIZE 32768
+ #else
  #define YY_BUF_SIZE 16384
+ #endif /* __ia64__ */
  #endif
  
  /* The state buf must be large enough to hold one state per character in the main buffer.
@@@ -192,6 -200,7 +200,7 @@@ typedef size_t yy_size_t
  #define EOB_ACT_LAST_MATCH 2
  
      #define YY_LESS_LINENO(n)
+     #define YY_LINENO_REWIND_TO(ptr)
      
  /* Return all but the first "n" matched characters back to the input stream. */
  #define yyless(n) \
@@@ -347,6 -356,9 +356,9 @@@ typedef int yy_state_type
  static yy_state_type yy_get_previous_state (yyscan_t yyscanner );
  static yy_state_type yy_try_NUL_trans (yy_state_type current_state  ,yyscan_t yyscanner);
  static int yy_get_next_buffer (yyscan_t yyscanner );
+ #if defined(__GNUC__) && __GNUC__ >= 3
+ __attribute__((__noreturn__))
+ #endif
  static void yy_fatal_error (yyconst char msg[] ,yyscan_t yyscanner );
  
  /* Done after the current pattern has been matched and before the
@@@ -380,7 -392,7 +392,7 @@@ static yyconst flex_int16_t yy_accept[7
          3,    3,   17,    9,    0
      } ;
  
- static yyconst flex_int32_t yy_ec[256] =
+ static yyconst YY_CHAR yy_ec[256] =
      {   0,
          1,    1,    1,    1,    1,    1,    1,    1,    2,    3,
          2,    2,    2,    1,    1,    1,    1,    1,    1,    1,
          1,    1,    1,    1,    1
      } ;
  
- static yyconst flex_int32_t yy_meta[33] =
+ static yyconst YY_CHAR yy_meta[33] =
      {   0,
          1,    1,    2,    1,    1,    1,    1,    1,    3,    4,
          1,    1,    1,    4,    4,    1,    4,    4,    4,    4,
          4,    1
      } ;
  
- static yyconst flex_int16_t yy_base[80] =
+ static yyconst flex_uint16_t yy_base[80] =
      {   0,
          0,    0,   93,   92,   10,   12,    0,    0,  115,  118,
         35,   37,  101,   37,    0,  106,  102,   35,  118,   98,
@@@ -444,7 -456,7 +456,7 @@@ static yyconst flex_int16_t yy_def[80] 
         75,   75,   79,   79,    0,   75,   75,   75,   75
      } ;
  
- static yyconst flex_int16_t yy_nxt[151] =
+ static yyconst flex_uint16_t yy_nxt[151] =
      {   0,
         10,   11,   12,   13,   14,   15,   16,   10,   17,   18,
         19,   20,   21,   22,   22,   23,   24,   25,   22,   22,
@@@ -495,7 -507,7 +507,7 @@@ static yyconst flex_int16_t yy_chk[151
  /*
   * This file is part of the GROMACS molecular simulation package.
   *
-  * Copyright (c) 2009,2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
+  * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
   * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
   * and including many others, as listed in the AUTHORS file in the
   * top-level source directory and at http://www.gromacs.org.
  
  #line 60 "scanner.l"
  #include "gromacs/utility/cstringutil.h"
+ #include "gromacs/utility/stringutil.h"
  
  #include "parser.h"
  #include "scanner.h"
  // when we have return statements followed by break. Instead, we add breaks
  // manually.
  #define YY_BREAK
++
++#ifdef __INTEL_COMPILER
++// Ignore unused variables in generated code.
++#pragma warning(disable:593)
++#endif
  #define YY_NO_UNISTD_H 1
  
  
  
- #line 564 "scanner.cpp"
 -#line 577 "scanner.cpp"
++#line 582 "scanner.cpp"
  
  #define INITIAL 0
  #define matchof 1
@@@ -634,11 -647,11 +652,11 @@@ void _gmx_sel_yyset_extra (YY_EXTRA_TYP
  
  FILE *_gmx_sel_yyget_in (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_in  (FILE * in_str ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_in  (FILE * _in_str ,yyscan_t yyscanner );
  
  FILE *_gmx_sel_yyget_out (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_out  (FILE * out_str ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_out  (FILE * _out_str ,yyscan_t yyscanner );
  
  yy_size_t _gmx_sel_yyget_leng (yyscan_t yyscanner );
  
@@@ -646,11 -659,11 +664,11 @@@ char *_gmx_sel_yyget_text (yyscan_t yys
  
  int _gmx_sel_yyget_lineno (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_lineno (int line_number ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_lineno (int _line_number ,yyscan_t yyscanner );
  
  int _gmx_sel_yyget_column  (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_column (int column_no ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_column (int _column_no ,yyscan_t yyscanner );
  
  /* Macros after this point can all be overridden by user definitions in
   * section 1.
@@@ -664,8 -677,12 +682,12 @@@ extern int _gmx_sel_yywrap (yyscan_t yy
  #endif
  #endif
  
+ #ifndef YY_NO_UNPUT
+     
      static void yyunput (int c,char *buf_ptr  ,yyscan_t yyscanner);
      
+ #endif
  #ifndef yytext_ptr
  static void yy_flex_strncpy (char *,yyconst char *,int ,yyscan_t yyscanner);
  #endif
@@@ -686,7 -703,12 +708,12 @@@ static int input (yyscan_t yyscanner )
  
  /* Amount of stuff to slurp up with each read. */
  #ifndef YY_READ_BUF_SIZE
+ #ifdef __ia64__
+ /* On IA-64, the buffer size is 16k, not 8k */
+ #define YY_READ_BUF_SIZE 16384
+ #else
  #define YY_READ_BUF_SIZE 8192
+ #endif /* __ia64__ */
  #endif
  
  /* Copy whatever the last rule matched to the standard output. */
@@@ -773,7 -795,7 +800,7 @@@ extern int _gmx_sel_yylex (yyscan_t yys
  
  /* Code executed at the end of each rule. */
  #ifndef YY_BREAK
- #define YY_BREAK break;
+ #define YY_BREAK /*LINTED*/break;
  #endif
  
  #define YY_RULE_SETUP \
   */
  YY_DECL
  {
-       register yy_state_type yy_current_state;
-       register char *yy_cp, *yy_bp;
-       register int yy_act;
+       yy_state_type yy_current_state;
+       char *yy_cp, *yy_bp;
+       int yy_act;
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  
- #line 98 "scanner.l"
+       if ( !yyg->yy_init )
+               {
+               yyg->yy_init = 1;
+ #ifdef YY_USER_INIT
+               YY_USER_INIT;
+ #endif
+               if ( ! yyg->yy_start )
+                       yyg->yy_start = 1;      /* first start state */
+               if ( ! yyin )
+                       yyin = stdin;
+               if ( ! yyout )
+                       yyout = stdout;
+               if ( ! YY_CURRENT_BUFFER ) {
+                       _gmx_sel_yyensure_buffer_stack (yyscanner);
+                       YY_CURRENT_BUFFER_LVALUE =
+                               _gmx_sel_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
+               }
+               _gmx_sel_yy_load_buffer_state(yyscanner );
+               }
+       {
 -#line 99 "scanner.l"
++#line 104 "scanner.l"
  
  
  
      }
  
  
- #line 826 "scanner.cpp"
-       if ( !yyg->yy_init )
-               {
-               yyg->yy_init = 1;
- #ifdef YY_USER_INIT
-               YY_USER_INIT;
- #endif
-               if ( ! yyg->yy_start )
-                       yyg->yy_start = 1;      /* first start state */
-               if ( ! yyin )
-                       yyin = stdin;
-               if ( ! yyout )
-                       yyout = stdout;
 -#line 875 "scanner.cpp"
++#line 880 "scanner.cpp"
  
-               if ( ! YY_CURRENT_BUFFER ) {
-                       _gmx_sel_yyensure_buffer_stack (yyscanner);
-                       YY_CURRENT_BUFFER_LVALUE =
-                               _gmx_sel_yy_create_buffer(yyin,YY_BUF_SIZE ,yyscanner);
-               }
-               _gmx_sel_yy_load_buffer_state(yyscanner );
-               }
-       while ( 1 )             /* loops until end-of-file is reached */
+       while ( /*CONSTCOND*/1 )                /* loops until end-of-file is reached */
                {
                yy_cp = yyg->yy_c_buf_p;
  
  yy_match:
                do
                        {
-                       register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];
+                       YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ;
                        if ( yy_accept[yy_current_state] )
                                {
                                yyg->yy_last_accepting_state = yy_current_state;
@@@ -903,38 -926,38 +931,38 @@@ do_action:      /* This label is used only t
  
  case 1:
  YY_RULE_SETUP
- #line 131 "scanner.l"
 -#line 132 "scanner.l"
++#line 137 "scanner.l"
  break;
        YY_BREAK
  case 2:
  YY_RULE_SETUP
- #line 132 "scanner.l"
 -#line 133 "scanner.l"
++#line 138 "scanner.l"
  { yylval->i   = strtol(yytext, NULL, 10);    ADD_TOKEN; return TOK_INT; }
        YY_BREAK
  case 3:
  YY_RULE_SETUP
- #line 133 "scanner.l"
 -#line 134 "scanner.l"
++#line 139 "scanner.l"
  { yylval->r   = strtod(yytext, NULL);        ADD_TOKEN; return TOK_REAL; }
        YY_BREAK
  case 4:
  YY_RULE_SETUP
- #line 134 "scanner.l"
 -#line 135 "scanner.l"
++#line 140 "scanner.l"
  { yylval->str = gmx_strndup(yytext+1, yyleng-2); ADD_TOKEN; return STR;  }
        YY_BREAK
  case 5:
  /* rule 5 can match eol */
  YY_RULE_SETUP
- #line 136 "scanner.l"
 -#line 137 "scanner.l"
++#line 142 "scanner.l"
  { _gmx_sel_lexer_add_token(yylloc, " ", 1, state); break; }
        YY_BREAK
  case 6:
  /* rule 6 can match eol */
  YY_RULE_SETUP
- #line 137 "scanner.l"
 -#line 138 "scanner.l"
++#line 143 "scanner.l"
  {
                      if (yytext[0] == ';' || state->statusWriter != NULL)
                      {
-                         rtrim(state->pselstr);
+                         state->pselstr = gmx::stripString(state->pselstr);
                          state->bCmdStart = true;
                          return CMD_SEP;
                      }
                  }
        YY_BREAK
  case YY_STATE_EOF(cmdstart):
- #line 151 "scanner.l"
 -#line 152 "scanner.l"
++#line 157 "scanner.l"
  { state->bCmdStart = true; yyterminate(); }
        YY_BREAK
  case YY_STATE_EOF(INITIAL):
  case YY_STATE_EOF(matchof):
  case YY_STATE_EOF(matchbool):
- #line 152 "scanner.l"
 -#line 153 "scanner.l"
++#line 158 "scanner.l"
  { state->bCmdStart = true; return CMD_SEP; }
        YY_BREAK
  
  case 7:
  YY_RULE_SETUP
- #line 155 "scanner.l"
 -#line 156 "scanner.l"
++#line 161 "scanner.l"
  { ADD_TOKEN; yylval->i = 1; return TOK_INT; }
        YY_BREAK
  case 8:
  YY_RULE_SETUP
- #line 156 "scanner.l"
 -#line 157 "scanner.l"
++#line 162 "scanner.l"
  { ADD_TOKEN; yylval->i = 0; return TOK_INT; }
        YY_BREAK
  
  case 9:
  YY_RULE_SETUP
- #line 158 "scanner.l"
 -#line 159 "scanner.l"
++#line 164 "scanner.l"
  { ADD_TOKEN; return GROUP; }
        YY_BREAK
  case 10:
  YY_RULE_SETUP
- #line 159 "scanner.l"
 -#line 160 "scanner.l"
++#line 165 "scanner.l"
  { ADD_TOKEN; return TO; }
        YY_BREAK
  case 11:
  YY_RULE_SETUP
- #line 160 "scanner.l"
 -#line 161 "scanner.l"
++#line 166 "scanner.l"
  { ADD_TOKEN; BEGIN(0); return OF; }
        YY_BREAK
  case 12:
  YY_RULE_SETUP
- #line 161 "scanner.l"
 -#line 162 "scanner.l"
++#line 167 "scanner.l"
  { ADD_TOKEN; return AND; }
        YY_BREAK
  case 13:
  YY_RULE_SETUP
- #line 162 "scanner.l"
 -#line 163 "scanner.l"
++#line 168 "scanner.l"
  { ADD_TOKEN; return OR; }
        YY_BREAK
  case 14:
  YY_RULE_SETUP
- #line 163 "scanner.l"
 -#line 164 "scanner.l"
++#line 169 "scanner.l"
  { ADD_TOKEN; return XOR; }
        YY_BREAK
  case 15:
  YY_RULE_SETUP
- #line 164 "scanner.l"
 -#line 165 "scanner.l"
++#line 170 "scanner.l"
  { ADD_TOKEN; return NOT; }
        YY_BREAK
  case 16:
  YY_RULE_SETUP
- #line 165 "scanner.l"
 -#line 166 "scanner.l"
++#line 171 "scanner.l"
  { yylval->str = gmx_strndup(yytext, yyleng); ADD_TOKEN; return CMP_OP; }
        YY_BREAK
  case 17:
  YY_RULE_SETUP
- #line 167 "scanner.l"
 -#line 168 "scanner.l"
++#line 173 "scanner.l"
  { return _gmx_sel_lexer_process_identifier(yylval, yylloc, yytext, yyleng, state); }
        YY_BREAK
  case 18:
  /* rule 18 can match eol */
  YY_RULE_SETUP
- #line 169 "scanner.l"
 -#line 170 "scanner.l"
++#line 175 "scanner.l"
  { _gmx_sel_lexer_add_token(yylloc, " ", 1, state); break; }
        YY_BREAK
  case 19:
  YY_RULE_SETUP
- #line 170 "scanner.l"
 -#line 171 "scanner.l"
++#line 176 "scanner.l"
  { yylval->str = gmx_strndup(yytext, yyleng); ADD_TOKEN; return STR; }
        YY_BREAK
  case 20:
  YY_RULE_SETUP
- #line 171 "scanner.l"
 -#line 172 "scanner.l"
++#line 177 "scanner.l"
  { ADD_TOKEN; return yytext[0]; }
        YY_BREAK
  case 21:
  YY_RULE_SETUP
- #line 172 "scanner.l"
 -#line 173 "scanner.l"
++#line 178 "scanner.l"
  YY_FATAL_ERROR( "flex scanner jammed" );
        YY_BREAK
- #line 1037 "scanner.cpp"
 -#line 1060 "scanner.cpp"
++#line 1065 "scanner.cpp"
  
        case YY_END_OF_BUFFER:
                {
                        "fatal flex scanner internal error--no action found" );
        } /* end of action switch */
                } /* end of scanning one token */
+       } /* end of user's declarations */
  } /* end of _gmx_sel_yylex */
  
  /* yy_get_next_buffer - try to read in a new buffer
  static int yy_get_next_buffer (yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-       register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
-       register char *source = yyg->yytext_ptr;
-       register int number_to_move, i;
+       char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf;
+       char *source = yyg->yytext_ptr;
+       yy_size_t number_to_move, i;
        int ret_val;
  
        if ( yyg->yy_c_buf_p > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[yyg->yy_n_chars + 1] )
        /* Try to read more data. */
  
        /* First move last chars to start of buffer. */
-       number_to_move = (int) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
+       number_to_move = (yy_size_t) (yyg->yy_c_buf_p - yyg->yytext_ptr) - 1;
  
        for ( i = 0; i < number_to_move; ++i )
                *(dest++) = *(source++);
  
      static yy_state_type yy_get_previous_state (yyscan_t yyscanner)
  {
-       register yy_state_type yy_current_state;
-       register char *yy_cp;
+       yy_state_type yy_current_state;
+       char *yy_cp;
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  
        yy_current_state = yyg->yy_start;
  
        for ( yy_cp = yyg->yytext_ptr + YY_MORE_ADJ; yy_cp < yyg->yy_c_buf_p; ++yy_cp )
                {
-               register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
+               YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1);
                if ( yy_accept[yy_current_state] )
                        {
                        yyg->yy_last_accepting_state = yy_current_state;
   */
      static yy_state_type yy_try_NUL_trans  (yy_state_type yy_current_state , yyscan_t yyscanner)
  {
-       register int yy_is_jam;
+       int yy_is_jam;
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; /* This var may be unused depending upon options. */
-       register char *yy_cp = yyg->yy_c_buf_p;
+       char *yy_cp = yyg->yy_c_buf_p;
  
-       register YY_CHAR yy_c = 1;
+       YY_CHAR yy_c = 1;
        if ( yy_accept[yy_current_state] )
                {
                yyg->yy_last_accepting_state = yy_current_state;
        return yy_is_jam ? 0 : yy_current_state;
  }
  
-     static void yyunput (int c, register char * yy_bp , yyscan_t yyscanner)
+ #ifndef YY_NO_UNPUT
+     static void yyunput (int c, char * yy_bp , yyscan_t yyscanner)
  {
-       register char *yy_cp;
+       char *yy_cp;
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  
      yy_cp = yyg->yy_c_buf_p;
        if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 )
                { /* need to shift things up to make room */
                /* +2 for EOB chars. */
-               register yy_size_t number_to_move = yyg->yy_n_chars + 2;
-               register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
+               yy_size_t number_to_move = yyg->yy_n_chars + 2;
+               char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[
                                        YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2];
-               register char *source =
+               char *source =
                                &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move];
  
                while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf )
        yyg->yy_c_buf_p = yy_cp;
  }
  
+ #endif
  #ifndef YY_NO_INPUT
  #ifdef __cplusplus
      static int yyinput (yyscan_t yyscanner)
@@@ -1556,7 -1584,7 +1589,7 @@@ static void _gmx_sel_yy_load_buffer_sta
        if ( ! b )
                YY_FATAL_ERROR( "out of dynamic memory in _gmx_sel_yy_create_buffer()" );
  
-       b->yy_buf_size = size;
+       b->yy_buf_size = (yy_size_t)size;
  
        /* yy_ch_buf has to be 2 characters longer than the size given because
         * we need to put in 2 end-of-buffer characters.
@@@ -1717,7 -1745,7 +1750,7 @@@ static void _gmx_sel_yyensure_buffer_st
                 * scanner will even need a stack. We use 2 instead of 1 to avoid an
                 * immediate realloc on the next call.
           */
-               num_to_alloc = 1;
+               num_to_alloc = 1; // After all that talk, this was set to 1 anyways...
                yyg->yy_buffer_stack = (struct yy_buffer_state**)_gmx_sel_yyalloc
                                                                (num_to_alloc * sizeof(struct yy_buffer_state*)
                                                                , yyscanner);
        if (yyg->yy_buffer_stack_top >= (yyg->yy_buffer_stack_max) - 1){
  
                /* Increase the buffer to prepare for a possible push. */
-               int grow_size = 8 /* arbitrary grow size */;
+               yy_size_t grow_size = 8 /* arbitrary grow size */;
  
                num_to_alloc = yyg->yy_buffer_stack_max + grow_size;
                yyg->yy_buffer_stack = (struct yy_buffer_state**)_gmx_sel_yyrealloc
@@@ -1842,7 -1870,9 +1875,9 @@@ YY_BUFFER_STATE _gmx_sel_yy_scan_byte
  
  static void yy_fatal_error (yyconst char* msg , yyscan_t yyscanner)
  {
-       (void) fprintf( stderr, "%s\n", msg );
+       struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+       (void)yyg;
+       (void) fprintf( stderr, "%s\n", msg );
        exit( YY_EXIT_FAILURE );
  }
  
@@@ -1948,10 -1978,10 +1983,10 @@@ void _gmx_sel_yyset_extra (YY_EXTRA_TYP
  }
  
  /** Set the current line number.
-  * @param line_number
+  * @param _line_number line number
   * @param yyscanner The scanner object.
   */
- void _gmx_sel_yyset_lineno (int  line_number , yyscan_t yyscanner)
+ void _gmx_sel_yyset_lineno (int  _line_number , yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  
          if (! YY_CURRENT_BUFFER )
             YY_FATAL_ERROR( "_gmx_sel_yyset_lineno called with no buffer" );
      
-     yylineno = line_number;
+     yylineno = _line_number;
  }
  
  /** Set the current column.
-  * @param line_number
+  * @param _column_no column number
   * @param yyscanner The scanner object.
   */
- void _gmx_sel_yyset_column (int  column_no , yyscan_t yyscanner)
+ void _gmx_sel_yyset_column (int  _column_no , yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
  
          if (! YY_CURRENT_BUFFER )
             YY_FATAL_ERROR( "_gmx_sel_yyset_column called with no buffer" );
      
-     yycolumn = column_no;
+     yycolumn = _column_no;
  }
  
  /** Set the input stream. This does not discard the current
   * input buffer.
-  * @param in_str A readable stream.
+  * @param _in_str A readable stream.
   * @param yyscanner The scanner object.
   * @see _gmx_sel_yy_switch_to_buffer
   */
- void _gmx_sel_yyset_in (FILE *  in_str , yyscan_t yyscanner)
+ void _gmx_sel_yyset_in (FILE *  _in_str , yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-     yyin = in_str ;
+     yyin = _in_str ;
  }
  
- void _gmx_sel_yyset_out (FILE *  out_str , yyscan_t yyscanner)
+ void _gmx_sel_yyset_out (FILE *  _out_str , yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-     yyout = out_str ;
+     yyout = _out_str ;
  }
  
  int _gmx_sel_yyget_debug  (yyscan_t yyscanner)
      return yy_flex_debug;
  }
  
- void _gmx_sel_yyset_debug (int  bdebug , yyscan_t yyscanner)
+ void _gmx_sel_yyset_debug (int  _bdebug , yyscan_t yyscanner)
  {
      struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
-     yy_flex_debug = bdebug ;
+     yy_flex_debug = _bdebug ;
  }
  
  /* Accessor methods for yylval and yylloc */
@@@ -2143,7 -2173,10 +2178,10 @@@ int _gmx_sel_yylex_destroy  (yyscan_t y
  #ifndef yytext_ptr
  static void yy_flex_strncpy (char* s1, yyconst char * s2, int n , yyscan_t yyscanner)
  {
-       register int i;
+       struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+       (void)yyg;
+       int i;
        for ( i = 0; i < n; ++i )
                s1[i] = s2[i];
  }
  #ifdef YY_NEED_STRLEN
  static int yy_flex_strlen (yyconst char * s , yyscan_t yyscanner)
  {
-       register int n;
+       int n;
        for ( n = 0; s[n]; ++n )
                ;
  
  
  void *_gmx_sel_yyalloc (yy_size_t  size , yyscan_t yyscanner)
  {
+       struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+       (void)yyg;
        return (void *) malloc( size );
  }
  
  void *_gmx_sel_yyrealloc  (void * ptr, yy_size_t  size , yyscan_t yyscanner)
  {
+       struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+       (void)yyg;
        /* The cast to (char *) in the following accommodates both
         * implementations that use char* generic pointers, and those
         * that use void* generic pointers.  It works with the latter
  
  void _gmx_sel_yyfree (void * ptr , yyscan_t yyscanner)
  {
+       struct yyguts_t * yyg = (struct yyguts_t*)yyscanner;
+       (void)yyg;
        free( (char *) ptr );   /* see _gmx_sel_yyrealloc() for (char *) cast */
  }
  
  #define YYTABLES_NAME "yytables"
  
- #line 172 "scanner.l"
 -#line 173 "scanner.l"
++#line 178 "scanner.l"
index d2d2fd97ecbd8bc7edcfd52df34ceeaf32a89d0d,2c03a33e4278e4bbb7956e6d5524ffabd047f823..105250f2d4711ca117109cb66f6894baff99c0db
@@@ -1,7 -1,7 +1,7 @@@
  /*
   * This file is part of the GROMACS molecular simulation package.
   *
-  * Copyright (c) 2009,2010,2011,2012,2013,2014,2015, by the GROMACS development team, led by
+  * Copyright (c) 2009,2010,2011,2012,2013,2014,2015,2016, by the GROMACS development team, led by
   * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
   * and including many others, as listed in the AUTHORS file in the
   * top-level source directory and at http://www.gromacs.org.
@@@ -58,6 -58,7 +58,7 @@@
  }
  %{
  #include "gromacs/utility/cstringutil.h"
+ #include "gromacs/utility/stringutil.h"
  
  #include "parser.h"
  #include "scanner.h"
  // when we have return statements followed by break. Instead, we add breaks
  // manually.
  #define YY_BREAK
++
++#ifdef __INTEL_COMPILER
++// Ignore unused variables in generated code.
++#pragma warning(disable:593)
++#endif
  %}
  
  INTEGER    [[:digit:]]+
@@@ -137,7 -138,7 +143,7 @@@ COMMENT    (#.*
  ";"|\n          {
                      if (yytext[0] == ';' || state->statusWriter != NULL)
                      {
-                         rtrim(state->pselstr);
+                         state->pselstr = gmx::stripString(state->pselstr);
                          state->bCmdStart = true;
                          return CMD_SEP;
                      }
index abad91858e7dc5f935ff2528ff63dd32b2487038,0e23931895812e50d6d941e92514385b5f4a781b..14d3030508e30446a5df94834a9bda7f9531da50
@@@ -23,8 -23,8 +23,8 @@@
  
  #define FLEX_SCANNER
  #define YY_FLEX_MAJOR_VERSION 2
- #define YY_FLEX_MINOR_VERSION 5
- #define YY_FLEX_SUBMINOR_VERSION 37
+ #define YY_FLEX_MINOR_VERSION 6
+ #define YY_FLEX_SUBMINOR_VERSION 0
  #if YY_FLEX_SUBMINOR_VERSION > 0
  #define FLEX_BETA
  #endif
@@@ -143,7 -143,15 +143,15 @@@ typedef void* yyscan_t
  
  /* Size of default input buffer. */
  #ifndef YY_BUF_SIZE
+ #ifdef __ia64__
+ /* On IA-64, the buffer size is 16k, not 8k.
+  * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case.
+  * Ditto for the __ia64__ case accordingly.
+  */
+ #define YY_BUF_SIZE 32768
+ #else
  #define YY_BUF_SIZE 16384
+ #endif /* __ia64__ */
  #endif
  
  #ifndef YY_TYPEDEF_YY_BUFFER_STATE
@@@ -223,7 -231,7 +231,7 @@@ void *_gmx_sel_yyalloc (yy_size_t ,yysc
  void *_gmx_sel_yyrealloc (void *,yy_size_t ,yyscan_t yyscanner );
  void _gmx_sel_yyfree (void * ,yyscan_t yyscanner );
  
- #define _gmx_sel_yywrap(yyscanner) 1
+ #define _gmx_sel_yywrap(yyscanner) (/*CONSTCOND*/1)
  #define YY_SKIP_YYWRAP
  
  #define yytext_ptr yytext_r
@@@ -267,11 -275,11 +275,11 @@@ void _gmx_sel_yyset_extra (YY_EXTRA_TYP
  
  FILE *_gmx_sel_yyget_in (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_in  (FILE * in_str ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_in  (FILE * _in_str ,yyscan_t yyscanner );
  
  FILE *_gmx_sel_yyget_out (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_out  (FILE * out_str ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_out  (FILE * _out_str ,yyscan_t yyscanner );
  
  yy_size_t _gmx_sel_yyget_leng (yyscan_t yyscanner );
  
@@@ -279,11 -287,11 +287,11 @@@ char *_gmx_sel_yyget_text (yyscan_t yys
  
  int _gmx_sel_yyget_lineno (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_lineno (int line_number ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_lineno (int _line_number ,yyscan_t yyscanner );
  
  int _gmx_sel_yyget_column  (yyscan_t yyscanner );
  
- void _gmx_sel_yyset_column (int column_no ,yyscan_t yyscanner );
+ void _gmx_sel_yyset_column (int _column_no ,yyscan_t yyscanner );
  
  /* Macros after this point can all be overridden by user definitions in
   * section 1.
@@@ -311,7 -319,12 +319,12 @@@ static int yy_flex_strlen (yyconst cha
  
  /* Amount of stuff to slurp up with each read. */
  #ifndef YY_READ_BUF_SIZE
+ #ifdef __ia64__
+ /* On IA-64, the buffer size is 16k, not 8k */
+ #define YY_READ_BUF_SIZE 16384
+ #else
  #define YY_READ_BUF_SIZE 8192
+ #endif /* __ia64__ */
  #endif
  
  /* Number of entries by which start-condition stack grows. */
@@@ -344,8 -357,8 +357,8 @@@ extern int _gmx_sel_yylex (yyscan_t yys
  #undef YY_DECL
  #endif
  
- #line 172 "scanner.l"
 -#line 173 "scanner.l"
++#line 178 "scanner.l"
  
- #line 350 "scanner_flex.h"
+ #line 363 "scanner_flex.h"
  #undef _gmx_sel_yyIN_HEADER
  #endif /* _gmx_sel_yyHEADER_H */