Dominik 'Rathann' Mierzejewski a2ef00b
From aaf0fed5dccb53333ff2706be608be9c327707ea Mon Sep 17 00:00:00 2001
Dominik 'Rathann' Mierzejewski a2ef00b
From: Mark Abraham <mark.j.abraham@gmail.com>
Dominik 'Rathann' Mierzejewski a2ef00b
Date: Thu, 12 May 2016 17:39:18 +0200
Dominik 'Rathann' Mierzejewski a2ef00b
Subject: [PATCH] Re-add support for linking against external TinyXML-2
Dominik 'Rathann' Mierzejewski a2ef00b
Dominik 'Rathann' Mierzejewski a2ef00b
I always intended this support, to permit convenient packaging of
Dominik 'Rathann' Mierzejewski a2ef00b
GROMACS by distributions, but it got lost from gerrit while rebasing
Dominik 'Rathann' Mierzejewski a2ef00b
from patch set 4 to 5 of I6153136.
Dominik 'Rathann' Mierzejewski a2ef00b
Dominik 'Rathann' Mierzejewski a2ef00b
Fixes #1956
Dominik 'Rathann' Mierzejewski a2ef00b
Dominik 'Rathann' Mierzejewski a2ef00b
Change-Id: Ie76dc9e8c6116814439d813d5a9555c5bfb7bfc5
Dominik 'Rathann' Mierzejewski a2ef00b
---
Dominik 'Rathann' Mierzejewski a2ef00b
Dominik 'Rathann' Mierzejewski a2ef00b
diff --git a/CMakeLists.txt b/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
index 14f091b..2e64a6a 100644
Dominik 'Rathann' Mierzejewski a2ef00b
--- a/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
+++ b/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
@@ -512,6 +512,17 @@
Dominik 'Rathann' Mierzejewski a2ef00b
     endif()
Dominik 'Rathann' Mierzejewski a2ef00b
 endif()
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
+option(GMX_EXTERNAL_TINYXML2 "Use external TinyXML-2 instead of compiling the version bundled with GROMACS." OFF)
Dominik 'Rathann' Mierzejewski a2ef00b
+mark_as_advanced(GMX_EXTERNAL_TINYXML2)
Dominik 'Rathann' Mierzejewski a2ef00b
+if(GMX_EXTERNAL_TINYXML2)
Dominik 'Rathann' Mierzejewski a2ef00b
+    # Find an external TinyXML-2 library.
Dominik 'Rathann' Mierzejewski a2ef00b
+    find_package(TinyXML-2 3.0.0)
Dominik 'Rathann' Mierzejewski a2ef00b
+    set(HAVE_TINYXML2 ${TinyXML2_FOUND})
Dominik 'Rathann' Mierzejewski a2ef00b
+    if(NOT HAVE_TINYXML2)
Dominik 'Rathann' Mierzejewski a2ef00b
+        message(FATAL_ERROR "External TinyXML-2 could not be found, please adjust your search paths")
Dominik 'Rathann' Mierzejewski a2ef00b
+    endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
 option(GMX_EXTRAE "Add support for tracing using EXTRAE" OFF)
