summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt410
1 files changed, 410 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..749fea1
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,410 @@
+# uriparser - RFC 3986 URI parsing library
+#
+# Copyright (C) 2018, Sebastian Pipping <sebastian@pipping.org>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+# * Redistributions of source code must retain the above
+# copyright notice, this list of conditions and the following
+# disclaimer.
+#
+# * Redistributions in binary form must reproduce the above
+# copyright notice, this list of conditions and the following
+# disclaimer in the documentation and/or other materials
+# provided with the distribution.
+#
+# * Neither the name of the <ORGANIZATION> nor the names of its
+# contributors may be used to endorse or promote products
+# derived from this software without specific prior written
+# permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+# COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+# OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+cmake_minimum_required(VERSION 3.3)
+
+project(uriparser
+ VERSION
+ 0.9.2
+)
+
+# See https://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
+set(URIPARSER_SO_CURRENT 1)
+set(URIPARSER_SO_REVISION 25)
+set(URIPARSER_SO_AGE 0)
+
+include(CheckCCompilerFlag)
+include(CheckFunctionExists)
+include(CheckLibraryExists)
+include(CheckSymbolExists)
+include(CMakePackageConfigHelpers)
+include(GNUInstallDirs)
+
+#
+# Configuration
+#
+option(BUILD_SHARED_LIBS "Build shared libraries (rather than static ones)" ON)
+option(URIPARSER_BUILD_DOCS "Build API documentation (requires Doxygen, Graphviz, and (optional) Qt's qhelpgenerator)" ON)
+option(URIPARSER_BUILD_TESTS "Build test suite (requires GTest >=1.8.1)" ON)
+option(URIPARSER_BUILD_TOOLS "Build tools (e.g. CLI \"uriparse\")" ON)
+option(URIPARSER_BUILD_CHAR "Build code supporting data type 'char'" ON)
+option(URIPARSER_BUILD_WCHAR_T "Build code supporting data type 'wchar_t'" ON)
+set(URIPARSER_MSVC_RUNTIME "" CACHE STRING "Use of specific runtime library (/MT /MTd /MD /MDd) with MSVC")
+
+if(NOT URIPARSER_BUILD_CHAR AND NOT URIPARSER_BUILD_WCHAR_T)
+ message(SEND_ERROR "One or more of URIPARSER_BUILD_CHAR and URIPARSER_BUILD_WCHAR_T needs to be enabled.")
+endif()
+if(URIPARSER_BUILD_TESTS AND NOT (URIPARSER_BUILD_CHAR AND URIPARSER_BUILD_WCHAR_T))
+ message(SEND_ERROR "URIPARSER_BUILD_TESTS=ON requires both URIPARSER_BUILD_CHAR=ON and URIPARSER_BUILD_WCHAR_T=ON.")
+endif()
+if(URIPARSER_BUILD_TOOLS AND NOT URIPARSER_BUILD_CHAR)
+ message(SEND_ERROR "URIPARSER_BUILD_TOOLS=ON requires URIPARSER_BUILD_CHAR=ON.")
+endif()
+
+if(MSVC AND URIPARSER_MSVC_RUNTIME)
+ set(_refs
+ CMAKE_CXX_FLAGS
+ CMAKE_CXX_FLAGS_DEBUG
+ CMAKE_CXX_FLAGS_RELEASE
+ CMAKE_C_FLAGS
+ CMAKE_C_FLAGS_DEBUG
+ CMAKE_C_FLAGS_RELEASE
+ )
+ foreach(_ref ${_refs})
+ string(REGEX REPLACE "/M[DT]d?" ${URIPARSER_MSVC_RUNTIME} ${_ref} "${${_ref}}")
+ endforeach()
+endif()
+
+#
+# Compiler checks
+#
+set(URIPARSER_EXTRA_COMPILE_FLAGS)
+
+check_c_compiler_flag("-fvisibility=hidden" URIPARSER_COMPILER_SUPPORTS_VISIBILITY)
+if(URIPARSER_COMPILER_SUPPORTS_VISIBILITY)
+ set(URIPARSER_EXTRA_COMPILE_FLAGS "${URIPARSER_EXTRA_COMPILE_FLAGS} -fvisibility=hidden")
+endif()
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${URIPARSER_EXTRA_COMPILE_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${URIPARSER_EXTRA_COMPILE_FLAGS}")
+
+#
+# config.h
+#
+check_symbol_exists(wprintf wchar.h HAVE_WPRINTF)
+check_function_exists(reallocarray HAVE_REALLOCARRAY) # no luck with CheckSymbolExists
+configure_file(src/UriConfig.h.in config.h)
+
+#
+# C library
+#
+set(API_HEADER_FILES
+ include/uriparser/UriBase.h
+ include/uriparser/UriDefsAnsi.h
+ include/uriparser/UriDefsConfig.h
+ include/uriparser/UriDefsUnicode.h
+ include/uriparser/Uri.h
+ include/uriparser/UriIp4.h
+)
+set(LIBRARY_CODE_FILES
+ src/UriCommon.c
+ src/UriCommon.h
+ src/UriCompare.c
+ src/UriEscape.c
+ src/UriFile.c
+ src/UriIp4Base.c
+ src/UriIp4Base.h
+ src/UriIp4.c
+ src/UriMemory.c
+ src/UriMemory.h
+ src/UriNormalizeBase.c
+ src/UriNormalizeBase.h
+ src/UriNormalize.c
+ src/UriParseBase.c
+ src/UriParseBase.h
+ src/UriParse.c
+ src/UriQuery.c
+ src/UriRecompose.c
+ src/UriResolve.c
+ src/UriShorten.c
+)
+
+add_library(uriparser
+ ${API_HEADER_FILES}
+ ${LIBRARY_CODE_FILES}
+)
+
+if(NOT MSVC)
+ math(EXPR URIPARSER_SO_CURRENT_MINUS_AGE "${URIPARSER_SO_CURRENT} - ${URIPARSER_SO_AGE}")
+ set_property(TARGET uriparser PROPERTY VERSION ${URIPARSER_SO_CURRENT_MINUS_AGE}.${URIPARSER_SO_AGE}.${URIPARSER_SO_REVISION})
+ set_property(TARGET uriparser PROPERTY SOVERSION ${URIPARSER_SO_CURRENT_MINUS_AGE})
+endif()
+
+set_property(
+ TARGET
+ uriparser
+ PROPERTY
+ PUBLIC_HEADER "${API_HEADER_FILES}"
+)
+
+target_compile_definitions(uriparser PRIVATE URI_LIBRARY_BUILD)
+if (NOT BUILD_SHARED_LIBS)
+ target_compile_definitions(uriparser PUBLIC URI_STATIC_BUILD)
+endif()
+if(NOT URIPARSER_BUILD_CHAR)
+ target_compile_definitions(uriparser PUBLIC URI_NO_ANSI)
+endif()
+if(NOT URIPARSER_BUILD_WCHAR_T)
+ target_compile_definitions(uriparser PUBLIC URI_NO_UNICODE)
+endif()
+if(URIPARSER_COMPILER_SUPPORTS_VISIBILITY)
+ target_compile_definitions(uriparser PRIVATE URI_VISIBILITY)
+endif()
+
+target_include_directories(uriparser
+ PUBLIC
+ $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
+ $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR} # for config.h
+)
+
+install(
+ TARGETS
+ uriparser
+ EXPORT
+ uriparser
+ ARCHIVE
+ DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY
+ DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}
+ RUNTIME
+ DESTINATION
+ ${CMAKE_INSTALL_BINDIR}
+ PUBLIC_HEADER
+ DESTINATION
+ ${CMAKE_INSTALL_INCLUDEDIR}/uriparser
+)
+
+#
+# C command line tool
+#
+if(URIPARSER_BUILD_TOOLS)
+ add_executable(uriparse
+ tool/uriparse.c
+ )
+
+ target_link_libraries(uriparse PUBLIC uriparser)
+
+ if(HAIKU)
+ # Function inet_ntop needs -lsocket or -lnetwork (see pull request #45)
+ check_library_exists(socket inet_ntop "" HAVE_LIBSOCKET__INET_NTOP)
+ check_library_exists(network inet_ntop "" HAVE_LIBNETWORK__INET_NTOP)
+ if(HAVE_LIBSOCKET__INET_NTOP)
+ target_link_libraries(uriparse PUBLIC socket)
+ endif()
+ if(HAVE_LIBNETWORK__INET_NTOP)
+ target_link_libraries(uriparse PUBLIC network)
+ endif()
+ endif()
+
+ if(WIN32)
+ target_link_libraries(uriparse PUBLIC ws2_32)
+ endif()
+
+ install(
+ TARGETS
+ uriparse
+ DESTINATION
+ ${CMAKE_INSTALL_BINDIR}
+ )
+endif()
+
+#
+# C++ test runner
+#
+if(URIPARSER_BUILD_TESTS)
+ enable_testing()
+
+ find_package(GTest 1.8.1 REQUIRED)
+
+ add_executable(testrunner
+ test/FourSuite.cpp
+ test/MemoryManagerSuite.cpp
+ test/test.cpp
+ test/VersionSuite.cpp
+
+ # These library code files have non-public symbols that the test suite
+ # needs to link to, so they appear here as well:
+ ${API_HEADER_FILES}
+ ${LIBRARY_CODE_FILES}
+ )
+
+ target_compile_definitions(testrunner PRIVATE URI_STATIC_BUILD)
+
+ if(MSVC)
+ target_compile_definitions(testrunner PRIVATE -D_CRT_SECURE_NO_WARNINGS)
+ endif()
+
+ target_include_directories(testrunner SYSTEM PRIVATE
+ ${GTEST_INCLUDE_DIR}
+ )
+
+ target_include_directories(testrunner PRIVATE
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ ${CMAKE_CURRENT_BINARY_DIR} # for config.h
+ )
+
+ target_link_libraries(testrunner PUBLIC
+ ${GTEST_BOTH_LIBRARIES}
+ )
+
+ add_test(
+ NAME
+ test
+ COMMAND
+ testrunner
+ )
+
+ add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+endif()
+
+#
+# Doxygen API documentation
+#
+if(URIPARSER_BUILD_DOCS)
+ find_package(Doxygen REQUIRED dot doxygen)
+ find_program(QHG_LOCATION
+ NAMES
+ qhelpgenerator
+ qhelpgenerator-qt5 # e.g. CentOS 7
+ )
+ include(FindHTMLHelp)
+
+ # Generate Doxyfile
+ if(HTML_HELP_COMPILER)
+ set(GENERATE_HTMLHELP YES)
+ else()
+ set(GENERATE_HTMLHELP NO)
+ endif()
+ if(QHG_LOCATION)
+ set(GENERATE_QHP YES)
+ else()
+ set(GENERATE_QHP NO)
+ endif()
+ configure_file(doc/Doxyfile.in doc/Doxyfile @ONLY)
+ configure_file(doc/release.sh.in doc/release.sh @ONLY)
+
+ add_custom_target(doc
+ ALL
+ COMMAND
+ ${DOXYGEN_EXECUTABLE}
+ Doxyfile
+ WORKING_DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR}/doc
+ COMMENT
+ "Generating API documentation with Doxygen"
+ VERBATIM
+ )
+
+ install(
+ DIRECTORY
+ ${CMAKE_CURRENT_BINARY_DIR}/doc/html
+ DESTINATION
+ ${CMAKE_INSTALL_DOCDIR}
+ )
+ if(QHG_LOCATION)
+ install(
+ FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/doc/uriparser-${PROJECT_VERSION}.qch
+ DESTINATION
+ ${CMAKE_INSTALL_DOCDIR}
+ )
+ endif()
+endif()
+
+#
+# CMake files for find_package(uriparser [..] CONFIG [..])
+#
+configure_package_config_file(
+ cmake/uriparser-config.cmake.in
+ cmake/uriparser-config.cmake
+ INSTALL_DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}/cmake/uriparser-${PROJECT_VERSION}/
+)
+write_basic_package_version_file(
+ cmake/uriparser-config-version.cmake
+ COMPATIBILITY SameMajorVersion # i.e. semver
+)
+export(
+ TARGETS
+ uriparser
+ FILE
+ cmake/uriparser-targets.cmake # not going to be installed
+)
+install(
+ FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/cmake/uriparser-config.cmake
+ ${CMAKE_CURRENT_BINARY_DIR}/cmake/uriparser-config-version.cmake
+ DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}/cmake/uriparser-${PROJECT_VERSION}/
+)
+install(
+ EXPORT
+ uriparser
+ DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}/cmake/uriparser-${PROJECT_VERSION}/
+ NAMESPACE
+ uriparser::
+)
+
+#
+# pkg-config file
+#
+if(NOT MSVC)
+ configure_file(liburiparser.pc.in liburiparser.pc @ONLY)
+ install(
+ FILES
+ ${CMAKE_CURRENT_BINARY_DIR}/liburiparser.pc
+ DESTINATION
+ ${CMAKE_INSTALL_LIBDIR}/pkgconfig/
+ )
+endif()
+
+#
+# Summary
+#
+message("===========================================================================")
+message("")
+message("Configuration")
+message(" Prefix ............... ${CMAKE_INSTALL_PREFIX}")
+message(" Shared libraries ..... ${BUILD_SHARED_LIBS}")
+message(" Code for char * ...... ${URIPARSER_BUILD_CHAR}")
+message(" Code for wchar_t * ... ${URIPARSER_BUILD_WCHAR_T}")
+message(" Tools ................ ${URIPARSER_BUILD_TOOLS}")
+message(" Test suite ........... ${URIPARSER_BUILD_TESTS}")
+message(" Documentation ........ ${URIPARSER_BUILD_DOCS}")
+message("")
+if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")
+ message("Continue with")
+ message(" make")
+ message(" make test")
+ message(" sudo make install")
+ message("")
+endif()
+message("===========================================================================")