FindOpenSP: Add module to find the OpenSP library

OpenSP has not seen a release in seventeen years, so is unlikely to ever
provide a CMake package configuration file.  Add a find module instead.
This commit is contained in:
Dawid Wróbel
2022-07-12 16:39:58 +02:00
committed by Brad King
parent 4bcdf1b992
commit e706da5f7e
13 changed files with 254 additions and 0 deletions

View File

@@ -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 "")

View File

@@ -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 "")

View File

@@ -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 "")

View File

@@ -53,6 +53,7 @@ The following individuals and institutions are among the Contributors:
* Clement Creusot <creusot@cs.york.ac.uk>
* Daniel Blezek <blezek@gmail.com>
* Daniel Pfeifer <daniel@pfeifer-mail.de>
* Dawid Wróbel <me@dawidwrobel.com>
* Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
* Eran Ifrah <eran.ifrah@gmail.com>
* Esben Mose Hansen, Ange Optimization ApS

View File

@@ -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

View File

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

View File

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

155
Modules/FindOpenSP.cmake Normal file
View File

@@ -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"
)

View File

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

View File

@@ -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>
)

View File

@@ -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)

View File

@@ -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;
}

View File

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