Dominik 'Rathann' Mierzejewski a2ef00b
 mark_as_advanced(GMX_EXTRAE)
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
diff --git a/cmake/FindTinyXML-2.cmake b/cmake/FindTinyXML-2.cmake
Dominik 'Rathann' Mierzejewski a2ef00b
new file mode 100644
Dominik 'Rathann' Mierzejewski a2ef00b
index 0000000..3bea516
Dominik 'Rathann' Mierzejewski a2ef00b
--- /dev/null
Dominik 'Rathann' Mierzejewski a2ef00b
+++ b/cmake/FindTinyXML-2.cmake
Dominik 'Rathann' Mierzejewski a2ef00b
@@ -0,0 +1,89 @@
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# This file is part of the GROMACS molecular simulation package.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# Copyright (c) 2016, by the GROMACS development team, led by
Dominik 'Rathann' Mierzejewski a2ef00b
+# Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl,
Dominik 'Rathann' Mierzejewski a2ef00b
+# and including many others, as listed in the AUTHORS file in the
Dominik 'Rathann' Mierzejewski a2ef00b
+# top-level source directory and at http://www.gromacs.org.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# GROMACS is free software; you can redistribute it and/or
Dominik 'Rathann' Mierzejewski a2ef00b
+# modify it under the terms of the GNU Lesser General Public License
Dominik 'Rathann' Mierzejewski a2ef00b
+# as published by the Free Software Foundation; either version 2.1
Dominik 'Rathann' Mierzejewski a2ef00b
+# of the License, or (at your option) any later version.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# GROMACS is distributed in the hope that it will be useful,
Dominik 'Rathann' Mierzejewski a2ef00b
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
Dominik 'Rathann' Mierzejewski a2ef00b
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Dominik 'Rathann' Mierzejewski a2ef00b
+# Lesser General Public License for more details.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# You should have received a copy of the GNU Lesser General Public
Dominik 'Rathann' Mierzejewski a2ef00b
+# License along with GROMACS; if not, see
Dominik 'Rathann' Mierzejewski a2ef00b
+# http://www.gnu.org/licenses, or write to the Free Software Foundation,
Dominik 'Rathann' Mierzejewski a2ef00b
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# If you want to redistribute modifications to GROMACS, please
Dominik 'Rathann' Mierzejewski a2ef00b
+# consider that scientific software is very special. Version
Dominik 'Rathann' Mierzejewski a2ef00b
+# control is crucial - bugs must be traceable. We will be happy to
Dominik 'Rathann' Mierzejewski a2ef00b
+# consider code for inclusion in the official distribution, but
Dominik 'Rathann' Mierzejewski a2ef00b
+# derived work must not be called official GROMACS. Details are found
Dominik 'Rathann' Mierzejewski a2ef00b
+# in the README & COPYING files - if they are missing, get the
Dominik 'Rathann' Mierzejewski a2ef00b
+# official version at http://www.gromacs.org.
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# To help us fund GROMACS development, we humbly ask that you cite
Dominik 'Rathann' Mierzejewski a2ef00b
+# the research papers on the package. Check out http://www.gromacs.org.
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+# This package tries to find the TinyXML-2 library. It will consider
Dominik 'Rathann' Mierzejewski a2ef00b
+# the directory ${TinyXML2_DIR} in its search. Upon exit, the
Dominik 'Rathann' Mierzejewski a2ef00b
+# following variables may be set:
Dominik 'Rathann' Mierzejewski a2ef00b
+#
Dominik 'Rathann' Mierzejewski a2ef00b
+# TinyXML2_FOUND       - TinyXML-2 was found
Dominik 'Rathann' Mierzejewski a2ef00b
+# TinyXML2_INCLUDE_DIR - TinyXML-2 include directory
Dominik 'Rathann' Mierzejewski a2ef00b
+# TinyXML2_LIBRARIES   - TinyXML-2 libraries
Dominik 'Rathann' Mierzejewski a2ef00b
+# TinyXML2_LINKS_OK    - TinyXML-2 libraries link correctly
Dominik 'Rathann' Mierzejewski a2ef00b
+# TinyXML2_VERSION     - TinyXML-2 version string as "major.minor"
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+find_package(PkgConfig QUIET)
Dominik 'Rathann' Mierzejewski a2ef00b
+if(PKG_CONFIG_FOUND)
Dominik 'Rathann' Mierzejewski a2ef00b
+    if(TinyXML2_FIND_VERSION)
Dominik 'Rathann' Mierzejewski a2ef00b
+        if(TinyXML2_FIND_VERSION_EXACT)
Dominik 'Rathann' Mierzejewski a2ef00b
+            pkg_check_modules(PC_TINYXML2 QUIET tinyxml2=${TinyXML2_FIND_VERSION})
Dominik 'Rathann' Mierzejewski a2ef00b
+        else()
Dominik 'Rathann' Mierzejewski a2ef00b
+            pkg_check_modules(PC_TINYXML2 QUIET tinyxml2>=${TinyXML2_FIND_VERSION})
Dominik 'Rathann' Mierzejewski a2ef00b
+        endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+    else()
Dominik 'Rathann' Mierzejewski a2ef00b
+        pkg_check_modules(PC_TINYXML2 QUIET tinyxml2)
Dominik 'Rathann' Mierzejewski a2ef00b
+    endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+# Try to find tinyxml2, perhaps with help from pkg-config
Dominik 'Rathann' Mierzejewski a2ef00b
+find_path(TinyXML2_INCLUDE_DIR tinyxml2.h PATHS "${TinyXML2_DIR}" "${PC_TINYXML2_INCLUDE_DIRS}" PATH_SUFFIXES include)
Dominik 'Rathann' Mierzejewski a2ef00b
+find_library(TinyXML2_LIBRARIES NAMES tinyxml2 PATHS "${TinyXML2_DIR}" "${PC_TINYXML2_LIBRARIES}" PATH_SUFFIXES lib64 lib)
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+if(TinyXML2_INCLUDE_DIR AND EXISTS "${TinyXML2_INCLUDE_DIR}/tinyxml2.h" AND TinyXML2_LIBRARIES)
Dominik 'Rathann' Mierzejewski a2ef00b
+    file(STRINGS "${TinyXML2_INCLUDE_DIR}/tinyxml2.h" _TinyXML2_H_MAJOR REGEX "TIXML2_MAJOR_VERSION = [0-9]+;")
Dominik 'Rathann' Mierzejewski a2ef00b
+    file(STRINGS "${TinyXML2_INCLUDE_DIR}/tinyxml2.h" _TinyXML2_H_MINOR REGEX "TIXML2_MINOR_VERSION = [0-9]+;")
Dominik 'Rathann' Mierzejewski a2ef00b
+    string(REGEX REPLACE "TIXML2_MAJOR_VERSION = ([0-9]+);" "\\1" _TinyXML2_MAJOR_VERSION "${_TinyXML2_H_MAJOR}")
Dominik 'Rathann' Mierzejewski a2ef00b
+    string(REGEX REPLACE "TIXML2_MINOR_VERSION = ([0-9]+);" "\\1" _TinyXML2_MINOR_VERSION "${_TinyXML2_H_MINOR}")
Dominik 'Rathann' Mierzejewski a2ef00b
+    set(TinyXML2_VERSION "${_TinyXML2_MAJOR_VERSION}.${_TinyXML2_MINOR_VERSION}")
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+# Make sure we can also link, so that cross-compilation is properly supported
Dominik 'Rathann' Mierzejewski a2ef00b
+if (TinyXML2_INCLUDE_DIR AND TinyXML2_LIBRARIES)
Dominik 'Rathann' Mierzejewski a2ef00b
+    include(CheckCXXSourceCompiles)
Dominik 'Rathann' Mierzejewski a2ef00b
+    set(CMAKE_REQUIRED_INCLUDES ${TinyXML2_INCLUDE_DIR})
Dominik 'Rathann' Mierzejewski a2ef00b
+    set(CMAKE_REQUIRED_LIBRARIES ${TinyXML2_LIBRARIES})
Dominik 'Rathann' Mierzejewski a2ef00b
+    check_cxx_source_compiles("#include <tinyxml2.h>\nint main(){tinyxml2::XMLDocument doc;}" TinyXML2_LINKS_OK)
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+include(FindPackageHandleStandardArgs)
Dominik 'Rathann' Mierzejewski a2ef00b
+find_package_handle_standard_args(TinyXML2
Dominik 'Rathann' Mierzejewski a2ef00b
+    FOUND_VAR
Dominik 'Rathann' Mierzejewski a2ef00b
+    TinyXML2_FOUND
Dominik 'Rathann' Mierzejewski a2ef00b
+    REQUIRED_VARS
Dominik 'Rathann' Mierzejewski a2ef00b
+    TinyXML2_INCLUDE_DIR
Dominik 'Rathann' Mierzejewski a2ef00b
+    TinyXML2_LIBRARIES
Dominik 'Rathann' Mierzejewski a2ef00b
+    TinyXML2_LINKS_OK
Dominik 'Rathann' Mierzejewski a2ef00b
+    VERSION_VAR
Dominik 'Rathann' Mierzejewski a2ef00b
+    TinyXML2_VERSION)
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+mark_as_advanced(TinyXML2_INCLUDE_DIR TinyXML2_LIBRARIES)
Dominik 'Rathann' Mierzejewski a2ef00b
diff --git a/src/testutils/CMakeLists.txt b/src/testutils/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
index eb0fa8d..2bd34f4 100644
Dominik 'Rathann' Mierzejewski a2ef00b
--- a/src/testutils/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
+++ b/src/testutils/CMakeLists.txt
Dominik 'Rathann' Mierzejewski a2ef00b
@@ -48,8 +48,11 @@
Dominik 'Rathann' Mierzejewski a2ef00b
     testoptions.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
     textblockmatchers.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
     xvgtest.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
