Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
4037ecb
Add support for JSON Schema validation, JSON Pointer and JSON Patch.
PengZheng Aug 4, 2026
0e98b62
Fix symbol visibility issues in Jansson extension headers.
PengZheng Aug 4, 2026
60ce19e
Add support for loading and resolving remote JSON Schema references.
PengZheng Aug 4, 2026
6e1832e
Refactor time and URI format check functions for improved clarity and…
PengZheng Aug 4, 2026
6e29773
Add URI validation support for JSON Schema with comprehensive test cases
PengZheng Aug 5, 2026
6f6efc0
Add abort-on-first-error feature for JSON Schema validation
PengZheng Aug 5, 2026
4ec66fd
Refactor JSON Schema handling by removing unused functions, improving…
PengZheng Aug 5, 2026
6cee135
Replace custom strdup implementation with standard strdup for memory …
PengZheng Aug 6, 2026
a18c502
Enhance JSON Schema validation by adding recursion depth guard and im…
PengZheng Aug 6, 2026
3c1fa2b
Eliminate dead code and redundency.
PengZheng Aug 7, 2026
278d780
Eliminate dead code and improve code coverage.
PengZheng Aug 7, 2026
76d0779
Eliminate dead code and improve code coverage for json pointer.
PengZheng Aug 7, 2026
8bff121
Rename JSON patch application function and update references for cons…
PengZheng Aug 7, 2026
20307b5
Add unit tests for URI parsing and updating functionality
PengZheng Aug 7, 2026
0247188
Eliminate dead code and improve code coverage for string format checker.
PengZheng Aug 7, 2026
23d738f
Fix corrupted Ragel-generated state machine tables in SMTP address va…
PengZheng Aug 7, 2026
58ab875
Enhance IPv6 validation by adding explicit rejection for zone-id form…
PengZheng Aug 7, 2026
c88aeb1
Enhance JSON schema URI validation by adding checks for array indices…
PengZheng Aug 7, 2026
d2f39fd
Add C++ compatibility to celix_util.h and implement unit tests for st…
PengZheng Aug 8, 2026
614d0f1
Refactor JSON schema handling to replace hash tables with string hash…
PengZheng Aug 8, 2026
af09a3d
Enhance error handling in JSON schema processing
PengZheng Aug 8, 2026
4b1f3a6
Enhance error handling in JSON pointer operations by adding checks fo…
PengZheng Aug 8, 2026
19e03d1
Enhance memory management in JSON URI handling by adding null checks …
PengZheng Aug 8, 2026
00f17bb
Enhance JSON pointer initialization and error handling by removing pr…
PengZheng Aug 9, 2026
c2a861c
Enhance JSON pointer parent retrieval by allowing reuse of caller-pro…
PengZheng Aug 9, 2026
72a91c1
Enhance URI handling by introducing automatic cleanup support and imp…
PengZheng Aug 9, 2026
f75e3b2
Fix unhandled allocation failures in JSON schema validation
PengZheng Aug 9, 2026
f0552ea
Add error-injection tests for the schema OOM handling fixes
PengZheng Aug 9, 2026
c085aaa
Add error-injection test for the defensive empty-path fallback
PengZheng Aug 9, 2026
f16953b
Add error-injection support for vsnprintf in stdio_ei
PengZheng Aug 9, 2026
a29c514
Fix remaining unhandled errors in schema compilation and defaults
PengZheng Aug 9, 2026
1c22ec5
Add error-injection tests for the second hardening pass
PengZheng Aug 9, 2026
53087ae
Add error handling for OOM scenarios in path string generation and pr…
PengZheng Aug 9, 2026
656a388
Enhance error handling in schema validation to manage OOM scenarios a…
PengZheng Aug 9, 2026
6a9a357
Add jansson_ext conan test_package support and update CMake configura…
PengZheng Aug 10, 2026
1f4165b
fix(coverage): enable test execution and remove lcov ignore-errors flag
PengZheng Aug 10, 2026
bcef149
Revert incidental change to .clang-format
PengZheng Aug 10, 2026
5d0ab35
Fix conan packaging for test package and CI builds
PengZheng Aug 10, 2026
9e8f1c7
Fix flaky path cache invalidation tests
PengZheng Aug 10, 2026
de7fa32
Implement JSON Merge Patch functionality and add tests
PengZheng Aug 13, 2026
f0abd98
fix(coverage): handle lcov 2.x end-line and unused-pattern errors
PengZheng Aug 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ limitations under the License.

# Noteworthy Changes for 3.0.0 (TBD)

