Skip to content

Use a consistent target name for jsoncpp in CMake scripts #333

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Changes from all commits
Commits
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: 3 additions & 2 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -9,8 +9,9 @@ OPTION(JSONCPP_WITH_POST_BUILD_UNITTEST "Automatically run unit-tests as a post
OPTION(JSONCPP_WITH_WARNING_AS_ERROR "Force compilation to fail if a warning occurs" OFF)
OPTION(JSONCPP_WITH_PKGCONFIG_SUPPORT "Generate and install .pc files" ON)
OPTION(JSONCPP_WITH_CMAKE_PACKAGE "Generate and install cmake package files" OFF)
OPTION(BUILD_SHARED_LIBS "Build jsoncpp_lib as a shared library." OFF)
OPTION(BUILD_STATIC_LIBS "Build jsoncpp_lib static library." ON)

SET(JSONCPP_LIBRARY_TYPE STATIC CACHE STRING "Build a static or shared library")
SET_PROPERTY(CACHE JSONCPP_LIBRARY_TYPE PROPERTY STRINGS STATIC SHARED )

# Ensures that CMAKE_BUILD_TYPE is visible in cmake-gui on Unix
IF(NOT WIN32)
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
@@ -85,16 +85,16 @@ Steps for generating solution/makefiles using `cmake-gui`:
* Make "source code" point to the source directory.
* Make "where to build the binary" point to the directory to use for the build.
* Click on the "Grouped" check box.
* Review JsonCpp build options (tick `BUILD_SHARED_LIBS` to build as a
dynamic library).
* Review JsonCpp build options (e.g. set `JSONCPP_LIBRARY_TYPE` to `SHARED` to
build as a shared library).
* Click the configure button at the bottom, then the generate button.
* The generated solution/makefiles can be found in the binary directory.

Alternatively, from the command-line on Unix in the source directory:

mkdir -p build/debug
cd build/debug
cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_STATIC_LIBS=ON -DBUILD_SHARED_LIBS=OFF -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
cmake -DCMAKE_BUILD_TYPE=debug -DJSONCPP_LIBRARY_TYPE=STATIC -DARCHIVE_INSTALL_DIR=. -G "Unix Makefiles" ../..
make

Running `cmake -h` will display the list of available generators (passed using
2 changes: 1 addition & 1 deletion dev.makefile
Original file line number Diff line number Diff line change
@@ -16,7 +16,7 @@ dox:
# Then 'git add -A' and 'git push' in jsoncpp-docs.
build:
mkdir -p build/debug
cd build/debug; cmake -DCMAKE_BUILD_TYPE=debug -DBUILD_SHARED_LIBS=ON -G "Unix Makefiles" ../..
cd build/debug; cmake -DCMAKE_BUILD_TYPE=debug -DJSONCPP_LIBRARY_TYPE=SHARED -G "Unix Makefiles" ../..
make -C build/debug

# Currently, this depends on include/json/version.h generated
3 changes: 1 addition & 2 deletions devtools/agent_vmw7.json
Original file line number Diff line number Diff line change
@@ -19,8 +19,7 @@
},
{"name": "shared_dll",
"variables": [
["BUILD_SHARED_LIBS=true"],
["BUILD_SHARED_LIBS=false"]
["JSONCPP_LIBRARY_TYPE=SHARED"]
]
},
{"name": "build_type",
3 changes: 1 addition & 2 deletions devtools/agent_vmxp.json
Original file line number Diff line number Diff line change
@@ -12,8 +12,7 @@
},
{"name": "shared_dll",
"variables": [
["BUILD_SHARED_LIBS=true"],
["BUILD_SHARED_LIBS=false"]
["JSONCPP_LIBRARY_TYPE=SHARED"]
]
},
{"name": "build_type",
7 changes: 3 additions & 4 deletions src/jsontestrunner/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -4,13 +4,12 @@ ADD_EXECUTABLE(jsontestrunner_exe
main.cpp
)

IF(BUILD_SHARED_LIBS)
IF(JSONCPP_LIBRARY_TYPE STREQUAL "SHARED")
ADD_DEFINITIONS( -DJSON_DLL )
TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib)
ELSE(BUILD_SHARED_LIBS)
TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp_lib_static)
ENDIF()

TARGET_LINK_LIBRARIES(jsontestrunner_exe jsoncpp)

SET_TARGET_PROPERTIES(jsontestrunner_exe PROPERTIES OUTPUT_NAME jsontestrunner_exe)

IF(PYTHONINTERP_FOUND)
55 changes: 23 additions & 32 deletions src/lib_json/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -39,42 +39,33 @@ ELSE(JSONCPP_WITH_CMAKE_PACKAGE)
SET(INSTALL_EXPORT)
ENDIF()

IF(BUILD_SHARED_LIBS)
ADD_DEFINITIONS( -DJSON_DLL_BUILD )
ADD_LIBRARY(jsoncpp_lib SHARED ${PUBLIC_HEADERS} ${jsoncpp_sources})
SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
SET_TARGET_PROPERTIES( jsoncpp_lib PROPERTIES OUTPUT_NAME jsoncpp
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )

INSTALL( TARGETS jsoncpp_lib ${INSTALL_EXPORT}
RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})

IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib PUBLIC
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>)
ENDIF()
set( project_name jsoncpp )

IF(JSONCPP_LIBRARY_TYPE STREQUAL "SHARED")
ADD_DEFINITIONS( -DJSON_DLL_BUILD )
SET(lib_type SHARED)
ELSEIF(JSONCPP_LIBRARY_TYPE STREQUAL "STATIC")
SET(lib_type STATIC)
ENDIF()

