File: CMakeLists.txt

package info (click to toggle)
simdjson 4.3.1-4
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 31,396 kB
  • sloc: cpp: 195,760; ansic: 20,954; sh: 1,126; python: 885; makefile: 47; ruby: 25; javascript: 13
file content (161 lines) | stat: -rw-r--r-- 7,380 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161

link_libraries(simdjson)
include_directories(..)

if(NOT SIMDJSON_LEGACY_VISUAL_STUDIO AND NOT SIMDJSON_WINDOWS_DLL)
  add_cpp_test(random_string_number_tests LABELS dom acceptance per_implementation)
endif()
add_cpp_test(basictests                 LABELS dom acceptance per_implementation)
add_cpp_test(document_stream_tests      LABELS dom acceptance per_implementation)
add_cpp_test(document_tests             LABELS dom acceptance per_implementation)
add_cpp_test(errortests                 LABELS dom acceptance per_implementation)
add_cpp_test(extracting_values_example  LABELS dom acceptance per_implementation)
add_cpp_test(integer_tests              LABELS dom acceptance per_implementation)
add_cpp_test(jsoncheck                  LABELS dom acceptance per_implementation)
add_cpp_test(json_path_tests            LABELS dom acceptance per_implementation)
add_cpp_test(minefieldcheck             LABELS dom acceptance per_implementation)
add_cpp_test(numberparsingcheck         LABELS dom acceptance per_implementation) # https://tools.ietf.org/html/rfc6901
add_cpp_test(parse_many_test            LABELS dom acceptance per_implementation)
add_cpp_test(pointercheck               LABELS dom acceptance per_implementation) # https://tools.ietf.org/html/rfc6901
add_cpp_test(stringparsingcheck         LABELS dom acceptance per_implementation) # https://tools.ietf.org/html/rfc6901
add_cpp_test(trivially_copyable_test    LABELS dom acceptance per_implementation)



find_program(BASH bash)

# Below we skip anything on Windows, not just visual studio, because running bash under Windows requires you to
# map app paths to their "mounted" equivalent (e.g., /mnt/c/...). So even if you have bash under Windows, extra work would be
# required to make things work robustly. Simply put: bash is not quite portable.

# Script tests
if (BASH AND (NOT WIN32) AND SIMDJSON_BASH AND (TARGET json2json)) # The scripts are not robust enough to run under Windows even if bash is available
  #
  # json2json test
  #
  add_test(
    NAME testjson2json
    COMMAND ${BASH} ${CMAKE_CURRENT_SOURCE_DIR}/testjson2json.sh ${PROJECT_BINARY_DIR}
    WORKING_DIRECTORY $<TARGET_FILE_DIR:minify>
  )
  set_property(TEST testjson2json APPEND PROPERTY DEPENDS minify json2json)
  set_property(TEST testjson2json APPEND PROPERTY LABELS per_implementation)
  add_dependencies(per_implementation_tests minify)

  #
  # Competition parse test
  #
  if ((SIMDJSON_COMPETITION) AND (!SIMDJSON_SANITIZE))
    # It looks like RapidJSON does not pass the sanitizer under some conditions (Clang 10)
    add_executable(allparserscheckfile allparserscheckfile.cpp)
    add_dependencies(competition_tests allparserscheckfile)
    add_dependencies(per_implementation_tests allparserscheckfile)
    target_link_libraries(allparserscheckfile PRIVATE competition-all)

    add_test(issue150 ${BASH} ${CMAKE_CURRENT_SOURCE_DIR}/issue150.sh ${PROJECT_BINARY_DIR})
    set_property(TEST issue150 APPEND PROPERTY LABELS per_implementation competition)
    add_dependencies(all_tests allparserscheckfile)
  endif()

  #
  # json2json tool test: check that json2json can parse twitter.json
  #


  add_test(NAME json2json COMMAND $<TARGET_FILE:json2json> ${EXAMPLE_JSON})
  set_property(TEST json2json APPEND PROPERTY LABELS acceptance per_implementation)
  add_dependencies(acceptance_tests json2json)
  add_dependencies(per_implementation_tests json2json)

  #
  # SIMDJSON_FORCE_IMPLEMENTATION tests: run json2json with SIMDJSON
  #
  if (SIMDJSON_IMPLEMENTATION MATCHES "fallback")
    add_test(
      NAME simdjson_force_implementation
      COMMAND
        ${CMAKE_COMMAND} -E env
        SIMDJSON_FORCE_IMPLEMENTATION=fallback
        $<TARGET_FILE:checkimplementation>
    )
  endif()
  if((CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL x86_64 OR CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL amd64) AND NOT DEFINED CMAKE_CROSSCOMPILING_EMULATOR)
    add_test(
      NAME simdjson_force_implementation_error
      COMMAND
        ${CMAKE_COMMAND} -E env
        SIMDJSON_FORCE_IMPLEMENTATION=doesnotexist
        $<TARGET_FILE:json2json> ${EXAMPLE_JSON}
    )
    set_tests_properties(simdjson_force_implementation_error PROPERTIES WILL_FAIL TRUE)
  endif()