## New features

- New `libs/jansson_ext` library providing JSON Schema draft-7 validation,
JSON Pointer (RFC 6901) and JSON Patch (RFC 6902) support, built on Jansson.

## Backwards incompatible changes

- Deployment Admin bundle has been removed and is no longer supported.
Expand Down
26 changes: 24 additions & 2 deletions cmake/celix_project/CodeCoverage.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
# 4. Added "mock" to exclude list for coverage results
# 5. Removed HTML generation from the coverage setup function
# 6. Removed unneeded Cobertura function
# 7. Version-gated --ignore-errors flags for lcov 2.x
#

# Option to enable/disable coverage
Expand All @@ -60,6 +61,27 @@ IF(ENABLE_CODE_COVERAGE)
MESSAGE(FATAL_ERROR "gcov not found! Aborting...")
ENDIF() # NOT GCOV_PATH

# lcov 2.x errors on gcov end-line inconsistencies for functions sharing a
# start line (e.g. gtest TEST_F bodies and their synthesized ctor/dtors) and
# on unused exclude patterns; 1.x neither has these checks nor accepts the
# corresponding --ignore-errors categories (unknown categories are fatal in
# all versions), so the flags are version-gated.
execute_process(COMMAND ${LCOV_PATH} --version
OUTPUT_VARIABLE LCOV_VERSION_OUTPUT
ERROR_QUIET)
set(LCOV_MAJOR_VERSION 0)
if (LCOV_VERSION_OUTPUT MATCHES "LCOV version ([0-9]+)\\.([0-9]+)")
set(LCOV_MAJOR_VERSION ${CMAKE_MATCH_1})
endif ()
if (LCOV_MAJOR_VERSION GREATER_EQUAL 2)
# mismatch = lcov 2.0, inconsistent = 2.1+ (renamed); both accepted on all 2.x
set(LCOV_CAPTURE_IGNORE_ERRORS --ignore-errors mismatch,inconsistent)
set(LCOV_REMOVE_IGNORE_ERRORS --ignore-errors unused)
else ()
set(LCOV_CAPTURE_IGNORE_ERRORS "")
set(LCOV_REMOVE_IGNORE_ERRORS "")
endif ()

#IF(NOT CMAKE_COMPILER_IS_GNUCXX)
# MESSAGE(FATAL_ERROR "Compiler is not GNU gcc! Aborting...")
#ENDIF() # NOT CMAKE_COMPILER_IS_GNUCXX
Expand Down Expand Up @@ -134,8 +156,8 @@ function (setup_target_for_coverage)

# Capturing lcov counters and generating report
COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/coverage
COMMAND ${LCOV_PATH} --directory ${COVERAGE_SCAN_DIR} --capture --output-file ${OUTPUT_FILE}
COMMAND ${LCOV_PATH} --remove ${OUTPUT_FILE} '**/error_injector/*' '**/mock/*' '**/.conan/*' '**/test/*' '**/gtest/*' '**/tst/*' '**/celix/gen/*' '**/googletest_project/*' '**/glog/*' '/usr/*' --output-file ${OUTPUT_FILE}.cleaned
COMMAND ${LCOV_PATH} --directory ${COVERAGE_SCAN_DIR} --capture ${LCOV_CAPTURE_IGNORE_ERRORS} --output-file ${OUTPUT_FILE}
COMMAND ${LCOV_PATH} --remove ${OUTPUT_FILE} '**/error_injector/*' '**/mock/*' '**/.conan/*' '**/test/*' '**/gtest/*' '**/tst/*' '**/celix/gen/*' '**/googletest_project/*' '**/glog/*' '/usr/*' ${LCOV_REMOVE_IGNORE_ERRORS} --output-file ${OUTPUT_FILE}.cleaned

#test dependencies, so that test is runned
DEPENDENCIES ${TEST_TARGET_NAME}
Expand Down
18 changes: 16 additions & 2 deletions conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,8 @@ class CelixConan(ConanFile):
"build_experimental": False,
"build_celix_dfi": False,
"build_framework": False,
"build_jansson_ext": False,
"build_jansson_ext_examples": False,
"build_rcm": False,
"build_utils": False,
"build_event_admin": False,
Expand Down Expand Up @@ -193,6 +195,7 @@ def _get_dependency_option_value(self, dep_name, option_name):
ValidationRule(self.options.build_celix_dfi, 'jansson', "shared", True, 'build_celix_dfi=True'),
ValidationRule(self.options.build_celix_etcdlib, 'jansson', "shared", True, 'build_celix_etcdlib=True'),
ValidationRule(self.options.build_event_admin_remote_provider_mqtt, 'jansson', "shared", True, 'build_event_admin_remote_provider_mqtt=True'),
ValidationRule(self.options.build_jansson_ext, 'jansson', "shared", True, 'build_jansson_ext=True'),
ValidationRule(self.options.build_event_admin_remote_provider_mqtt and self.options.enable_testing, "mosquitto", "broker", True, "build_event_admin_remote_provider_mqtt=True and enable_testing=True"),
]

