Skip to content

Commit 7b8ec81

Browse files
committed
Add support to build shared, static and object lib at the same time.
1 parent 9ff1430 commit 7b8ec81

File tree

4 files changed

+113
-39
lines changed

4 files changed

+113
-39
lines changed

Diff for: CMakeLists.txt

+7-5
Original file line numberDiff line numberDiff line change
@@ -59,19 +59,19 @@ if(CCACHE_EXECUTABLE)
5959
set(CMAKE_C_COMPILER_LAUNCHER "${CCACHE_EXECUTABLE}" CACHE PATH "ccache" FORCE)
6060
endif()
6161

62-
project(JSONCPP
62+
project(jsoncpp
6363
# Note: version must be updated in three places when doing a release. This
6464
# annoying process ensures that amalgamate, CMake, and meson all report the
6565
# correct version.
6666
# 1. ./meson.build
6767
# 2. ./include/json/version.h
6868
# 3. ./CMakeLists.txt
69-
# IMPORTANT: also update the JSONCPP_SOVERSION!!
69+
# IMPORTANT: also update the PROJECT_SOVERSION!!
7070
VERSION 1.9.3 # <major>[.<minor>[.<patch>[.<tweak>]]]
7171
LANGUAGES CXX)
7272

73-
message(STATUS "JsonCpp Version: ${JSONCPP_VERSION_MAJOR}.${JSONCPP_VERSION_MINOR}.${JSONCPP_VERSION_PATCH}")
74-
set(JSONCPP_SOVERSION 24)
73+
message(STATUS "JsonCpp Version: ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}")
74+
set(PROJECT_SOVERSION 24)
7575

7676
option(JSONCPP_WITH_TESTS "Compile and (for jsoncpp_check) run JsonCpp test executables" ON)
7777
option(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post build step" ON)
@@ -80,7 +80,9 @@ option(JSONCPP_WITH_STRICT_ISO "Issue all the warnings demanded by strict ISO C
8080
option(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
8181
option(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" ON)
8282
option(JSONCPP_WITH_EXAMPLE "Compile JsonCpp example" OFF)
83-
option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
83+
option(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." ON)
84+
option(BUILD_STATIC_LIBS "Build jsoncpp_lib as a static library." ON)
85+
option(BUILD_OBJECT_LIBS "Build jsoncpp_lib as a object library." ON)
8486

8587
# Adhere to GNU filesystem layout conventions
8688
include(GNUInstallDirs)

Diff for: src/jsontestrunner/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ if(BUILD_SHARED_LIBS)
1919
else()
2020
add_definitions(-DJSON_DLL)
2121
endif()
22+
target_link_libraries(jsontestrunner_exe jsoncpp_lib)
23+
else()
24+
target_link_libraries(jsontestrunner_exe jsoncpp_static)
2225
endif()
23-
target_link_libraries(jsontestrunner_exe jsoncpp_lib)
2426

2527
set_target_properties(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)
2628

Diff for: src/lib_json/CMakeLists.txt

+100-32
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ set(PUBLIC_HEADERS
5050

5151
source_group("Public API" FILES ${PUBLIC_HEADERS})
5252

53-
set(jsoncpp_sources
53+
set(JSONCPP_SOURCES
5454
json_tool.h
5555
json_reader.cpp
5656
json_valueiterator.inl
@@ -65,32 +65,10 @@ else()
6565
set(INSTALL_EXPORT)
6666
endif()
6767

68-
69-
if(BUILD_SHARED_LIBS)
70-
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
71-
add_compile_definitions(JSON_DLL_BUILD)
72-
else()
73-
add_definitions(-DJSON_DLL_BUILD)
74-
endif()
75-
endif()
76-
77-
add_library(jsoncpp_lib ${PUBLIC_HEADERS} ${jsoncpp_sources})
78-
set_target_properties( jsoncpp_lib PROPERTIES
79-
OUTPUT_NAME jsoncpp
80-
VERSION ${JSONCPP_VERSION}
81-
SOVERSION ${JSONCPP_SOVERSION}
82-
POSITION_INDEPENDENT_CODE ON
83-
)
84-
85-
# Set library's runtime search path on OSX
86-
if(APPLE)
87-
set_target_properties(jsoncpp_lib PROPERTIES INSTALL_RPATH "@loader_path/.")
88-
endif()
89-
9068
# Specify compiler features required when compiling a given target.
9169
# See https://cmake.org/cmake/help/v3.1/prop_gbl/CMAKE_CXX_KNOWN_FEATURES.html#prop_gbl:CMAKE_CXX_KNOWN_FEATURES
9270
# for complete list of features available
93-
target_compile_features(jsoncpp_lib PUBLIC
71+
list(APPEND REQUIRED_FEATURES
9472
cxx_std_11 # Compiler mode is aware of C++ 11.
9573
#MSVC 1900 cxx_alignas # Alignment control alignas, as defined in N2341.
9674
#MSVC 1900 cxx_alignof # Alignment control alignof, as defined in N2341.
@@ -137,16 +115,106 @@ target_compile_features(jsoncpp_lib PUBLIC
137115
cxx_variadic_templates # Variadic templates, as defined in N2242.
138116
)
139117

140-
install(TARGETS jsoncpp_lib ${INSTALL_EXPORT}
118+
119+
if(BUILD_SHARED_LIBS)
120+
if(CMAKE_VERSION VERSION_GREATER_EQUAL 3.12.0)
121+
add_compile_definitions(JSON_DLL_BUILD)
122+
else()
123+
add_definitions(-DJSON_DLL_BUILD)
124+
endif()
125+
126+
set(SHARED_LIB ${PROJECT_NAME}_lib)
127+
add_library(${SHARED_LIB} SHARED ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
128+
set_target_properties(${SHARED_LIB} PROPERTIES
129+
OUTPUT_NAME jsoncpp
130+
VERSION ${PROJECT_VERSION}
131+
SOVERSION ${PROJECT_SOVERSION}
132+
POSITION_INDEPENDENT_CODE ON
133+
)
134+
135+
# Set library's runtime search path on OSX
136+
if(APPLE)
137+
set_target_properties(${SHARED_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
138+
endif()
139+
140+
target_compile_features(${SHARED_LIB} PUBLIC ${REQUIRED_FEATURES})
141+
142+
if(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
143+
target_include_directories(${SHARED_LIB} PUBLIC
144+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
145+
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
146+
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
147+
)
148+
endif()
149+
150+
list(APPEND CMAKE_TARGETS ${SHARED_LIB})
151+
endif()
152+
153+
if(BUILD_STATIC_LIBS)
154+
set(STATIC_LIB ${PROJECT_NAME}_static)
155+
add_library(${STATIC_LIB} STATIC ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
156+
157+
# avoid name clashes on windows as the shared import lib is alse named jsoncpp.lib
158+
if(NOT DEFINED STATIC_SUFFIX AND BUILD_SHARED_LIBS)
159+
set(STATIC_SUFFIX "_static")
160+
endif()
161+
162+
set_target_properties(${STATIC_LIB} PROPERTIES
163+
OUTPUT_NAME jsoncpp${STATIC_SUFFIX}
164+
VERSION ${PROJECT_VERSION}
165+
)
166+
167+
# Set library's runtime search path on OSX
168+
if(APPLE)
169+
set_target_properties(${STATIC_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
170+
endif()
171+
172+
target_compile_features(${SHARED_LIB} PUBLIC ${REQUIRED_FEATURES})
173+
174+
if(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
175+
target_include_directories(${STATIC_LIB} PUBLIC
176+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
177+
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
178+
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
179+
)
180+
endif()
181+
182+
list(APPEND CMAKE_TARGETS ${STATIC_LIB})
183+
endif()
184+
185+
if(BUILD_OBJECT_LIBS)
186+
set(OBJECT_LIB ${PROJECT_NAME}_object)
187+
add_library(${OBJECT_LIB} OBJECT ${PUBLIC_HEADERS} ${JSONCPP_SOURCES})
188+
189+
set_target_properties(${OBJECT_LIB} PROPERTIES
190+
OUTPUT_NAME jsoncpp
191+
VERSION ${PROJECT_VERSION}
192+
SOVERSION ${PROJECT_SOVERSION}
193+
POSITION_INDEPENDENT_CODE ON
194+
)
195+
196+
# Set library's runtime search path on OSX
197+
if(APPLE)
198+
set_target_properties(${OBJECT_LIB} PROPERTIES INSTALL_RPATH "@loader_path/.")
199+
endif()
200+
201+
target_compile_features(${OBJECT_LIB} PUBLIC ${REQUIRED_FEATURES})
202+
203+
if(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
204+
target_include_directories(${OBJECT_LIB} PUBLIC
205+
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
206+
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
207+
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
208+
)
209+
endif()
210+
211+
list(APPEND CMAKE_TARGETS ${OBJECT_LIB})
212+
endif()
213+
214+
install(TARGETS ${CMAKE_TARGETS} ${INSTALL_EXPORT}
141215
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
142216
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
143217
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
218+
OBJECTS DESTINATION ${CMAKE_INSTALL_LIBDIR}
144219
)
145220

146-
if(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
147-
target_include_directories(jsoncpp_lib PUBLIC
148-
$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
149-
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
150-
$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include/json>
151-
)
152-
endif()

Diff for: src/test_lib_json/CMakeLists.txt

+3-1
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ if(BUILD_SHARED_LIBS)
1515
else()
1616
add_definitions( -DJSON_DLL )
1717
endif()
18+
target_link_libraries(jsoncpp_test jsoncpp_lib)
19+
else()
20+
target_link_libraries(jsoncpp_test jsoncpp_static)
1821
endif()
19-
target_link_libraries(jsoncpp_test jsoncpp_lib)
2022

2123
# another way to solve issue #90
2224
#set_target_properties(jsoncpp_test PROPERTIES COMPILE_FLAGS -ffloat-store)

0 commit comments

Comments
 (0)