-    ../external/tinyxml2/tinyxml2.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
     )
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
+if(NOT HAVE_TINYXML2)
Dominik 'Rathann' Mierzejewski a2ef00b
+    list(APPEND TESTUTILS_SOURCES ../external/tinyxml2/tinyxml2.cpp)
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
 add_library(testutils STATIC ${UNITTEST_TARGET_OPTIONS} ${TESTUTILS_SOURCES})
Dominik 'Rathann' Mierzejewski a2ef00b
 set(TESTUTILS_LIBS testutils)
Dominik 'Rathann' Mierzejewski a2ef00b
@@ -57,6 +60,13 @@
Dominik 'Rathann' Mierzejewski a2ef00b
 set_property(TARGET testutils APPEND PROPERTY COMPILE_FLAGS "${GMOCK_COMPILE_FLAGS}")
Dominik 'Rathann' Mierzejewski a2ef00b
 target_link_libraries(testutils libgromacs ${GMOCK_LIBRARIES})
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
+if(HAVE_TINYXML2)
Dominik 'Rathann' Mierzejewski a2ef00b
+    include_directories(SYSTEM ${TinyXML2_INCLUDE_DIR})
Dominik 'Rathann' Mierzejewski a2ef00b
+    target_link_libraries(testutils ${TinyXML2_LIBRARIES})
Dominik 'Rathann' Mierzejewski a2ef00b
+else()
Dominik 'Rathann' Mierzejewski a2ef00b
+    include_directories(BEFORE SYSTEM "../external/tinyxml2")
Dominik 'Rathann' Mierzejewski a2ef00b
+endif()
Dominik 'Rathann' Mierzejewski a2ef00b
+
Dominik 'Rathann' Mierzejewski a2ef00b
 set(TESTUTILS_DIR ${CMAKE_CURRENT_SOURCE_DIR})
Dominik 'Rathann' Mierzejewski a2ef00b
 set(TESTUTILS_DIR ${TESTUTILS_DIR} PARENT_SCOPE)
Dominik 'Rathann' Mierzejewski a2ef00b
 set(TESTUTILS_LIBS ${TESTUTILS_LIBS} PARENT_SCOPE)
Dominik 'Rathann' Mierzejewski a2ef00b
diff --git a/src/testutils/refdata-xml.cpp b/src/testutils/refdata-xml.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
index ae2eadd..bdf6018 100644
Dominik 'Rathann' Mierzejewski a2ef00b
--- a/src/testutils/refdata-xml.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
+++ b/src/testutils/refdata-xml.cpp
Dominik 'Rathann' Mierzejewski a2ef00b
@@ -44,7 +44,7 @@
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
 #include "refdata-xml.h"
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
-#include "external/tinyxml2/tinyxml2.h"
Dominik 'Rathann' Mierzejewski a2ef00b
+#include <tinyxml2.h>
Dominik 'Rathann' Mierzejewski a2ef00b
 
Dominik 'Rathann' Mierzejewski a2ef00b
 #include "gromacs/utility/exceptions.h"
Dominik 'Rathann' Mierzejewski a2ef00b