Expand Down Expand Up @@ -343,6 +346,12 @@ def configure(self):
if options["build_rcm"]:
options["build_utils"] = True

if options["build_jansson_ext_examples"]:
options["build_jansson_ext"] = True

if options["build_jansson_ext"]:
options["build_utils"] = True

if options["build_launcher"]:
options["build_framework"] = True

Expand Down Expand Up @@ -388,13 +397,13 @@ def requirements(self):
self.requires("civetweb/1.16")
if self.options.build_celix_dfi:
self.requires("libffi/[>=3.2.1 <4.0.0]")
if self.options.build_utils or self.options.build_celix_dfi or self.options.build_celix_etcdlib or self.options.build_event_admin_remote_provider_mqtt:
if self.options.build_utils or self.options.build_celix_dfi or self.options.build_celix_etcdlib or self.options.build_event_admin_remote_provider_mqtt or self.options.build_jansson_ext:
self.requires("jansson/[>=2.12 <3.0.0]")
if self.options.build_rsa_discovery_zeroconf:
# TODO: To be replaced with mdnsresponder/1790.80.10, resolve some problems of mdnsresponder
# https://github.com/conan-io/conan-center-index/pull/16254
self.requires("mdnsresponder/1310.140.1")
self.requires("openssl/[>=3.2.0]", override=True)
self.requires("openssl/[>=3.2.0 <4.0.0]", override=True)
# Fix zlib to 1.3.1, 'libzip/1.10.1' and 'libcurl/7.64.1' requires different zlib versions causing conflicts
self.requires("zlib/1.3.1", override=True)
if self.options.build_event_admin_remote_provider_mqtt:
Expand Down Expand Up @@ -455,3 +464,8 @@ def package_info(self):
self.cpp_info.bindirs = ["bin", os.path.join("share", self.name, "bundles")]
self.cpp_info.builddirs.append(os.path.join("lib", "cmake", "Celix"))
self.cpp_info.set_property("cmake_find_mode", "none")
# Celix is always built as shared libraries by its CMake build system, so consumers
# need the lib dir in the run environment to find the libraries at runtime.
self.runenv_info.prepend_path("LD_LIBRARY_PATH", os.path.join(self.package_folder, "lib"))
if self.settings.os == "Macos":
self.runenv_info.prepend_path("DYLD_LIBRARY_PATH", os.path.join(self.package_folder, "lib"))
1 change: 1 addition & 0 deletions libs/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#(e.g. no dependency on celix framework
add_subdirectory(utils)
add_subdirectory(rcm)
add_subdirectory(jansson_ext)
add_subdirectory(dfi)
add_subdirectory(etcdlib)
add_subdirectory(promises)
Expand Down
3 changes: 3 additions & 0 deletions libs/error_injector/jansson/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ target_link_options(jansson_ei INTERFACE
LINKER:--wrap,json_object_set_new
LINKER:--wrap,json_array
LINKER:--wrap,json_array_append_new
LINKER:--wrap,json_array_set_new
LINKER:--wrap,json_array_insert_new
LINKER:--wrap,json_integer
LINKER:--wrap,json_string
LINKER:--wrap,json_real
Expand All @@ -41,5 +43,6 @@ target_link_options(jansson_ei INTERFACE
LINKER:--wrap,json_pack_ex
LINKER:--wrap,json_null
LINKER:--wrap,json_loads
LINKER:--wrap,json_deep_copy
)
add_library(Celix::jansson_ei ALIAS jansson_ei)
3 changes: 3 additions & 0 deletions libs/error_injector/jansson/include/jansson_ei.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ CELIX_EI_DECLARE(json_object, json_t*);
CELIX_EI_DECLARE(json_object_set_new, int);
CELIX_EI_DECLARE(json_array, json_t*);
CELIX_EI_DECLARE(json_array_append_new, int);
CELIX_EI_DECLARE(json_array_set_new, int);
CELIX_EI_DECLARE(json_array_insert_new, int);
CELIX_EI_DECLARE(json_integer, json_t*);
CELIX_EI_DECLARE(json_string, json_t*);
CELIX_EI_DECLARE(json_real, json_t*);
Expand All @@ -40,6 +42,7 @@ CELIX_EI_DECLARE(json_dumpf, int);
CELIX_EI_DECLARE(json_pack_ex, json_t*);
CELIX_EI_DECLARE(json_null, json_t*);
CELIX_EI_DECLARE(json_loads, json_t*);
CELIX_EI_DECLARE(json_deep_copy, json_t*);

#ifdef __cplusplus
}
Expand Down
23 changes: 23 additions & 0 deletions libs/error_injector/jansson/src/jansson_ei.cc
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,22 @@ int __wrap_json_array_append_new(json_t* array, json_t* value) {
return __real_json_array_append_new(array, celix_steal_ptr(val));
}

