diff options
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r-- | CMakeLists.txt | 410 |
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("===========================================================================") |