IF(BUILD_STATIC_LIBS)
ADD_LIBRARY(jsoncpp_lib_static STATIC ${PUBLIC_HEADERS} ${jsoncpp_sources})
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES VERSION ${JSONCPP_VERSION} SOVERSION ${JSONCPP_VERSION_MAJOR})
SET_TARGET_PROPERTIES( jsoncpp_lib_static PROPERTIES OUTPUT_NAME jsoncpp
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX} )
ADD_LIBRARY(${project_name} ${lib_type} ${PUBLIC_HEADERS} ${jsoncpp_sources})

INSTALL( TARGETS jsoncpp_lib_static ${INSTALL_EXPORT}
RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR})
SET_TARGET_PROPERTIES(${project_name} PROPERTIES
VERSION ${JSONCPP_VERSION}
SOVERSION ${JSONCPP_VERSION_MAJOR}
OUTPUT_NAME jsoncpp
DEBUG_OUTPUT_NAME jsoncpp${DEBUG_LIBNAME_SUFFIX}
)

IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
TARGET_INCLUDE_DIRECTORIES( jsoncpp_lib_static PUBLIC
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
)
ENDIF()
INSTALL(TARGETS ${project_name} ${INSTALL_EXPORT}
RUNTIME DESTINATION ${RUNTIME_INSTALL_DIR}
LIBRARY DESTINATION ${LIBRARY_INSTALL_DIR}
ARCHIVE DESTINATION ${ARCHIVE_INSTALL_DIR}
)

IF(NOT CMAKE_VERSION VERSION_LESS 2.8.11)
TARGET_INCLUDE_DIRECTORIES( ${project_name} PUBLIC
$<INSTALL_INTERFACE:${INCLUDE_INSTALL_DIR}>
$<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/${JSONCPP_INCLUDE_DIR}>
)
ENDIF()
19 changes: 9 additions & 10 deletions src/test_lib_json/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -7,32 +7,31 @@ ADD_EXECUTABLE( jsoncpp_test
)


IF(BUILD_SHARED_LIBS)
IF(JSONCPP_LIBRARY_TYPE STREQUAL "SHARED")
ADD_DEFINITIONS( -DJSON_DLL )
TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib)
ELSE(BUILD_SHARED_LIBS)
TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp_lib_static)
ENDIF(BUILD_SHARED_LIBS)
ENDIF()

TARGET_LINK_LIBRARIES(jsoncpp_test jsoncpp)

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

# Run unit tests in post-build
# (default cmake workflow hides away the test result into a file, resulting in poor dev workflow?!?)
IF(JSONCPP_WITH_POST_BUILD_UNITTEST)
IF(BUILD_SHARED_LIBS)
IF(JSONCPP_LIBRARY_TYPE STREQUAL "SHARED")
# First, copy the shared lib, for Microsoft.
# Then, run the test executable.
ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:jsoncpp_lib> $<TARGET_FILE_DIR:jsoncpp_test>
COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:jsoncpp> $<TARGET_FILE_DIR:jsoncpp_test>
COMMAND $<TARGET_FILE:jsoncpp_test>)
ELSE(BUILD_SHARED_LIBS)
ELSE(JSONCPP_LIBRARY_TYPE STREQUAL "STATIC")
# Just run the test executable.
ADD_CUSTOM_COMMAND( TARGET jsoncpp_test
POST_BUILD
COMMAND $<TARGET_FILE:jsoncpp_test>)
ENDIF(BUILD_SHARED_LIBS)
ENDIF(JSONCPP_WITH_POST_BUILD_UNITTEST)
ENDIF()
ENDIF()

SET_TARGET_PROPERTIES(jsoncpp_test PROPERTIES OUTPUT_NAME jsoncpp_test)
43 changes: 34 additions & 9 deletions travis.sh
Original file line number Diff line number Diff line change
@@ -17,13 +17,38 @@ set -vex

env | sort

cmake -DJSONCPP_WITH_CMAKE_PACKAGE=$CMAKE_PKG -DBUILD_SHARED_LIBS=$SHARED_LIB -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DCMAKE_VERBOSE_MAKEFILE=$VERBOSE_MAKE .
make

# Python is not available in Travis for osx.
# https://github.com/travis-ci/travis-ci/issues/2320
if [ "$TRAVIS_OS_NAME" != "osx" ]
then
make jsoncpp_check
valgrind --error-exitcode=42 --leak-check=full ./src/test_lib_json/jsoncpp_test
# $1 = Binary directory name
# $2 = Value for JSONCPP_LIBRARY_TYPE (SHARED or STATIC)
cmakebuild()
{
if [ ! -d "$1" ]; then
mkdir "$1"
fi

cd "$1"

cmake .. -G "Unix Makefiles" \
-DJSONCPP_WITH_CMAKE_PACKAGE="$CMAKE_PKG" \
-DJSONCPP_LIBRARY_TYPE="$2" \
-DCMAKE_BUILD_TYPE="$BUILD_TYPE" \
-DCMAKE_VERBOSE_MAKEFILE="$VERBOSE_MAKE"

make

# Python is not available in Travis for osx.
# https://github.com/travis-ci/travis-ci/issues/2320
if [ "$TRAVIS_OS_NAME" != "osx" ]; then
make jsoncpp_check
valgrind --error-exitcode=42 --leak-check=full ./src/test_lib_json/jsoncpp_test
fi

cd -
}

if [ "$SHARED_LIB" = "ON" ]; then
cmakebuild build_shared SHARED
fi

if [ "$STATIC_LIB" = "ON" ]; then
cmakebuild build_static STATIC
fi