endif()

#
# Compile-only tests with simdjson flags on
#

# Don't add the tests if we're on VS2017 or older; they don't succeed.
if(NOT (MSVC AND MSVC_VERSION LESS 1920))
  if(SIMDJSON_EXCEPTIONS)
    add_cpp_test(readme_examples COMPILE_ONLY LABELS acceptance)
    if(NOT SIMDJSON_STATIC_REFLECTION)
      add_cpp_test(readme_examples11 COMPILE_ONLY LABELS acceptance SOURCES readme_examples.cpp)
      set_target_properties(readme_examples11 PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF)
    endif(NOT SIMDJSON_STATIC_REFLECTION)
  endif()

  add_cpp_test(readme_examples_noexceptions COMPILE_ONLY LABELS acceptance)

  if(NOT SIMDJSON_STATIC_REFLECTION)
    add_cpp_test(readme_examples_noexceptions11 COMPILE_ONLY LABELS acceptance SOURCES readme_examples_noexceptions.cpp)
    set_target_properties(readme_examples_noexceptions11 PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF)
  endif(NOT SIMDJSON_STATIC_REFLECTION)

  # Compile tests that *should fail*
  add_cpp_test(readme_examples_will_fail_with_exceptions_off WILL_FAIL COMPILE_ONLY LABELS acceptance SOURCES readme_examples.cpp)
  target_compile_definitions(readme_examples_will_fail_with_exceptions_off PRIVATE SIMDJSON_EXCEPTIONS=0)
endif()

#
# Test C++20 features
#

# Add the tests if we're on:
#   1. Visual Studio 2022 v17.6 or later
#   2. GCC v14.0.0 or later (GCC v13.0.0 cannot handle pipe operator of lambda)
#   3. Clang v15.0.0 or later (certain version C++ headers occur error when compiling)
if(
  (MSVC AND MSVC_VERSION LESS 1930) OR
  (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "14.0.0") OR
  (CMAKE_CXX_COMPILER_ID MATCHES "Clang" AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "15.0.0")
  )
  message(STATUS "compiler id: ${CMAKE_CXX_COMPILER_ID} version: ${CMAKE_CXX_COMPILER_VERSION}")
  add_cpp_test(ranges_test LABELS dom acceptance per_implementation)
  if(NOT SIMDJSON_STATIC_REFLECTION)
     set_target_properties(ranges_test PROPERTIES CXX_STANDARD 20 CXX_STANDARD_REQUIRED ON CXX_EXTENSIONS OFF)
  endif()
endif()

if(WIN32 AND BUILD_SHARED_LIBS)
  add_custom_command(TARGET basictests POST_BUILD        # Adds a post-build event
    COMMAND ${CMAKE_COMMAND} -E copy_if_different  # which executes "cmake -E copy_if_different..."
        "$<TARGET_FILE:simdjson>"      # <--this is in-file
        "$<TARGET_FILE_DIR:basictests>")                 # <--this is out-file path
endif()

if(NOT MSVC)
  ######
  # This tests is to guard us against ever again removing the soversion
  # number from the library. See Bug
  # https://github.com/simdjson/simdjson/issues/1014
  #####
  get_target_property(REPORTED_SIMDJSON_SOVERSION simdjson SOVERSION)
  if(NOT ${REPORTED_SIMDJSON_SOVERSION} STREQUAL ${SIMDJSON_LIB_SOVERSION})
    message(FATAL_ERROR "The library target does not have the proper soversion information." )
  endif()
  get_target_property(REPORTED_SIMDJSON_VERSION simdjson VERSION)
  if(NOT ${REPORTED_SIMDJSON_VERSION} STREQUAL ${SIMDJSON_LIB_VERSION})
    message(FATAL_ERROR "The library target does not have the proper version information." )
  endif()
endif()