@@ -7,7 +7,15 @@ if(POLICY CMP0048)
7
7
endif ()
8
8
9
9
# JSON-C library is C only project.
10
- project (json-c LANGUAGES C VERSION 0.14.99)
10
+ if (CMAKE_VERSION VERSION_LESS 3.0)
11
+ project (json-c)
12
+ set (PROJECT_VERSION_MAJOR "0" )
13
+ set (PROJECT_VERSION_MINOR "15" )
14
+ set (PROJECT_VERSION_PATCH "99" )
15
+ set (PROJECT_VERSION "${PROJECT_VERSION_MAJOR} .${PROJECT_VERSION_MINOR} .${PROJECT_VERSION_PATCH} " )
16
+ else ()
17
+ project (json-c LANGUAGES C VERSION 0.15.99)
18
+ endif ()
11
19
12
20
# If we've got 3.0 then it's good, let's provide support. Otherwise, leave it be.
13
21
if (POLICY CMP0038)
@@ -71,6 +79,10 @@ include(CMakePackageConfigHelpers)
71
79
option (BUILD_SHARED_LIBS "Default to building shared libraries" ON )
72
80
option (BUILD_STATIC_LIBS "Default to building static libraries" ON )
73
81
82
+ if (BUILD_SHARED_LIBS )
83
+ add_definitions (-D JSON_C_DLL)
84
+ endif ()
85
+
74
86
# Generate a release merge and test it to verify the correctness of republishing the package.
75
87
ADD_CUSTOM_TARGET (distcheck
76
88
COMMAND make package_source
@@ -83,10 +95,15 @@ COMMAND make package_source
83
95
)
84
96
85
97
# Enable or disable features. By default, all features are turned off.
86
- option (ENABLE_RDRAND "Enable RDRAND Hardware RNG Hash Seed" OFF )
87
- option (ENABLE_THREADING "Enable partial threading support." OFF )
88
- option (DISABLE_WERROR "Avoid treating compiler warnings as fatal errors" OFF )
89
- option (DISABLE_BSYMBOLIC "Avoid linking with -Bsymbolic-function" OFF )
98
+ option (DISABLE_BSYMBOLIC "Avoid linking with -Bsymbolic-function." OFF )
99
+ option (DISABLE_THREAD_LOCAL_STORAGE "Disable using Thread-Local Storage (HAVE___THREAD)." OFF )
100
+ option (DISABLE_WERROR "Avoid treating compiler warnings as fatal errors." OFF )
101
+ option (ENABLE_RDRAND "Enable RDRAND Hardware RNG Hash Seed." OFF )
102
+ option (ENABLE_THREADING "Enable partial threading support." OFF )
103
+ option (OVERRIDE_GET_RANDOM_SEED "Override json_c_get_random_seed() with custom code." OFF )
104
+ option (DISABLE_EXTRA_LIBS "Avoid linking against extra libraries, such as libbsd." OFF )
105
+ option (DISABLE_JSON_POINTER "Disable JSON pointer (RFC6901) support." OFF )
106
+
90
107
91
108
if (UNIX OR MINGW OR CYGWIN )
92
109
list (APPEND CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
@@ -101,6 +118,14 @@ if (MSVC)
101
118
list (APPEND CMAKE_REQUIRED_FLAGS /wd4996)
102
119
endif ()
103
120
121
+ if (NOT DISABLE_STATIC_FPIC)
122
+ # Use '-fPIC'/'-fPIE' option.
123
+ # This will allow other libraries to statically link in libjson-c.a
124
+ # which in turn prevents crashes in downstream apps that may use
125
+ # a different JSON library with identical symbol names.
126
+ set (CMAKE_POSITION_INDEPENDENT_CODE ON )
127
+ endif ()
128
+
104
129
check_include_file("fcntl.h" HAVE_FCNTL_H)
105
130
check_include_file("inttypes.h" HAVE_INTTYPES_H)
106
131
check_include_file(stdarg.h HAVE_STDARG_H)
@@ -125,6 +150,7 @@ check_include_file(stdint.h HAVE_STDINT_H)
125
150
check_include_file(stdlib.h HAVE_STDLIB_H)
126
151
check_include_file(sys/cdefs.h HAVE_SYS_CDEFS_H)
127
152
check_include_file(sys/param.h HAVE_SYS_PARAM_H)
153
+ check_include_file(sys/random.h HAVE_SYS_RANDOM_H)
128
154
check_include_file(sys/stat.h HAVE_SYS_STAT_H)
129
155
check_include_file(xlocale.h HAVE_XLOCALE_H)
130
156
@@ -150,6 +176,17 @@ check_symbol_exists(vasprintf "stdio.h" HAVE_VASPRINTF)
150
176
check_symbol_exists(vsnprintf "stdio.h" HAVE_VSNPRINTF)
151
177
check_symbol_exists(vprintf "stdio.h" HAVE_VPRINTF)
152
178
179
+ check_symbol_exists(arc4random "stdlib.h" HAVE_ARC4RANDOM)
180
+ if (NOT HAVE_ARC4RANDOM AND DISABLE_EXTRA_LIBS STREQUAL "OFF" )
181
+ check_include_file(bsd/stdlib.h HAVE_BSD_STDLIB_H)
182
+ if (HAVE_BSD_STDLIB_H)
183
+ list (APPEND CMAKE_REQUIRED_LIBRARIES "-lbsd" )
184
+ link_libraries (bsd)
185
+ unset (HAVE_ARC4RANDOM CACHE )
186
+ check_symbol_exists(arc4random "bsd/stdlib.h" HAVE_ARC4RANDOM)
187
+ endif ()
188
+ endif ()
189
+
153
190
if (HAVE_FCNTL_H)
154
191
check_symbol_exists(open "fcntl.h" HAVE_OPEN)
155
192
endif ()
@@ -171,6 +208,9 @@ endif()
171
208
if (HAVE_SYSLOG_H)
172
209
check_symbol_exists(vsyslog "syslog.h" HAVE_VSYSLOG)
173
210
endif ()
211
+ if (HAVE_SYS_RANDOM_H)
212
+ check_symbol_exists(getrandom "sys/random.h" HAVE_GETRANDOM)
213
+ endif ()
174
214
if (HAVE_SYS_RESOURCE_H)
175
215
check_symbol_exists(getrusage "sys/resource.h" HAVE_GETRUSAGE)
176
216
endif ()
@@ -204,27 +244,35 @@ check_type_size(int64_t SIZEOF_INT64_T)
204
244
check_type_size(long SIZEOF_LONG)
205
245
check_type_size("long long" SIZEOF_LONG_LONG)
206
246
check_type_size("size_t" SIZEOF_SIZE_T)
247
+ if (MSVC )
248
+ list (APPEND CMAKE_EXTRA_INCLUDE_FILES BaseTsd.h)
249
+ check_type_size("SSIZE_T" SIZEOF_SSIZE_T)
250
+ else ()
251
+ check_type_size("ssize_t" SIZEOF_SSIZE_T)
252
+ endif ()
207
253
208
254
check_c_source_compiles(
209
- [=[
255
+ "
210
256
extern void json_object_get();
211
- __asm__(".section .gnu.json_object_get\\n\\t.ascii \\"Please link against libjson-c instead of libjson\\"\\n\\t.text");
257
+ __asm__(\ " .section .gnu.json_object_get\\ n\\ t.ascii \\\ " Please link against libjson-c instead of libjson\\\ "\\ n\\ t.text\ " );
212
258
int main(int c, char *v) { return 0;}
213
- ]=]
259
+ "
214
260
HAS_GNU_WARNING_LONG)
215
261
216
262
check_c_source_compiles(
217
263
"int main() { int i, x = 0; i = __sync_add_and_fetch(&x,1); return x; }"
218
264
HAVE_ATOMIC_BUILTINS)
219
265
220
- check_c_source_compiles(
221
- "__thread int x = 0; int main() { return 0; }"
222
- HAVE___THREAD)
266
+ if (NOT DISABLE_THREAD_LOCAL_STORAGE)
267
+ check_c_source_compiles(
268
+ "__thread int x = 0; int main() { return 0; }"
269
+ HAVE___THREAD)
223
270
224
- if (HAVE___THREAD)
225
- set (SPEC___THREAD __thread)
226
- elseif (MSVC )
227
- set (SPEC___THREAD __declspec(thread))
271
+ if (HAVE___THREAD)
272
+ set (SPEC___THREAD __thread)
273
+ elseif (MSVC )
274
+ set (SPEC___THREAD __declspec(thread))
275
+ endif ()
228
276
endif ()
229
277
230
278
# Hardware random number is not available on Windows? Says, config.h.win32. Best to preserve compatibility.
@@ -234,11 +282,11 @@ endif()
234
282
235
283
# Once we've done basic symbol/header searches let's add them in.
236
284
configure_file (${PROJECT_SOURCE_DIR} /cmake/config.h.in ${PROJECT_BINARY_DIR} /config.h)
237
- message (STATUS "Written ${PROJECT_BINARY_DIR} /config.h" )
285
+ message (STATUS "Wrote ${PROJECT_BINARY_DIR} /config.h" )
238
286
configure_file (${PROJECT_SOURCE_DIR} /cmake/json_config.h.in ${PROJECT_BINARY_DIR} /json_config.h)
239
- message (STATUS "Written ${PROJECT_BINARY_DIR} /json_config.h" )
287
+ message (STATUS "Wrote ${PROJECT_BINARY_DIR} /json_config.h" )
240
288
241
- if ("${CMAKE_C_COMPILER_ID} " STREQUAL "GNU" )
289
+ if ("${CMAKE_C_COMPILER_ID} " STREQUAL "GNU" OR " ${CMAKE_C_COMPILER_ID} " STREQUAL "Clang" )
242
290
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ffunction-sections -fdata-sections" )
243
291
if ("${DISABLE_WERROR} " STREQUAL "OFF" )
244
292
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror" )
@@ -267,15 +315,15 @@ endif()
267
315
268
316
if (NOT ("${CMAKE_C_COMPILER_ID} " STREQUAL "MSVC" ))
269
317
check_c_source_compiles(
270
- [=[
318
+ "
271
319
/* uClibc toolchains without threading barf when _REENTRANT is defined */
272
320
#define _REENTRANT 1
273
321
#include <sys/types.h>
274
322
int main (void)
275
323
{
276
324
return 0;
277
325
}
278
- ]=]
326
+ "
279
327
REENTRANT_WORKS
280
328
)
281
329
if (REENTRANT_WORKS)
@@ -286,12 +334,12 @@ if (NOT ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC"))
286
334
# Others may not support it, too.
287
335
list (APPEND CMAKE_REQUIRED_LIBRARIES "-Wl,-Bsymbolic-functions" )
288
336
check_c_source_compiles(
289
- [=[
337
+ "
290
338
int main (void)
291
339
{
292
340
return 0;
293
341
}
294
- ]=]
342
+ "
295
343
BSYMBOLIC_WORKS
296
344
)
297
345
list (REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "-Wl,-Bsymbolic-functions" )
@@ -300,6 +348,22 @@ if (NOT ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC"))
300
348
# XXX need cmake>=3.13 for this:
301
349
#add_link_options("-Wl,-Bsymbolic-functions")
302
350
endif ()
351
+
352
+ file (WRITE "${CMAKE_CURRENT_BINARY_DIR} /check-version-script.sym" "TEST { global: *; };" )
353
+ list (APPEND CMAKE_REQUIRED_LIBRARIES "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR} /check-version-script.sym" )
354
+ check_c_source_compiles(
355
+ "
356
+ int main (void)
357
+ {
358
+ return 0;
359
+ }
360
+ "
361
+ VERSION_SCRIPT_WORKS
362
+ )
363
+ list (REMOVE_ITEM CMAKE_REQUIRED_LIBRARIES "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR} /check-version-script.sym" )
364
+ if (VERSION_SCRIPT_WORKS)
365
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--version-script,${CMAKE_CURRENT_SOURCE_DIR} /json-c.sym" )
366
+ endif ()
303
367
endif ()
304
368
305
369
if ($ENV{VALGRIND} )
@@ -311,14 +375,13 @@ set(JSON_C_PUBLIC_HEADERS
311
375
# Note: config.h is _not_ included here
312
376
${PROJECT_BINARY_DIR} /json_config.h
313
377
314
- ${PROJECT_SOURCE_DIR } /json.h
378
+ ${PROJECT_BINARY_DIR } /json.h
315
379
${PROJECT_SOURCE_DIR} /arraylist.h
316
380
${PROJECT_SOURCE_DIR} /debug.h
317
381
${PROJECT_SOURCE_DIR} /json_c_version.h
318
382
${PROJECT_SOURCE_DIR} /json_inttypes.h
319
383
${PROJECT_SOURCE_DIR} /json_object.h
320
384
${PROJECT_SOURCE_DIR} /json_object_iterator.h
321
- ${PROJECT_SOURCE_DIR} /json_pointer.h
322
385
${PROJECT_SOURCE_DIR} /json_tokener.h
323
386
${PROJECT_SOURCE_DIR} /json_types.h
324
387
${PROJECT_SOURCE_DIR} /json_util.h
@@ -345,7 +408,6 @@ set(JSON_C_SOURCES
345
408
${PROJECT_SOURCE_DIR} /json_c_version.c
346
409
${PROJECT_SOURCE_DIR} /json_object.c
347
410
${PROJECT_SOURCE_DIR} /json_object_iterator.c
348
- ${PROJECT_SOURCE_DIR} /json_pointer.c
349
411
${PROJECT_SOURCE_DIR} /json_tokener.c
350
412
${PROJECT_SOURCE_DIR} /json_util.c
351
413
${PROJECT_SOURCE_DIR} /json_visit.c
@@ -355,26 +417,20 @@ set(JSON_C_SOURCES
355
417
${PROJECT_SOURCE_DIR} /strerror_override.c
356
418
)
357
419
358
- include_directories (${PROJECT_SOURCE_DIR} )
359
- include_directories (${PROJECT_BINARY_DIR} )
360
-
361
- # generate doxygen documentation for json-c API
362
-
363
- find_package (Doxygen)
364
- option (BUILD_DOCUMENTATION "Create and install the HTML based API documentation(requires Doxygen)" ${DOXYGEN_FOUND} )
365
-
366
- if (DOXYGEN_FOUND)
420
+ if (NOT DISABLE_JSON_POINTER)
421
+ set (JSON_C_PUBLIC_HEADERS ${JSON_C_PUBLIC_HEADERS} ${PROJECT_SOURCE_DIR} /json_pointer.h)
422
+ set (JSON_C_SOURCES ${JSON_C_SOURCES} ${PROJECT_SOURCE_DIR} /json_pointer.c)
423
+ set (JSON_H_JSON_POINTER "#include \" json_pointer.h\" " )
424
+ else ()
425
+ set (JSON_H_JSON_POINTER "" )
426
+ endif ()
367
427
368
- add_custom_target (doc
369
- COMMAND ${DOXYGEN_EXECUTABLE} ${PROJECT_SOURCE_DIR} /Doxyfile
370
- WORKING_DIRECTORY ${PROJECT_BINARY_DIR} )
428
+ configure_file (json.h.cmakein ${PROJECT_BINARY_DIR} /json.h @ONLY)
371
429
372
- # request to configure the file
373
- configure_file (Doxyfile Doxyfile )
430
+ include_directories ( ${PROJECT_SOURCE_DIR} )
431
+ include_directories ( ${PROJECT_BINARY_DIR} )
374
432
375
- else (DOXYGEN_FOUND)
376
- message ("Warning: doxygen not found, the 'doc' target will not be included" )
377
- endif (DOXYGEN_FOUND)
433
+ add_subdirectory (doc )
378
434
379
435
# uninstall
380
436
add_custom_target (uninstall
@@ -390,7 +446,7 @@ add_library(${PROJECT_NAME}
390
446
${JSON_C_HEADERS}
391
447
)
392
448
set_target_properties (${PROJECT_NAME} PROPERTIES
393
- VERSION 5.0 .0
449
+ VERSION 5.1 .0
394
450
SOVERSION 5)
395
451
list (APPEND CMAKE_TARGETS ${PROJECT_NAME} )
396
452
# If json-c is used as subroject it set to target correct interface -I flags and allow
0 commit comments