mirror of
https://github.com/Kitware/CMake.git
synced 2026-04-21 05:38:24 -05:00
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:
@@ -50,6 +50,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
|
|||||||
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP "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_FindOpenSSL "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
|
|||||||
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP "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_FindOpenSSL "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ set(CMake_TEST_FindOpenMP_C "ON" CACHE BOOL "")
|
|||||||
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_CXX "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
set(CMake_TEST_FindOpenMP_Fortran "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindOpenMP "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_FindOpenSSL "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPatch "ON" CACHE BOOL "")
|
||||||
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
set(CMake_TEST_FindPNG "ON" CACHE BOOL "")
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ The following individuals and institutions are among the Contributors:
|
|||||||
* Clement Creusot <creusot@cs.york.ac.uk>
|
* Clement Creusot <creusot@cs.york.ac.uk>
|
||||||
* Daniel Blezek <blezek@gmail.com>
|
* Daniel Blezek <blezek@gmail.com>
|
||||||
* Daniel Pfeifer <daniel@pfeifer-mail.de>
|
* Daniel Pfeifer <daniel@pfeifer-mail.de>
|
||||||
|
* Dawid Wróbel <me@dawidwrobel.com>
|
||||||
* Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
|
* Enrico Scholz <enrico.scholz@informatik.tu-chemnitz.de>
|
||||||
* Eran Ifrah <eran.ifrah@gmail.com>
|
* Eran Ifrah <eran.ifrah@gmail.com>
|
||||||
* Esben Mose Hansen, Ange Optimization ApS
|
* Esben Mose Hansen, Ange Optimization ApS
|
||||||
|
|||||||
@@ -193,6 +193,7 @@ They are normally called through the :command:`find_package` command.
|
|||||||
/module/FindOpenGL
|
/module/FindOpenGL
|
||||||
/module/FindOpenMP
|
/module/FindOpenMP
|
||||||
/module/FindOpenSceneGraph
|
/module/FindOpenSceneGraph
|
||||||
|
/module/FindOpenSP
|
||||||
/module/FindOpenSSL
|
/module/FindOpenSSL
|
||||||
/module/FindOpenThreads
|
/module/FindOpenThreads
|
||||||
/module/Findosg
|
/module/Findosg
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
.. cmake-module:: ../../Modules/FindOpenSP.cmake
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
FindOpenSP-module
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
* The :module:`FindOpenSP` module was added to find the OpenSP library.
|
||||||
@@ -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"
|
||||||
|
)
|
||||||
@@ -1476,6 +1476,7 @@ if(BUILD_TESTING)
|
|||||||
OpenCL
|
OpenCL
|
||||||
OpenGL
|
OpenGL
|
||||||
OpenMP
|
OpenMP
|
||||||
|
OpenSP
|
||||||
OpenSSL
|
OpenSSL
|
||||||
MPI
|
MPI
|
||||||
PNG
|
PNG
|
||||||
|
|||||||
@@ -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>
|
||||||
|
)
|
||||||
@@ -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)
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
<!DOCTYPE TESTDOC [
|
||||||
|
<!ELEMENT TESTDOC - - (TESTELEMENT)+>
|
||||||
|
<!ELEMENT TESTELEMENT - - (#PCDATA)>
|
||||||
|
]>
|
||||||
|
<TESTDOC>
|
||||||
|
<TESTELEMENT>Hello</TESTELEMENT>
|
||||||
|
</TESTDOC>
|
||||||
Reference in New Issue
Block a user