int __real_json_array_set_new(json_t* array, size_t index, json_t* value);
CELIX_EI_DEFINE(json_array_set_new, int)
int __wrap_json_array_set_new(json_t* array, size_t index, json_t* value) {
json_auto_t* val = value;
CELIX_EI_IMPL(json_array_set_new);
return __real_json_array_set_new(array, index, celix_steal_ptr(val));
}

int __real_json_array_insert_new(json_t* array, size_t index, json_t* value);
CELIX_EI_DEFINE(json_array_insert_new, int)
int __wrap_json_array_insert_new(json_t* array, size_t index, json_t* value) {
json_auto_t* val = value;
CELIX_EI_IMPL(json_array_insert_new);
return __real_json_array_insert_new(array, index, celix_steal_ptr(val));
}

json_t* __real_json_integer(json_int_t value);
CELIX_EI_DEFINE(json_integer, json_t*)
json_t* __wrap_json_integer(json_int_t value) {
Expand Down Expand Up @@ -138,4 +154,11 @@ json_t* __wrap_json_loads(const char* input, size_t flags, json_error_t* error)
return __real_json_loads(input, flags, error);
}

json_t* __real_json_deep_copy(const json_t* value);
CELIX_EI_DEFINE(json_deep_copy, json_t*)
json_t* __wrap_json_deep_copy(const json_t* value) {
CELIX_EI_IMPL(json_deep_copy);
return __real_json_deep_copy(value);
}

}
1 change: 1 addition & 0 deletions libs/error_injector/stdio/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -33,5 +33,6 @@ target_link_options(stdio_ei INTERFACE
LINKER:--wrap,fclose
LINKER:--wrap,fgetc
LINKER:--wrap,fmemopen
LINKER:--wrap,vsnprintf
)
add_library(Celix::stdio_ei ALIAS stdio_ei)
2 changes: 2 additions & 0 deletions libs/error_injector/stdio/include/stdio_ei.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ CELIX_EI_DECLARE(fgetc, int);

CELIX_EI_DECLARE(fmemopen, FILE*);

CELIX_EI_DECLARE(vsnprintf, int);

#ifdef __cplusplus
}
#endif
Expand Down
12 changes: 11 additions & 1 deletion libs/error_injector/stdio/src/stdio_ei.cc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
*/

#include <errno.h>
#include <stdarg.h>
#include "stdio_ei.h"

extern "C" {
Expand Down Expand Up @@ -124,4 +125,13 @@ FILE* __wrap_fmemopen(void* __s, size_t __len, const char* __modes) {
return __real_fmemopen(__s, __len, __modes);
}

}
int __real_vsnprintf(char* __restrict __s, size_t __maxlen, const char* __restrict __format, va_list __arg);
CELIX_EI_DEFINE(vsnprintf, int)
int __wrap_vsnprintf(char* __restrict __s, size_t __maxlen, const char* __restrict __format, va_list __arg) {
errno = EOVERFLOW; //glibc sets this when the formatted output length exceeds INT_MAX
CELIX_EI_IMPL(vsnprintf);
errno = 0;
return __real_vsnprintf(__s, __maxlen, __format, __arg);
}

}
83 changes: 83 additions & 0 deletions libs/jansson_ext/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

celix_subproject(JANSSON_EXT "Option to enable building the Jansson extension library (JSON Schema validation, JSON Pointer and JSON Patch)" OFF)
if (JANSSON_EXT)
find_package(jansson REQUIRED)

set(JANSSON_EXT_SOURCES
src/celix_jansson_schema.c
src/celix_jansson_pointer.c
src/celix_json_patch.c
src/celix_json_merge_patch.c
src/celix_jansson_uri.c
src/celix_string_format_check.c
src/celix_smtp_address_validator.c
src/celix_util.c
)

