Browse Source

Merge topic 'FindOpenSP-module'

e706da5f7e FindOpenSP: Add module to find the OpenSP library
4bcdf1b992 ci: add OpenSP to Debian and Fedora base images

Acked-by: Kitware Robot <[email protected]>
Merge-request: !7470
Brad King 3 years ago
parent
commit
f7fc864c3a

+ 1 - 0
.gitlab/ci/configure_debian10_aarch64_ninja.cmake

@@ -50,6 +50,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenSP "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenSSL "ON" CACHE BOOL "")
 set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
 set(CMake_TEST_FindPNG "ON" CACHE BOOL "")

+ 1 - 0
.gitlab/ci/configure_debian10_ninja.cmake

@@ -54,6 +54,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenSP "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenSSL "ON" CACHE BOOL "")
 set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
 set(CMake_TEST_FindPNG "ON" CACHE BOOL "")

+ 1 - 0
.gitlab/ci/configure_fedora36_makefiles.cmake

@@ -53,6 +53,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenMP "ON" CACHE BOOL "")
+set(CMake_TEST_FindOpenSP "ON" CACHE BOOL "")
 set(CMake_TEST_FindOpenSSL "ON" CACHE BOOL "")
 set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
 set(CMake_TEST_FindPNG "ON" CACHE BOOL "")

+ 1 - 0
.gitlab/ci/docker/debian10-aarch64/install_deps.sh

@@ -80,6 +80,7 @@ apt-get install -y \
     liblzma-dev \
     libopenal-dev \
     libopenmpi-dev openmpi-bin \
+    libosp-dev \
     libpng-dev \
     libpq-dev postgresql-server-dev-11 \
     libprotobuf-dev libprotobuf-c-dev libprotoc-dev protobuf-compiler protobuf-compiler-grpc \

+ 1 - 0
.gitlab/ci/docker/debian10/install_deps.sh

@@ -84,6 +84,7 @@ apt-get install -y \
     liblzma-dev \
     libopenal-dev \
     libopenmpi-dev openmpi-bin \
+    libosp-dev \
     libpng-dev \
     libpq-dev postgresql-server-dev-11 \
     libprotobuf-dev libprotobuf-c-dev libprotoc-dev protobuf-compiler protobuf-compiler-grpc \

+ 1 - 0
.gitlab/ci/docker/fedora36/install_deps.sh

@@ -92,6 +92,7 @@ dnf install --setopt=install_weak_deps=False -y \
     libinput-devel systemd-devel \
     libjpeg-turbo-devel \
     libpng-devel \
+    opensp-devel \
     postgresql-server-devel \
     libtiff-devel \
     libuv-devel \

+ 3 - 3
.gitlab/os-linux.yml

@@ -45,7 +45,7 @@
 ### Debian
 
 .debian10:
-    image: "kitware/cmake:ci-debian10-x86_64-2022-08-17"
+    image: "kitware/cmake:ci-debian10-x86_64-2022-08-30"
 
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
@@ -60,7 +60,7 @@
         CMAKE_CI_NO_INSTALL: 1
 
 .debian10_aarch64:
-    image: "kitware/cmake:ci-debian10-aarch64-2022-08-17"
+    image: "kitware/cmake:ci-debian10-aarch64-2022-08-30"
 
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci"
@@ -69,7 +69,7 @@
 ### Fedora
 
 .fedora36:
-    image: "kitware/cmake:ci-fedora36-x86_64-2022-08-17"
+    image: "kitware/cmake:ci-fedora36-x86_64-2022-08-30"
 
     variables:
         GIT_CLONE_PATH: "$CI_BUILDS_DIR/cmake ci/long file name for testing purposes"

+ 1 - 0
Copyright.txt

@@ -53,6 +53,7 @@ The following individuals and institutions are among the Contributors:
 * Clement Creusot <[email protected]>
 * Daniel Blezek <[email protected]>
 * Daniel Pfeifer <[email protected]>
