Skip to content
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

[Draft] Proposition of a different packaging for this project #16

Open
wants to merge 9 commits into
base: jsonld_1_1
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,4 @@ scratch

# gdb files
.cache/
.vscode/
3 changes: 0 additions & 3 deletions .gitmodules

This file was deleted.

191 changes: 102 additions & 89 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,19 +27,106 @@ set(JSONLDCPP_VERSION ${JSONLDCPP_VERSION_MAJOR}.${JSONLDCPP_VERSION_MINOR}.${JS
set(JSONLDCPP_PROJECT "jsonld-cpp" CACHE STRING "Project Name")

# Test settings
option(JSONLDCPP_BUILD_TESTS "Build test executables" ON)
# Examples settings
option(JSONLDCPP_BUILD_EXAMPLES "Build example executables" ON)
# Load conanbuildinfo.cmake
option(USE_CONAN "If Conan is installed, use Conan to pull the project dependencies" OFF)

###############
# Conan support
###############

find_program (CONAN_BIN conan)
if(CONAN_BIN AND USE_CONAN)
message (STATUS "Found conan C++ package manager: ${CONAN_BIN}")
find_file (CONANFILE NAMES "conanfile.txt" HINTS "${CMAKE_SOURCE_DIR}")
if (CONANFILE)
message (STATUS "Found ${CONANFILE}")
if (NOT EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake")
message(STATUS "Trying to execute 'conan install'")
get_filename_component(CONANFILE_DIR ${CONANFILE} DIRECTORY)
execute_process(COMMAND conan install ${CONANFILE_DIR} --build=missing)
endif()
endif()

if (EXISTS "${CMAKE_BINARY_DIR}/conanbuildinfo.cmake")
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
message(STATUS "conan_basic_setup()")
conan_basic_setup(TARGETS)
else()
message(WARNING "Please run 'conan install' if you plan to use conan")
endif()
endif()

set(JSONLDCPP_BUILD_TESTS ON CACHE BOOL "Build test executables")
set(JSONLDCPP_BUILD_GOOGLETEST ON CACHE BOOL "Build googletest for testing")
set(JSONLDCPP_BUILD_RAPIDCHECK ON CACHE BOOL "Build rapidcheck for testing")
##########################################
# Local CMake scripts and finders (if any)
##########################################

# Examples settings
if (EXISTS "${CMAKE_SOURCE_DIR}/cmake/Modules/")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/Modules/")
endif()

###############################
# Check compiler's capabilities
###############################

set(JSONLDCPP_BUILD_EXAMPLES ON CACHE BOOL "Build example executables")
include (CheckCCompilerFlag)
include (CheckCXXCompilerFlag)

# Install
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
set (CMAKE_COMPILER_IS_CLANG true)
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
set (CMAKE_COMPILER_IS_MSVC true)
endif()

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG)
find_program (LINKER_BIN gold)
if(LINKER_BIN)
set(LINKER_BIN "gold")
else()
find_program (LINKER_BIN ld.gold)
if(LINKER_BIN)
set(LINKER_BIN "ld.gold")
else()
set(LINKER_BIN "ld")
endif()
endif()

if (CMAKE_COMPILER_IS_GNUCXX)
add_compile_options(-fdiagnostics-color=always)
elseif (CMAKE_COMPILER_IS_CLANG)
add_compile_options(-fcolor-diagnostics)
endif()

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wextra")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
#set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
#set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -fsanitize=address")

CHECK_CXX_COMPILER_FLAG("-fuse-ld=${LINKER_BIN}" USE_LINKER_LD_GOLD)
if(USE_LINKER_LD_GOLD)
set (CMAKE_SHARED_LINKER_FLAGS "-fuse-ld=${LINKER_BIN} ${CMAKE_SHARED_LINKER_FLAGS}")
endif()
endif()

set(INSTALL_JSONLDCPP ON CACHE BOOL "Enable installation")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

if (${CMAKE_HOST_SYSTEM_NAME} MATCHES "Darwin")
set(CMAKE_MACOSX_RPATH OFF)
endif()

message(STATUS "CMAKE_INSTALL_PREFIX: ${CMAKE_INSTALL_PREFIX}")
set (CMAKE_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_PREFIX}/include")
set (CMAKE_INSTALL_LIBDIR "${CMAKE_INSTALL_PREFIX}/lib")
set (CMAKE_INSTALL_BINDIR "${CMAKE_INSTALL_PREFIX}/bin")
message(STATUS "CMAKE_INSTALL_INCLUDEDIR: ${CMAKE_INSTALL_INCLUDEDIR}")
message(STATUS "CMAKE_INSTALL_LIBDIR: ${CMAKE_INSTALL_LIBDIR}")
message(STATUS "CMAKE_INSTALL_BINDIR: ${CMAKE_INSTALL_BINDIR}")

# Log settings

Expand All @@ -51,101 +138,27 @@ message(STATUS "JSONLDCPP_VERSION : " ${JSONLDCPP_VERSION})
message(STATUS "JSONLDCPP_BUILD_TESTS : " ${JSONLDCPP_BUILD_TESTS})
message(STATUS "JSONLDCPP_BUILD_EXAMPLES : " ${JSONLDCPP_BUILD_EXAMPLES})

message(STATUS "INSTALL_JSONLDCPP : " ${INSTALL_JSONLDCPP})
message(STATUS "CMAKE_BUILD_TYPE : " ${CMAKE_BUILD_TYPE})
message(STATUS "CMAKE_INSTALL_PREFIX : " ${CMAKE_INSTALL_PREFIX})
message(STATUS "CMAKE_TOOLCHAIN_FILE : " ${CMAKE_TOOLCHAIN_FILE})

message(STATUS "---------------------------------------------------")

if(NOT DEFINED CMAKE_INSTALL_PREFIX)
set(installDir ${CMAKE_CURRENT_BINARY_DIR}/install)
else()
set(installDir ${CMAKE_INSTALL_PREFIX})
endif()
message(STATUS "installDir : " ${installDir})


# Project

project(${JSONLDCPP_PROJECT} VERSION ${JSONLDCPP_VERSION}
DESCRIPTION "Digital Contract Design's C++ implementation of JSON-LD"
HOMEPAGE_URL "https://github.com/dcdpr/jsonld-cpp"
LANGUAGES CXX )


# Super build...
include(ExternalProject)

# Add subdirectories for external dependencies

ExternalProject_Add(cpr
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/external/cpr
INSTALL_DIR ${installDir}
CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DCPR_BUILD_TESTS=OFF
)

ExternalProject_Add(uriparser
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/external/uriparser
INSTALL_DIR ${installDir}
CMAKE_ARGS -DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DURIPARSER_BUILD_DOCS=OFF
-DURIPARSER_BUILD_TESTS=OFF
-DURIPARSER_BUILD_TOOLS=OFF
-DURIPARSER_BUILD_CHAR=ON
-DURIPARSER_BUILD_WCHAR_T=ON
-DURIPARSER_ENABLE_INSTALL=ON
)

ExternalProject_Add(http-link-header-cpp
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/external/http-link-header-cpp
GIT_REPOSITORY https://github.com/dcdpr/http-link-header-cpp.git
GIT_TAG origin/main
INSTALL_DIR ${installDir}
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
DEPENDS uriparser
)

# Add local subdirectories

ExternalProject_Add(jsonld-cpp-library
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/jsonld-cpp
INSTALL_DIR ${installDir}
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DJSONLDCPP_VERSION=${JSONLDCPP_VERSION}
-DINSTALL_JSONLDCPP=${INSTALL_JSONLDCPP}
-DJSONLDCPP_BUILD_TESTS=${JSONLDCPP_BUILD_TESTS}
-DJSONLDCPP_BUILD_GOOGLETEST=${JSONLDCPP_BUILD_GOOGLETEST}
-DJSONLDCPP_BUILD_RAPIDCHECK=${JSONLDCPP_BUILD_RAPIDCHECK}
DEPENDS uriparser http-link-header-cpp cpr
)

add_subdirectory(jsonld-cpp)
if(JSONLDCPP_BUILD_EXAMPLES)

ExternalProject_Add(jsonld-cpp-examples
SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/examples
INSTALL_DIR ${installDir}
CMAKE_ARGS -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}
-DCMAKE_PREFIX_PATH:PATH=<INSTALL_DIR>
-DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
-DJSONLDCPP_VERSION=${JSONLDCPP_VERSION}
INSTALL_COMMAND ""
DEPENDS jsonld-cpp-library
)

add_subdirectory(examples)
endif()

add_custom_target(
test
COMMAND ctest
WORKING_DIRECTORY jsonld-cpp-library-prefix/src/jsonld-cpp-library-build/test/testjsonld-cpp
DEPENDS jsonld-cpp-library)
if(JSONLDCPP_BUILD_TESTS)
enable_testing()
add_subdirectory(test)
else()
message(STATUS "Skipping unit tests")
endif()
15 changes: 11 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,17 @@ To build jsonld-cpp, you will need:
jsonld-cpp uses a pretty standard cmake build system:

```
mkdir build
cd build
cmake ..
make
mkdir build-dir && cd build-dir
conan install .. --build=missing
cmake -GNinja -DCMAKE_PREFIX_PATH=$(pwd) -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=$(pwd)/sysroot ..
ninja
ninja test
ninja install
```

To export the thirdparty with Conan:
```
conan create . jsonld-cpp/0.5.0@amazon/testing --build-require
```

You may run into permission issues during the build when the dependencies are
Expand Down
67 changes: 67 additions & 0 deletions conanfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
from conan import ConanFile
from conan.tools.cmake import CMake, CMakeToolchain, CMakeDeps

required_conan_version = ">=1.53.0"


class JsonLdCppConan(ConanFile):
name = "jsonld-cpp"
url = "https://github.com/dcdpr/jsonld-cpp"
description = "Open Source C library that provides a set of parsers and serializers that generate Resource Description Framework (RDF) triples by parsing syntaxes or serialize the triples into a syntax."
topics = "xml", "parser", "validation"
homepage = "https://librdf.org/raptor/"
license = "Apache License Version 2.0"

settings = "os", "arch", "compiler", "build_type"
default_options = {
"shared": False,
"fPIC": True
}
options = {name: [True, False] for name in default_options.keys()}
exports_sources = "*"

def configure(self):
#self.options["rapidcheck"].enable_gmock = True
self.options["rapidcheck"].enable_gtest = True

def requirements(self):
#self.requires("boost/1.81.0")
self.requires("nlohmann_json/3.11.2")

#self.requires("cpr/1.10.0", private=True)
#FIXME: Is this dependency just pulled for uriparser ? Is there a good reason to pull http-link-header-cpp ?
self.requires("http-link-header-cpp/0.9.0@amazon/testing", private=True)

self.requires("gtest/1.13.0", private=True, override=True)
self.requires("rapidcheck/cci.20220514", private=True)

def generate(self):
tc = CMakeToolchain(self)
tc.variables["JSONLDCPP_BUILD_EXAMPLES"] = True
tc.variables["JSONLDCPP_BUILD_TESTS"] = True
tc.variables["CMAKE_VERBOSE_MAKEFILE"] = True
tc.generate()
deps = CMakeDeps(self)
deps.generate()

def build(self):
cmake = CMake(self)
project_variables = {
"JSONLDCPP_BUILD_EXAMPLES": False,
"JSONLDCPP_BUILD_TESTS": False,
"CMAKE_VERBOSE_MAKEFILE": True,
}
cmake.configure(variables=project_variables)
cmake.build()
#FIXME: tests are failing
#cmake.test()

def package(self):
cmake = CMake(self)
cmake.install()

def package_info(self):
self.cpp_info.includedirs = ['include'] # Ordered list of include paths
self.cpp_info.libs = ["jsonld-cpp", ] # The libs to link against
self.cpp_info.system_libs = [] # System libs to link against
self.cpp_info.libdirs = ['lib'] # Directories where libraries can be found
17 changes: 17 additions & 0 deletions conanfile.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
[requires]
nlohmann_json/3.11.2
http-link-header-cpp/0.9.0@amazon/testing

[build_requires]
gtest/1.13.0
rapidcheck/cci.20220514

[generators]
cmake

[imports]
bin, *.dll -> ./bin # Copies all dll files from packages bin folder to my local "bin" folder
lib, *.dylib* -> ./lib # Copies all dylib files from packages lib folder to my local "lib" folder

[options]
rapidcheck:enable_gtest=True
41 changes: 17 additions & 24 deletions examples/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,24 +1,17 @@
cmake_minimum_required(VERSION 3.14 FATAL_ERROR)

project("jsonld-cpp-examples" VERSION ${JSONLDCPP_VERSION}
LANGUAGES CXX )

find_package(jsonld-cpp ${JSONLDCPP_VERSION} CONFIG REQUIRED)

add_executable(jsonld2rdf jsonld2rdf.cpp)

# Misc properties

target_compile_features(jsonld2rdf PRIVATE cxx_std_11)
set_target_properties(jsonld2rdf PROPERTIES CXX_EXTENSIONS OFF)

# Set version

target_compile_definitions(jsonld2rdf PRIVATE -DJSONLDCPP_VERSION_MAJOR=${JSONLDCPP_VERSION_MAJOR})
target_compile_definitions(jsonld2rdf PRIVATE -DJSONLDCPP_VERSION_MINOR=${JSONLDCPP_VERSION_MINOR})
target_compile_definitions(jsonld2rdf PRIVATE -DJSONLDCPP_VERSION_PATCH=${JSONLDCPP_VERSION_PATCH})

# Link

target_link_libraries(jsonld2rdf jsonld-cpp::jsonld-cpp)

set(TARGET_jsonld2rdf jsonld2rdf)

set(jsonld2rdf_src jsonld2rdf.cpp)
set_source_files_properties(${jsonld2rdf_src} PROPERTIES LANGUAGE "CXX")

add_executable(${TARGET_jsonld2rdf} ${jsonld2rdf_src})
target_compile_definitions(${TARGET_jsonld2rdf}
PRIVATE
-DJSONLDCPP_VERSION_MAJOR=${JSONLDCPP_VERSION_MAJOR}
-DJSONLDCPP_VERSION_MINOR=${JSONLDCPP_VERSION_MINOR}
-DJSONLDCPP_VERSION_PATCH=${JSONLDCPP_VERSION_PATCH})
target_link_libraries(${TARGET_jsonld2rdf} PRIVATE jsonld-cpp)

install(TARGETS ${TARGET_jsonld2rdf}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
Loading