summaryrefslogtreecommitdiff
path: root/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'CMakeLists.txt')
-rw-r--r--CMakeLists.txt153
1 files changed, 136 insertions, 17 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 77f8ada..a8cdaf1 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -34,19 +34,22 @@
# 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.5.0)
+cmake_minimum_required(VERSION 3.15.0)
project(uriparser
VERSION
- 0.9.8
+ 1.0.1
LANGUAGES
C
)
+set(CMAKE_C_STANDARD 99)
+set(CMAKE_C_STANDARD_REQUIRED ON)
+set(CMAKE_C_EXTENSIONS OFF) # i.e. -std=c99 rather than default -std=gnu99
# See https://verbump.de/ for what these numbers do
-set(URIPARSER_SO_CURRENT 1)
-set(URIPARSER_SO_REVISION 31)
-set(URIPARSER_SO_AGE 0)
+set(URIPARSER_SO_CURRENT 3)
+set(URIPARSER_SO_REVISION 1)
+set(URIPARSER_SO_AGE 2)
include(CheckCCompilerFlag)
include(CheckFunctionExists)
@@ -65,13 +68,15 @@ else()
endif()
option(URIPARSER_SHARED_LIBS "Build shared libraries (rather than static ones)" ${_URIPARSER_SHARED_LIBS_DEFAULT})
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.0)" ON)
+option(URIPARSER_BUILD_TESTS "Build test suite (requires GTest >=1.8.0)" OFF)
+option(URIPARSER_BUILD_FUZZERS "Build fuzzers (requires Clang)" OFF)
+option(URIPARSER_OSSFUZZ_BUILD "Build fuzzers via OSS-Fuzz" OFF)
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)
option(URIPARSER_ENABLE_INSTALL "Enable installation of uriparser" ON)
option(URIPARSER_WARNINGS_AS_ERRORS "Treat all compiler warnings as errors" OFF)
-set(URIPARSER_MSVC_RUNTIME "" CACHE STRING "Use of specific runtime library (/MT /MTd /MD /MDd) with MSVC")
+option(URIPARSER_MSVC_STATIC_CRT "Use /MT flag (static CRT) when compiling in MSVC" OFF)
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.")
@@ -83,9 +88,17 @@ if(URIPARSER_BUILD_TOOLS AND NOT URIPARSER_BUILD_CHAR)
message(SEND_ERROR "URIPARSER_BUILD_TOOLS=ON requires URIPARSER_BUILD_CHAR=ON.")
endif()
-if(URIPARSER_BUILD_TESTS)
+if(URIPARSER_BUILD_TESTS OR URIPARSER_BUILD_FUZZERS)
# We have to call enable_language() before modifying any CMAKE_CXX_* variables
enable_language(CXX)
+
+ if(URIPARSER_BUILD_FUZZERS)
+ set(CMAKE_CXX_STANDARD 17)
+ else()
+ set(CMAKE_CXX_STANDARD 11)
+ endif()
+ set(CMAKE_CXX_STANDARD_REQUIRED ON)
+ set(CMAKE_CXX_EXTENSIONS OFF) # i.e. -std=c++11 rather than default -std=gnu++11
endif()
if(URIPARSER_SHARED_LIBS)
@@ -94,14 +107,18 @@ else()
set(_URIPARSER_STATIC_OR_SHARED STATIC)
endif()
-macro(uriparser_apply_msvc_runtime_to ref)
- string(REGEX REPLACE "/M[DT]d?" ${URIPARSER_MSVC_RUNTIME} ${ref} "${${ref}}")
-endmacro()
+if (MSVC)
+ cmake_policy(GET CMP0091 _policy_cmp0091_behavior)
+ if (NOT _policy_cmp0091_behavior STREQUAL NEW)
+ message(SEND_ERROR "Policy CMP0091 behavior is '${_policy_cmp0091_behavior}' rather than 'NEW', mis-compilation detected.")
+ endif()
-if(MSVC AND URIPARSER_MSVC_RUNTIME)
- uriparser_apply_msvc_runtime_to(CMAKE_C_FLAGS)
- uriparser_apply_msvc_runtime_to(CMAKE_C_FLAGS_DEBUG)
- uriparser_apply_msvc_runtime_to(CMAKE_C_FLAGS_RELEASE)
+ message(STATUS "-- Using static CRT ${URIPARSER_MSVC_STATIC_CRT}")
+ if (URIPARSER_MSVC_STATIC_CRT)
+ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>") # .. without suffix "DLL": static
+ else()
+ set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>DLL") # i.e. CMake default behavior: shared
+ endif()
endif()
macro(uriparser_install)
@@ -142,6 +159,8 @@ set(LIBRARY_CODE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/src/UriCommon.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriCommon.h
${CMAKE_CURRENT_SOURCE_DIR}/src/UriCompare.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriCopy.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriCopy.h
${CMAKE_CURRENT_SOURCE_DIR}/src/UriEscape.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriFile.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriIp4Base.c
@@ -152,13 +171,30 @@ set(LIBRARY_CODE_FILES
${CMAKE_CURRENT_SOURCE_DIR}/src/UriNormalizeBase.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriNormalizeBase.h
${CMAKE_CURRENT_SOURCE_DIR}/src/UriNormalize.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriNormalize.h
${CMAKE_CURRENT_SOURCE_DIR}/src/UriParseBase.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriParseBase.h
${CMAKE_CURRENT_SOURCE_DIR}/src/UriParse.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriQuery.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriRecompose.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriResolve.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetFragment.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostAuto.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostBase.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostCommon.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostCommon.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostIp4.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostIp6.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostIpFuture.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetHostRegName.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetPath.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetPort.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetQuery.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSets.h
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetScheme.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriSetUserInfo.c
${CMAKE_CURRENT_SOURCE_DIR}/src/UriShorten.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/src/UriVersion.c
)
add_library(uriparser
@@ -167,6 +203,8 @@ add_library(uriparser
${LIBRARY_CODE_FILES}
)
+add_library(uriparser::uriparser ALIAS uriparser)
+
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})
@@ -276,9 +314,22 @@ if(URIPARSER_BUILD_TESTS)
find_package(GTest 1.8.0 REQUIRED)
add_executable(testrunner
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/CompareRangeLengthWrap.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/copy.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test/FourSuite.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test/MemoryManagerSuite.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetFragment.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetHostAuto.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetHostIp4.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetHostIp6.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetHostIpFuture.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetHostRegName.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetPath.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetPort.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetQuery.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetScheme.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/test/SetUserInfo.cpp
${CMAKE_CURRENT_SOURCE_DIR}/test/VersionSuite.cpp
# These library code files have non-public symbols that the test suite
@@ -333,6 +384,73 @@ if(URIPARSER_BUILD_TESTS)
endif()
#
+# Fuzzers
+#
+if(URIPARSER_BUILD_FUZZERS)
+ if(NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "Clang")
+ message(FATAL_ERROR
+ "Building fuzz targets without Clang (but ${CMAKE_C_COMPILER_ID}) is not "
+ "supported. Please set -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++.")
+ endif()
+
+ if(URIPARSER_OSSFUZZ_BUILD AND NOT DEFINED ENV{LIB_FUZZING_ENGINE})
+ message(FATAL_ERROR
+ "OSS-Fuzz builds require the environment variable "
+ "LIB_FUZZING_ENGINE to be set. If you are seeing this "
+ "warning, it points to a deeper problem in the OSS-Fuzz "
+ "build setup.")
+ endif()
+
+ add_library(fuzzparser STATIC ${API_HEADER_FILES} ${LIBRARY_CODE_FILES})
+ target_compile_definitions(fuzzparser PUBLIC URI_STATIC_BUILD)
+ target_include_directories(fuzzparser
+ PUBLIC
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+ PRIVATE
+ ${CMAKE_CURRENT_BINARY_DIR} # for UriConfig.h
+ )
+
+ if(NOT URIPARSER_OSSFUZZ_BUILD)
+ target_compile_options(fuzzparser PRIVATE -fsanitize=fuzzer-no-link)
+ endif()
+
+ function(add_fuzzer target_name source compile_definitions)
+ add_executable(${target_name} ${source})
+ target_link_libraries(${target_name} PRIVATE fuzzparser)
+ target_compile_definitions(${target_name} PRIVATE ${compile_definitions})
+ if(URIPARSER_OSSFUZZ_BUILD)
+ set_target_properties(${target_name} PROPERTIES LINK_FLAGS $ENV{LIB_FUZZING_ENGINE})
+ set_target_properties(${target_name} PROPERTIES LINKER_LANGUAGE "CXX")
+ else()
+ target_compile_options(${target_name} PRIVATE -fsanitize=fuzzer)
+ set_target_properties(${target_name} PROPERTIES LINK_FLAGS -fsanitize=fuzzer)
+ endif()
+ set_property(TARGET ${target_name} PROPERTY RUNTIME_OUTPUT_DIRECTORY fuzz)
+ endfunction()
+
+ function(add_ansi_and_unicode_fuzzer name source)
+ if(URIPARSER_BUILD_CHAR)
+ add_fuzzer(${name}_fuzzer ${source} URI_NO_UNICODE)
+ endif()
+
+ if(URIPARSER_BUILD_WCHAR_T)
+ add_fuzzer(${name}w_fuzzer ${source} URI_NO_ANSI)
+ endif()
+ endfunction()
+
+ add_ansi_and_unicode_fuzzer(uri_dissect_query_malloc fuzz/DissectQueryMallocFuzzer.cpp)
+ add_ansi_and_unicode_fuzzer(uri_free fuzz/FreeFuzzer.cpp)
+ add_ansi_and_unicode_fuzzer(uri_parse fuzz/ParseFuzzer.cpp)
+else()
+ if(URIPARSER_OSSFUZZ_BUILD)
+ message(SEND_ERROR
+ "Attempting to perform an OSS-Fuzz build without turning on the fuzzer build. "
+ "This is likely in error - consider adding "
+ "-DURIPARSER_BUILD_FUZZERS=ON to your CMake execution.")
+ endif()
+endif()
+
+#
# Compiler flags
#
if(URIPARSER_WARNINGS_AS_ERRORS)
@@ -402,7 +520,7 @@ if(URIPARSER_BUILD_DOCS)
if(QHG_LOCATION)
uriparser_install(
FILES
- ${CMAKE_CURRENT_BINARY_DIR}/doc/uriparser-${PROJECT_VERSION}.qch
+ ${CMAKE_CURRENT_BINARY_DIR}/doc/uriparser-${PROJECT_VERSION}-doc.qch
DESTINATION
${CMAKE_INSTALL_DOCDIR}
)
@@ -420,7 +538,7 @@ configure_package_config_file(
)
write_basic_package_version_file(
cmake/uriparser-config-version.cmake
- COMPATIBILITY SameMajorVersion # i.e. semver
+ COMPATIBILITY AnyNewerVersion # i.e. declare 0.x.x and 1.x.x compatible
)
export(
TARGETS
@@ -493,6 +611,7 @@ message(STATUS " Code for char * ...... ${URIPARSER_BUILD_CHAR}")
message(STATUS " Code for wchar_t * ... ${URIPARSER_BUILD_WCHAR_T}")
message(STATUS " Tools ................ ${URIPARSER_BUILD_TOOLS}")
message(STATUS " Test suite ........... ${URIPARSER_BUILD_TESTS}")
+message(STATUS " Fuzzers .............. ${URIPARSER_BUILD_FUZZERS}")
message(STATUS " Documentation ........ ${URIPARSER_BUILD_DOCS}")
message(STATUS "")
if(CMAKE_GENERATOR STREQUAL "Unix Makefiles")