+* Dawid Wróbel <[email protected]>
 * Enrico Scholz <[email protected]>
 * Eran Ifrah <[email protected]>
 * Esben Mose Hansen, Ange Optimization ApS

+ 1 - 0
Help/manual/cmake-modules.7.rst

@@ -193,6 +193,7 @@ They are normally called through the :command:`find_package` command.
    /module/FindOpenGL
    /module/FindOpenMP
    /module/FindOpenSceneGraph
+   /module/FindOpenSP
    /module/FindOpenSSL
    /module/FindOpenThreads
    /module/Findosg

+ 1 - 0
Help/module/FindOpenSP.rst

@@ -0,0 +1 @@
+.. cmake-module:: ../../Modules/FindOpenSP.cmake

+ 4 - 0
Help/release/dev/FindOpenSP-module.rst

@@ -0,0 +1,4 @@
+FindOpenSP-module
+-----------------
+
+* The :module:`FindOpenSP` module was added to find the OpenSP library.

+ 155 - 0
Modules/FindOpenSP.cmake

@@ -0,0 +1,155 @@
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#[=======================================================================[.rst:
+FindOpenSP
+----------
+
+Try to find the OpenSP library.
+
+.. versionadded:: 3.25
+
+Result Variables
+^^^^^^^^^^^^^^^^
+
+This will define the following variables:
+
+``OpenSP_FOUND``
+  True if (the requested version of) ``OpenSP`` is available
+
+``OpenSP_VERSION``
+  The version of ``OpenSP``
+
+``OpenSP_VERSION_MAJOR``
+  The major version of ``OpenSP``
+
+``OpenSP_VERSION_MINOR``
+  The minor version of ``OpenSP``
+
+``OpenSP_VERSION_PATCH``
+  The patch version of ``OpenSP``
+
+``OpenSP_INCLUDE_DIRS``
+  The include dirs of ``OpenSP`` with its headers
+
+``OpenSP_LIBRARIES``
+  The OpenSP library for use with target_link_libraries().
+  This can be passed to target_link_libraries() instead of
+  the :prop_tgt:`IMPORTED` ``OpenSP::OpenSP`` target
+
+``OpenSP_MULTI_BYTE``
+  True if ``SP_MULTI_BYTE`` was found to be defined in OpenSP's ``config.h``
+  header file, which indicates that the ``OpenSP`` library was compiled with
+  support for multi-byte characters. The consuming target needs to define the
+  ``SP_MULTI_BYTE`` to match this value in order to avoid issues with character
+  decoding.
+
+IMPORTED Targets
+^^^^^^^^^^^^^^^^
+
+This module defines the :prop_tgt:`IMPORTED` target ``OpenSP::OpenSP``, if
+OpenSP has been found.
+
+Cache variables
+^^^^^^^^^^^^^^^
+
+The following cache variables may also be set:
+
+``OpenSP_INCLUDE_DIR``
+  the OpenSP include directory
+
+``OpenSP_LIBRARY``
+  the absolute path of the osp library
+
+#]=======================================================================]
+
+if (NOT OpenSP_INCLUDE_DIR AND NOT OpenSP_LIBRARY)
+  find_package(PkgConfig)
+  if (PkgConfig_FOUND)
+    pkg_check_modules(OpenSP IMPORTED_TARGET GLOBAL opensp)
+
+    if (OpenSP_FOUND)
+      add_library(OpenSP::OpenSP INTERFACE IMPORTED)
+      target_link_libraries(OpenSP::OpenSP INTERFACE PkgConfig::OpenSP)
+
+      set(OpenSP_INCLUDE_DIR ${OpenSP_INCLUDE_DIRS})
+      set(OpenSP_LIBRARY ${OpenSP_LIBRARIES})
+    endif ()
+  endif ()
+endif ()
+
+if (NOT OpenSP_INCLUDE_DIR)
+  find_path(OpenSP_INCLUDE_DIR
+    NAMES ParserEventGeneratorKit.h
+    PATH_SUFFIXES OpenSP opensp
+    DOC "The OpenSP include directory"
+    )
+endif ()
+
+if (NOT OpenSP_LIBRARY)
+  find_library(OpenSP_LIBRARY_RELEASE
+    NAMES osp libosp opensp libopensp sp133 libsp
+    )
+
+  find_library(OpenSP_LIBRARY_DEBUG
+    NAMES ospd libospd openspd libopenspd sp133d libspd
+    )
+
+  include(SelectLibraryConfigurations)
+  select_library_configurations(OpenSP)
+endif ()
+
+if (OpenSP_INCLUDE_DIR AND OpenSP_LIBRARY)
+  if (EXISTS "${OpenSP_INCLUDE_DIR}/config.h")
+    if (NOT OpenSP_VERSION)
+      file(STRINGS "${OpenSP_INCLUDE_DIR}/config.h" opensp_version_str REGEX "^#define[\t ]+SP_VERSION[\t ]+\".*\"")
+      string(REGEX REPLACE "^.*SP_VERSION[\t ]+\"([^\"]*)\".*$" "\\1" OpenSP_VERSION "${opensp_version_str}")
+      unset(opensp_version_str)
+    endif ()
+
+    if (OpenSP_VERSION MATCHES [=[([0-9]+)\.([0-9]+)\.([0-9]+)]=])
+      set(OpenSP_VERSION_MAJOR "${CMAKE_MATCH_1}")
+      set(OpenSP_VERSION_MINOR "${CMAKE_MATCH_2}")
+      set(OpenSP_VERSION_PATCH "${CMAKE_MATCH_3}")
+    endif ()
+
+    include(CheckCXXSymbolExists)
+    check_cxx_symbol_exists(SP_MULTI_BYTE "${OpenSP_INCLUDE_DIR}/config.h" OpenSP_MULTI_BYTE)
+  endif ()
+
+  if (NOT TARGET OpenSP::OpenSP)
+    set(OpenSP_INCLUDE_DIRS ${OpenSP_INCLUDE_DIR})
+
+    add_library(OpenSP::OpenSP UNKNOWN IMPORTED)
+    set_target_properties(OpenSP::OpenSP PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${OpenSP_INCLUDE_DIRS}")
+
+    if (OpenSP_LIBRARY_RELEASE)
+      set_target_properties(OpenSP::OpenSP PROPERTIES IMPORTED_LOCATION_RELEASE "${OpenSP_LIBRARY_RELEASE}")
+      set_property(TARGET OpenSP::OpenSP APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
+    endif ()
+
+    if (OpenSP_LIBRARY_DEBUG)
+      set_target_properties(OpenSP::OpenSP PROPERTIES IMPORTED_LOCATION_DEBUG "${OpenSP_LIBRARY_DEBUG}")
+      set_property(TARGET OpenSP::OpenSP APPEND PROPERTY IMPORTED_CONFIGURATIONS DEBUG)
+    endif ()
+
+    if (NOT OpenSP_LIBRARY_RELEASE AND NOT OpenSP_LIBRARY_DEBUG)
+      set_property(TARGET OpenSP::OpenSP APPEND PROPERTY IMPORTED_LOCATION "${OpenSP_LIBRARY}")
+    endif ()
+  endif ()
+endif ()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(OpenSP
+  FOUND_VAR OpenSP_FOUND
+  REQUIRED_VARS OpenSP_LIBRARY OpenSP_INCLUDE_DIR
+  VERSION_VAR OpenSP_VERSION
+  )
+
+mark_as_advanced(OpenSP_INCLUDE_DIR OpenSP_LIBRARY OpenSP_MULTI_BYTE)
+
+include(FeatureSummary)
+set_package_properties(OpenSP PROPERTIES
+  URL "http://openjade.sourceforge.net/doc/index.htm"
+  DESCRIPTION "An SGML System Conforming to International Standard ISO 8879"
+  )

+ 1 - 0
Tests/CMakeLists.txt

@@ -1476,6 +1476,7 @@ if(BUILD_TESTING)
             OpenCL
             OpenGL
             OpenMP
+            OpenSP
             OpenSSL
             MPI
             PNG

+ 10 - 0
Tests/FindOpenSP/CMakeLists.txt

@@ -0,0 +1,10 @@
+add_test(NAME FindOpenSP.Test COMMAND
+  ${CMAKE_CTEST_COMMAND} -C $<CONFIGURATION>
+  --build-and-test
+  "${CMake_SOURCE_DIR}/Tests/FindOpenSP/Test"
+  "${CMake_BINARY_DIR}/Tests/FindOpenSP/Test"
+  ${build_generator_args}
+  --build-project TestFindOpenSP
+  --build-options ${build_options}
+  --test-command ${CMAKE_CTEST_COMMAND} -V -C $<CONFIGURATION>
+  )

+ 16 - 0
Tests/FindOpenSP/Test/CMakeLists.txt

@@ -0,0 +1,16 @@
+cmake_minimum_required(VERSION 3.4)
+project(TestFindOpenSP CXX)
+include(CTest)
+
+find_package(OpenSP REQUIRED)
+
+add_definitions(-DSP_MULTI_BYTE="${OpenSP_MULTI_BYTE}")
+
+add_executable(test_tgt main.cxx)
+target_link_libraries(test_tgt OpenSP::OpenSP)
+add_test(NAME test_tgt COMMAND test_tgt)
+
+add_executable(test_var main.cxx)
+target_include_directories(test_var PRIVATE ${OpenSP_INCLUDE_DIRS})
+target_link_libraries(test_var PRIVATE ${OpenSP_LIBRARIES})
+add_test(NAME test_var COMMAND test_var)

+ 55 - 0
Tests/FindOpenSP/Test/main.cxx

@@ -0,0 +1,55 @@
+#include <cassert>
+#include <string>
+
+#include "ParserEventGeneratorKit.h"
+
+std::string CharStringtostring(const SGMLApplication::CharString source)
+{
+  // The CharString type might have multi-byte characters if SP_MULTI_BYTE was
+  // defined
+  std::string result;
+  result.resize(source.len);
+  for (size_t i = 0; i < source.len; i++) {
+    result[i] = static_cast<char>(source.ptr[i]);
+  }
+  return result;
+}
+
+class OutlineApplication : public SGMLApplication
+{
+public:
+  OutlineApplication()
+    : depth_(0)
+  {
+  }
+  void startElement(const StartElementEvent& event)
+  {
+    for (unsigned i = 0; i < depth_; i++)
+      parsedOutput += "\t";
+    parsedOutput += CharStringtostring(event.gi);
+    depth_++;
+  }
+  void endElement(const EndElementEvent&) { depth_--; }
+  std::string parsedOutput;
+
+private:
+  unsigned depth_;
+};
+
+int main()
+{
+  std::string expectedOutput = "TESTDOC\tTESTELEMENT";
+  char file_name[] = "test.sgml";
+  char* files[] = { file_name, 0 };
+
+  ParserEventGeneratorKit parserKit;
+  EventGenerator* egp = parserKit.makeEventGenerator(1, files);
+  OutlineApplication app;
+  unsigned nErrors = egp->run(app);
+
+  assert(nErrors == 0);
+  assert(app.parsedOutput.compare(expectedOutput) == 0);
+
+  delete egp;
+  return 0;
+}

+ 7 - 0
Tests/FindOpenSP/Test/test.sgml

@@ -0,0 +1,7 @@
+ <!DOCTYPE TESTDOC [
+<!ELEMENT TESTDOC - - (TESTELEMENT)+>
+<!ELEMENT TESTELEMENT - - (#PCDATA)>
+]>
+<TESTDOC>
+<TESTELEMENT>Hello</TESTELEMENT>
+</TESTDOC>