1- cmake_minimum_required (VERSION 3.23.0 )
1+ cmake_minimum_required (VERSION 3.23.0..4.0 )
22
33if (POLICY CMP0135)
44 cmake_policy (SET CMP0135 NEW )
@@ -19,9 +19,9 @@ set_property(CACHE JINJA2CPP_WITH_SANITIZERS PROPERTY STRINGS ${JINJA2CPP_SANITI
1919set (JINJA2CPP_SUPPORTED_REGEX std boost)
2020set (JINJA2CPP_USE_REGEX boost CACHE STRING "Use regex parser in lexer, boost works faster on most platforms" )
2121set_property (CACHE JINJA2CPP_USE_REGEX PROPERTY STRINGS ${JINJA2CPP_SUPPORTED_REGEX} )
22- set (JINJA2CPP_WITH_JSON_BINDINGS boost nlohmann rapid all none )
23- set (JINJA2CPP_WITH_JSON_BINDINGS boost CACHE STRING "Build with json support(boost|rapid) " )
24- set_property (CACHE JINJA2CPP_WITH_JSON_BINDINGS PROPERTY STRINGS ${JINJA2CPP_WITH_JSON_BINDINGS } )
22+ set (JINJA2CPP_WITH_JSON_SUPPORTED_BINDINGS boost nlohmann rapid)
23+ set (JINJA2CPP_WITH_JSON_BINDINGS boost CACHE STRING "Build with json support(boost|rapid|nlohmann) for serialization operations, like tojson filter. 'boost' is default. " )
24+ set_property (CACHE JINJA2CPP_WITH_JSON_BINDINGS PROPERTY STRINGS ${JINJA2CPP_WITH_JSON_SUPPORTED_BINDINGS } )
2525set (JINJA2CPP_DEPS_MODE "internal" CACHE STRING "Jinja2Cpp dependency management mode (internal | external | external-boost | conan-build). See documentation for details. 'interal' is default." )
2626option (JINJA2CPP_BUILD_TESTS "Build Jinja2Cpp unit tests" ${JINJA2CPP_IS_MAIN_PROJECT} )
2727option (JINJA2CPP_STRICT_WARNINGS "Enable additional warnings and treat them as errors" ON )
@@ -144,13 +144,29 @@ include(collect_sources)
144144
145145set (LIB_TARGET_NAME jinja2cpp)
146146
147- CollectSources (Sources Headers ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} /src )
147+ set (JINJA2CPP_SOURCES
148+ src/error_info.cpp
149+ src/expression_evaluator.cpp
150+ src/expression_parser.cpp
151+ src/filesystem_handler.cpp
152+ src/filters.cpp
153+ src/generic_list.cpp
154+ src/internal_value.cpp
155+ src/lexer.cpp
156+ src/serialize_filters.cpp
157+ src/statements.cpp
158+ src/string_converter_filter.cpp
159+ src/template.cpp
160+ src/template_env.cpp
161+ src/template_parser.cpp
162+ src/testers.cpp
163+ src/value.cpp
164+ )
165+
148166CollectSources (PublicSources PublicHeaders ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} /include )
149167
150168add_library (${LIB_TARGET_NAME} ${LIB_LINK_TYPE}
151- ${Sources}
152- ${Headers}
153- ${PublicHeaders}
169+ ${JINJA2CPP_SOURCES}
154170)
155171
156172target_sources (${LIB_TARGET_NAME}
@@ -185,19 +201,6 @@ endif()
185201set (JINJA2CPP_PRIVATE_LIBS "${JINJA2CPP_PRIVATE_LIBS} " )
186202include (thirdparty/CMakeLists.txt )
187203
188- target_link_libraries (
189- ${LIB_TARGET_NAME}
190- PUBLIC
191- ${JINJA2CPP_PUBLIC_LIBS}
192- PRIVATE
193- ${JINJA2CPP_PRIVATE_LIBS}
194- )
195-
196- target_include_directories (${LIB_TARGET_NAME}
197- PUBLIC
198- $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >
199- $<INSTALL_INTERFACE :include >
200- )
201204
202205if (JINJA2CPP_STRICT_WARNINGS)
203206 if (UNIX )
@@ -218,19 +221,59 @@ endif ()
218221if ("${JINJA2CPP_USE_REGEX} " STREQUAL "boost" )
219222 set (_regex_define "-DJINJA2CPP_USE_REGEX_BOOST" )
220223endif ()
224+
221225if ("${JINJA2CPP_WITH_JSON_BINDINGS} " STREQUAL "boost" )
222226 set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_BOOST" )
227+ target_sources (${LIB_TARGET_NAME}
228+ PRIVATE
229+ src/binding/boost_json_serializer.cpp
230+ )
231+ list (APPEND JINJA2CPP_PRIVATE_LIBS Boost::json)
223232elseif ("${JINJA2CPP_WITH_JSON_BINDINGS} " STREQUAL "rapid" )
224233 set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_RAPID" )
234+ target_sources (${LIB_TARGET_NAME}
235+ PRIVATE
236+ src/binding/rapid_json_serializer.cpp
237+ )
238+ list (APPEND JINJA2CPP_PRIVATE_LIBS RapidJson)
239+ else ()
240+ set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_NLOHMANN" )
241+ target_sources (${LIB_TARGET_NAME}
242+ PRIVATE
243+ src/binding/nlohmann_json_serializer.cpp
244+ )
245+ list (APPEND JINJA2CPP_PRIVATE_LIBS nlohmann_json::nlohmann_json)
225246endif ()
226- target_compile_definitions (${LIB_TARGET_NAME}
247+
248+ target_link_libraries (
249+ ${LIB_TARGET_NAME}
250+ PUBLIC
251+ ${JINJA2CPP_PUBLIC_LIBS}
252+ PRIVATE
253+ ${JINJA2CPP_PRIVATE_LIBS}
254+ )
255+
256+ target_include_directories (
257+ ${LIB_TARGET_NAME}
258+ PUBLIC
259+ $<BUILD_INTERFACE :${CMAKE_CURRENT_SOURCE_DIR} /include >
260+ $<INSTALL_INTERFACE :include >
261+ )
262+
263+ target_compile_definitions (
264+ ${LIB_TARGET_NAME}
227265 PUBLIC
228266 -DBOOST_SYSTEM_NO_DEPRECATED
229267 -DBOOST_ERROR_CODE_HEADER_ONLY
230268 ${_regex_define}
231269 ${_bindings_define}
232270)
233-
271+ # force nonstd variant option for msvc compiler
272+ target_compile_definitions (
273+ ${LIB_TARGET_NAME}
274+ PUBLIC
275+ $<$<CXX_COMPILER_ID :MSVC >:variant_CONFIG_SELECT_VARIANT =variant_VARIANT_NONSTD >
276+ )
234277if (JINJA2CPP_BUILD_SHARED)
235278 target_compile_definitions (${LIB_TARGET_NAME} PRIVATE -DJINJA2CPP_BUILD_AS_SHARED PUBLIC -DJINJA2CPP_LINK_AS_SHARED )
236279endif ()
@@ -251,8 +294,30 @@ if (JINJA2CPP_BUILD_TESTS)
251294 enable_testing ()
252295
253296 CollectSources (TestSources TestHeaders ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR} /test )
254- add_executable (jinja2cpp_tests ${TestSources} ${TestHeaders} )
255- target_link_libraries (jinja2cpp_tests gtest gtest_main
297+ set (JINJA2CPP_TEST_SOURCES
298+ test/basic_tests.cpp
299+ test/errors_test.cpp
300+ test/expressions_test.cpp
301+ test/extends_test.cpp
302+ test/filesystem_handler_test.cpp
303+ test/filters_test.cpp
304+ test/forloop_test.cpp
305+ test/helpers_tests.cpp
306+ test/if_test.cpp
307+ test/import_test.cpp
308+ test/includes_test.cpp
309+ test/macro_test.cpp
310+ test/metadata_test.cpp
311+ test/perf_test.cpp
312+ test/statements_tets.cpp
313+ test/test_data
314+ test/test_tools.h
315+ test/testers_test.cpp
316+ test/tojson_filter_test.cpp
317+ test/user_callable_test.cpp
318+ )
319+ add_executable (jinja2cpp_tests ${JINJA2CPP_TEST_SOURCES} )
320+ target_link_libraries (jinja2cpp_tests gtest gmock gtest_main
256321 nlohmann_json::nlohmann_json ${LIB_TARGET_NAME} ${EXTRA_TEST_LIBS} ${JINJA2CPP_PRIVATE_LIBS} )
257322
258323 set_target_properties (jinja2cpp_tests PROPERTIES
@@ -277,6 +342,39 @@ if (JINJA2CPP_BUILD_TESTS)
277342 add_dependencies (jinja2cpp_tests CopyTestData )
278343
279344 add_test (NAME jinja2cpp_tests COMMAND jinja2cpp_tests )
345+
346+ if ("${JINJA2CPP_WITH_JSON_BINDINGS} " STREQUAL "boost" )
347+ set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_BOOST" )
348+ set (_bindings_test_source test/binding/boost_json_binding_test.cpp)
349+
350+ target_sources (jinja2cpp_tests
351+ PRIVATE
352+ src/binding/boost_json_serializer.cpp
353+ )
354+ endif ()
355+ if ("${JINJA2CPP_WITH_JSON_BINDINGS} " STREQUAL "rapid" )
356+ set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_RAPID" )
357+ target_sources (jinja2cpp_tests
358+ PRIVATE
359+ test /binding/rapid_json_binding_test.cpp
360+ test /binding/rapid_json_serializer_test.cpp
361+ )
362+ endif ()
363+ if ("${JINJA2CPP_WITH_JSON_BINDINGS} " STREQUAL "nlohmann" )
364+ set (_bindings_define "-DJINJA2CPP_WITH_JSON_BINDINGS_RAPID" )
365+ target_sources (jinja2cpp_tests
366+ PRIVATE
367+ test /binding/nlohmann_json_binding_test.cpp
368+ )
369+ endif ()
370+ target_compile_definitions (jinja2cpp_tests
371+ PUBLIC
372+ -DBOOST_SYSTEM_NO_DEPRECATED
373+ -DBOOST_ERROR_CODE_HEADER_ONLY
374+ ${_regex_define}
375+ ${_bindings_define}
376+ )
377+
280378endif ()
281379
282380set (JINJA2CPP_INSTALL_CONFIG_DIR "${CMAKE_INSTALL_LIBDIR} /${LIB_TARGET_NAME} " )
@@ -353,4 +451,4 @@ if(JINJA2CPP_INSTALL)
353451 DESTINATION
354452 ${JINJA2CPP_INSTALL_CONFIG_DIR}
355453 )
356- endif ()
454+ endif ()
0 commit comments