add_library(jansson_ext SHARED ${JANSSON_EXT_SOURCES})
set_target_properties(jansson_ext PROPERTIES
OUTPUT_NAME "celix_jansson_ext"
VERSION 0.1.0
SOVERSION 0)
celix_target_hide_symbols(jansson_ext)
target_link_libraries(jansson_ext
PUBLIC jansson::jansson Threads::Threads Celix::utils
PRIVATE m)
target_include_directories(jansson_ext
PRIVATE src
PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/include>
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/celix/gen/includes/jansson_ext>)
generate_export_header(jansson_ext
BASE_NAME CELIX_JANSSON_EXT
EXPORT_FILE_NAME "${CMAKE_CURRENT_BINARY_DIR}/celix/gen/includes/jansson_ext/celix_jansson_ext_export.h")
add_library(Celix::jansson_ext ALIAS jansson_ext)

# Install (always, no option gate)
install(TARGETS jansson_ext
EXPORT celix
DESTINATION ${CMAKE_INSTALL_LIBDIR}
COMPONENT framework
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/jansson_ext)
install(DIRECTORY include/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/jansson_ext
COMPONENT framework)
install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/celix/gen/includes/jansson_ext/
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/celix/jansson_ext
COMPONENT framework)

if (ENABLE_TESTING)
add_library(jansson_ext_cut STATIC ${JANSSON_EXT_SOURCES})
target_link_libraries(jansson_ext_cut
PUBLIC jansson::jansson Threads::Threads Celix::utils
PRIVATE m)
target_include_directories(jansson_ext_cut
PUBLIC
${CMAKE_CURRENT_LIST_DIR}/include
${CMAKE_CURRENT_LIST_DIR}/src
${CMAKE_CURRENT_BINARY_DIR}/celix/gen/includes/jansson_ext)
target_compile_definitions(jansson_ext_cut PUBLIC CELIX_JANSSON_EXT_STATIC_DEFINE)
add_subdirectory(gtest)
endif ()

celix_subproject(JANSSON_EXT_EXAMPLES "Option to enable building the jansson extension examples" OFF)
if (JANSSON_EXT_EXAMPLES)
add_subdirectory(example)
endif ()
endif ()
53 changes: 53 additions & 0 deletions libs/jansson_ext/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Jansson Extension Library

The Jansson Extension (`jansson_ext`) library provides JSON Schema validation,
JSON Pointer, JSON Patch, and JSON Merge Patch functionality built on top of the
[Jansson](https://github.com/akheron/jansson) C library.

## Features

- **JSON Schema Draft-7 Validation** — Compile schemas into an internal object
tree for fast repeated validation. Supports all draft-7 keywords including
`$ref`, `allOf`/`anyOf`/`oneOf`, `if`/`then`/`else`, `format`, default
values, and more.
- **JSON Pointer (RFC 6901)** — Parse, build, and resolve JSON Pointers against
JSON documents. Supports stack-allocation of pointer objects for zero-overhead
path manipulation.
- **JSON Patch (RFC 6902)** — Build and apply JSON Patch documents for
programmatic JSON transformations.
- **JSON Merge Patch (RFC 7396)** — Apply merge patch documents, where a null
member removes the corresponding member and a non-object patch replaces the
whole document.

## API

Public headers are in the `include/` directory:

- [celix_jansson_schema.h](include/celix_jansson_schema.h) — JSON Schema validation
- [celix_jansson_pointer.h](include/celix_jansson_pointer.h) — JSON Pointer operations
- [celix_json_patch.h](include/celix_json_patch.h) — JSON Patch builder
- [celix_json_merge_patch.h](include/celix_json_merge_patch.h) — JSON Merge Patch application

## Dependencies

- [Jansson](https://github.com/akheron/jansson) `>= 2.12`
- POSIX Threads (`pthread`)

## Building

The library is built as part of Apache Celix. Enable it with:

```bash
cmake -DBUILD_JANSSON_EXT=ON -S . -B build
cmake --build build
```

With Conan:

```bash
conan create . -o build_jansson_ext=True --build=missing
```

## License

Licensed under the Apache License, Version 2.0.
19 changes: 19 additions & 0 deletions libs/jansson_ext/example/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.

add_executable(json_schema_validate json_schema_validate.c)
target_link_libraries(json_schema_validate PRIVATE Celix::jansson_ext)
Loading
Loading