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

cmake build #119

Open
wants to merge 8 commits into
base: master
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
216 changes: 216 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,216 @@
cmake_minimum_required (VERSION 3.0.2)
project (cjose)

include(CheckSymbolExists)
include(CheckIncludeFile)
include(CheckTypeSize)

option(ENABLE_Tests "Turn on Tests" ON)
option(CJOSE_BUILD_SHARED_LIBS "Build shared libraries." OFF)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/CMakeModules")

# Build Release by default
if (NOT CMAKE_BUILD_TYPE)
set(CMAKE_BUILD_TYPE Release)
else()
endif()

# Setup cjose version
set(CJOSE_MAJOR_VERSION 0)
set(CJOSE_MINOR_VERSION 4)
set(CJOSE_PATCH_VERSION 1)
set(PACKAGE_VERSION ${CJOSE_MAJOR_VERSION}.${CJOSE_MINOR_VERSION}.${CJOSE_PATCH_VERSION})

# Set output directories
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)

# Create version.h file
configure_file (
"${PROJECT_SOURCE_DIR}/include/cjose/version.h.in"
"${PROJECT_BINARY_DIR}/include/cjose/version.h"
)

# Set include directories
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src/include
${CMAKE_CURRENT_SOURCE_DIR}/src
)

# Find dependencies
# Look for Homebrew version of OpenSSL
function(GetRootDirForHomebrew PKG_NAME)
if ((NOT ${PKG_NAME}_INCLUDE_DIR) OR (NOT ${PKG_NAME}_LIBRARIES))
string(TOLOWER ${PKG_NAME} PKG_NAME_LOWER)
SET(BREW_PACKAGE_DIR /usr/local/Cellar/${PKG_NAME_LOWER})
IF (EXISTS ${BREW_PACKAGE_DIR})
file(GLOB HB_${PKG_NAME}_ROOT_DIRECTORIES ${BREW_PACKAGE_DIR}/*)
list(GET HB_${PKG_NAME}_ROOT_DIRECTORIES 0 HB_${PKG_NAME}_ROOT_DIR)
if(HB_${PKG_NAME}_ROOT_DIRECTORIES AND NOT ${PKG_NAME}_ROOT_DIR)
SET(${PKG_NAME}_ROOT_DIR ${HB_${PKG_NAME}_ROOT_DIR} PARENT_SCOPE)
endif(HB_${PKG_NAME}_ROOT_DIRECTORIES AND NOT ${PKG_NAME}_ROOT_DIR)
ENDIF (EXISTS ${BREW_PACKAGE_DIR})
endif((NOT ${PKG_NAME}_INCLUDE_DIR) OR (NOT ${PKG_NAME}_LIBRARIES))
endfunction(GetRootDirForHomebrew PKG_NAME)

if(CMAKE_C_COMPILER_ID MATCHES "AppleClang")
GetRootDirForHomebrew(OPENSSL)
if (ENABLE_Tests)
GetRootDirForHomebrew(CHECK)
endif()
GetRootDirForHomebrew(JANSSON)
endif(CMAKE_C_COMPILER_ID MATCHES "AppleClang")

find_package(Check 0.9.4)

find_library(RT NAMES rt)
if (${RT} STREQUAL RT-NOTFOUND)
unset(${RT})
endif(${RT} STREQUAL RT-NOTFOUND)

find_library(M NAMES m)
if (${M} STREQUAL M-NOTFOUND)
unset(${M})
endif(${M} STREQUAL M-NOTFOUND)

check_type_size(ssize_t SSIZE_T)

# Enable test if possible
if (NOT CHECK_FOUND OR ENABLE_Tests==OFF)
SET(ENABLE_Tests OFF)
endif(NOT CHECK_FOUND OR ENABLE_Tests==OFF)
message(STATUS "Tests Enabled............${ENABLE_Tests}")

CHECK_SYMBOL_EXISTS("random" stdlib.h HAVE_RANDOM)

# Set dependency include directories
include_directories(
${OPENSSL_INCLUDE_DIR}
${JANSSON_INCLUDE_DIR}
${BUILD_INCLUDES}
)

#Generate config file
configure_file (
"${PROJECT_SOURCE_DIR}/include/cjose/config.h.in"
"${PROJECT_BINARY_DIR}/include/cjose/cjose_config.h"
)

# Setup compilation flags for different compilers
if (MSVC)
add_compile_options(/W2 /nologo /WX-)
add_definitions( "/DVERSION=\"${PACKAGE_VERSION}\"")
add_definitions( "/D_CRT_SECURE_NO_WARNINGS")
set(DEFAULT_COMPILER_OPTIONS /Zi /DEBUG $<$<CONFIG:Debug>:/Od> $<$<CONFIG:Release>:/O2> /MP )
set(LIB_COMPILER_OPTIONS ${DEFAULT_COMPILER_OPTIONS} /WX)
if (STATIC_CRT)
SET(LIB_COMPILER_OPTIONS ${LIB_COMPILER_OPTIONS} $<$<CONFIG:Debug>:/MTd> $<$<CONFIG:Release>:/MT>)
else()
SET(LIB_COMPILER_OPTIONS ${LIB_COMPILER_OPTIONS} $<$<CONFIG:Debug>:/MDd> $<$<CONFIG:Release>:/MD>)
endif()
elseif(CMAKE_COMPILER_IS_GNUCC)
add_definitions( "-DVERSION=\"${PACKAGE_VERSION}\"")
set(DEFAULT_COMPILER_OPTIONS -std=gnu99 -g $<$<CONFIG:Release>:-O2>)
set(LIB_COMPILER_OPTIONS ${DEFAULT_COMPILER_OPTIONS} --pedantic -Wall -Werror)
else(CMAKE_C_COMPILER_ID MATCHES "AppleClang")
add_definitions( "-DVERSION=\"${PACKAGE_VERSION}\"")
set(DEFAULT_COMPILER_OPTIONS -std=gnu99 -g $<$<CONFIG:Release>:-O2>)
set(LIB_COMPILER_OPTIONS ${DEFAULT_COMPILER_OPTIONS} --pedantic -Wall -Werror)
endif(MSVC)


file(GLOB CJOSE_SRC ${PROJECT_SOURCE_DIR}/src/*.c)
file(GLOB CJOSE_HDR_PUBLIC ${PROJECT_SOURCE_DIR}/include/cjose/*.h)
file(GLOB CJOSE_HDR_PRIVATE ${PROJECT_SOURCE_DIR}/src/include/*.h)

source_group("Library Sources" FILES ${CJOSE_SRC})
source_group("Library Private Headers" FILES ${CJOSE_HDR_PRIVATE})
source_group("Library Public Headers" FILES ${CJOSE_HDR_PUBLIC})

if (CJOSE_BUILD_SHARED_LIBS)
add_library(cjose SHARED
${CJOSE_SRC}
${CJOSE_HDR_PRIVATE}
${CJOSE_HDR_PUBLIC}
)
else()
add_library(cjose
${CJOSE_SRC}
${CJOSE_HDR_PRIVATE}
${CJOSE_HDR_PUBLIC}
)
endif()

target_link_libraries(cjose ${JANSSON_LIBRARIES} ${OPENSSL_LIBRARIES} ${MLIB} ${RTLIB})
target_compile_options(cjose PRIVATE ${LIB_COMPILER_OPTIONS})

if (ENABLE_Tests)
file(GLOB CJOSE_TESTS_SRC ${PROJECT_SOURCE_DIR}/test/*.c)
file(GLOB CJOSE_TESTS_HDR ${PROJECT_SOURCE_DIR}/test/*.h)
include_directories(${CHECK_INCLUDE_DIRS})
source_group("Test Files " FILES ${CJOSE_TESTS_SRC} ${CJOSE_TESTS_HDR})

add_executable(tests ${CJOSE_TESTS_SRC} ${CJOSE_TESTS_HDR})
target_compile_options(tests PRIVATE ${DEFAULT_COMPILER_OPTIONS})
target_link_libraries(tests cjose ${JANSSON_LIBRARIES} ${OPENSSL_LIBRARIES} ${CHECK_LIBRARIES})
endif(ENABLE_Tests)

#install

# Allow the user to override installation directories.
set(CJOSE_INSTALL_LIB_DIR lib CACHE PATH "Installation directory for libraries")
set(CJOSE_INSTALL_BIN_DIR bin CACHE PATH "Installation directory for executables")
set(CJOSE_INSTALL_INCLUDE_DIR include CACHE PATH "Installation directory for header files")


if(WIN32 AND NOT CYGWIN)
set(DEF_INSTALL_CMAKE_DIR cmake)
else()
set(DEF_INSTALL_CMAKE_DIR lib/cmake/cjose)
endif()

set(CJOSE_INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files")

# Create pkg-conf file.
# (We use the same files as ./configure does, so we
# have to defined the same variables used there).
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
set(libdir ${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_LIBDIR})
set(includedir ${CMAKE_INSTALL_PREFIX}/${CJOSE_INSTALL_INCLUDE_DIR})
set(VERSION ${PACKAGE_VERSION})
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cjose.pc.in
${CMAKE_CURRENT_BINARY_DIR}/cjose.pc @ONLY)

# Make sure the paths are absolute.
foreach(p LIB BIN INCLUDE CMAKE)
set(var CJOSE_INSTALL_${p}_DIR)
if(NOT IS_ABSOLUTE "${${var}}")
set(${var} "${CMAKE_INSTALL_PREFIX}/${${var}}")
endif()
endforeach()

set_target_properties(cjose PROPERTIES PUBLIC_HEADER "${CJOSE_HDR_PUBLIC}")


# Install the pkg-config.
install (FILES
${CMAKE_CURRENT_BINARY_DIR}/cjose.pc
DESTINATION ${CJOSE_INSTALL_LIB_DIR}/pkgconfig COMPONENT dev)

install(TARGETS cjose
EXPORT CjoseTargets
LIBRARY DESTINATION "${CJOSE_INSTALL_LIB_DIR}" COMPONENT lib
ARCHIVE DESTINATION "${CJOSE_INSTALL_LIB_DIR}" COMPONENT lib
RUNTIME DESTINATION "${CJOSE_INSTALL_BIN_DIR}" COMPONENT lib # Windows DLLs
PUBLIC_HEADER DESTINATION "${CJOSE_INSTALL_INCLUDE_DIR}/cjose" COMPONENT dev)

# Install exports for the install-tree.
install(EXPORT CjoseTargets
DESTINATION "${CJOSE_INSTALL_CMAKE_DIR}" COMPONENT dev)

# For use when simply using add_library from a parent project to build cjose.
set(CJOSE_LIBRARIES cjose CACHE STRING "Cjose libraries")
72 changes: 72 additions & 0 deletions CMakeModules/FindCheck.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
if (CHECK_LIBRARIES AND CHECK_INCLUDE_DIRS)
set(CHECK_FOUND TRUE)
else (CHECK_LIBRARIES AND CHECK_INCLUDE_DIRS)
find_path(CHECK_INCLUDE_DIR
NAMES
check.h
PATHS
${CHECK_ROOT_DIR}/include
NO_DEFAULT_PATH
)

find_path(CHECK_INCLUDE_DIR
NAMES
check.h
)

find_library(CHECK_LIBRARY_CHECK
NAMES
check
compat
PATHS
${CHECK_ROOT_DIR}/lib
NO_DEFAULT_PATH
)

find_library(CHECK_LIBRARY_CHECK
NAMES
check
compat
)

find_library(CHECK_LIBRARY_COMPAT
NAMES
compat
PATHS
${CHECK_ROOT_DIR}/lib
NO_DEFAULT_PATH
)

find_library(CHECK_LIBRARY_COMPAT
NAMES
compat
)

if (CHECK_INCLUDE_DIR)
set(CHECK_INCLUDE_DIRS
${CHECK_INCLUDE_DIRS}
${CHECK_INCLUDE_DIR}
)
endif(CHECK_INCLUDE_DIR)

if (CHECK_LIBRARY_CHECK)
set(CHECK_LIBRARIES
${CHECK_LIBRARIES}
${CHECK_LIBRARY_CHECK}
)
endif (CHECK_LIBRARY_CHECK)

if (CHECK_LIBRARY_COMPAT)
set(CHECK_LIBRARIES
${CHECK_LIBRARIES}
${CHECK_LIBRARY_COMPAT}
)
endif (CHECK_LIBRARY_COMPAT)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Check DEFAULT_MSG
CHECK_LIBRARIES CHECK_INCLUDE_DIRS)

mark_as_advanced(CHECK_INCLUDE_DIRS CHECK_LIBRARIES)

endif (CHECK_LIBRARIES AND CHECK_INCLUDE_DIRS)
68 changes: 68 additions & 0 deletions CMakeModules/FindJansson.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
if (JANSSON_LIBRARIES AND JANSSON_INCLUDE_DIRS)
set(JANSSON_FOUND TRUE)
else (JANSSON_LIBRARIES AND JANSSON_INCLUDE_DIRS)
find_path(JANSSON_INCLUDE_DIR
NAMES
jansson.h
PATHS
${JANSSON_ROOT_DIR}/include
NO_DEFAULT_PATH
)

find_path(JANSSON_INCLUDE_DIR
NAMES
jansson.h
)

find_library(JANSSON_LIBRARY_RELEASE
NAMES
jansson
PATHS
${JANSSON_ROOT_DIR}/lib
NO_DEFAULT_PATH
)

find_library(JANSSON_LIBRARY_RELEASE
NAMES
jansson
)

find_library(JANSSON_LIBRARY_DEBUG
NAMES
jansson_d
PATHS
${JANSSON_ROOT_DIR}/lib
NO_DEFAULT_PATH
)

find_library(JANSSON_LIBRARY_DEBUG
NAMES
jansson_d
)

set(JANSSON_INCLUDE_DIRS
${JANSSON_INCLUDE_DIR}
)

if (JANSSON_LIBRARY_DEBUG)
set(JANSSON_LIBRARIES
${JANSSON_LIBRARIES}
debug ${JANSSON_LIBRARY_DEBUG}
)
endif (JANSSON_LIBRARY_DEBUG)

if (JANSSON_LIBRARY_RELEASE)
if (WIN32)
set(JANSSON_LIBRARIES ${JANSSON_LIBRARIES} optimized ${JANSSON_LIBRARY_RELEASE})
else()
set(JANSSON_LIBRARIES ${JANSSON_LIBRARIES} general ${JANSSON_LIBRARY_RELEASE})
endif(WIN32)
endif (JANSSON_LIBRARY_RELEASE)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Jansson DEFAULT_MSG
JANSSON_LIBRARIES JANSSON_INCLUDE_DIRS)

mark_as_advanced(JANSSON_INCLUDE_DIRS JANSSON_LIBRARIES)

endif (JANSSON_LIBRARIES AND JANSSON_INCLUDE_DIRS)
1 change: 0 additions & 1 deletion include/cjose/cjose.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
#ifndef CJOSE_CJOSE_H
#define CJOSE_CJOSE_H

#include "version.h"
#include "error.h"
#include "base64.h"
#include "header.h"
Expand Down
14 changes: 14 additions & 0 deletions include/cjose/config.h.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#pragma once
#ifndef CONFIG_H
#define CONFIG_H

#cmakedefine HAVE_RANDOM

#cmakedefine HAVE_SSIZE_T

#ifndef HAVE_SSIZE_T
#undef ssize_t
typedef int ssize_t;
#endif

#endif
1 change: 1 addition & 0 deletions src/include/util_int.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#define SRC_UTIL_INT_H

#include <cjose/error.h>
#include <cjose/cjose_config.h>

#include <jansson.h>
#include <string.h>
Expand Down
2 changes: 1 addition & 1 deletion src/jwk.c
Original file line number Diff line number Diff line change
Expand Up @@ -1321,7 +1321,7 @@ _decode_json_object_base64url_attribute(json_t *jwk_json, const char *key, uint8
for (end = str + strlen(str) - 1; *end == '=' && end > str; --end)
;
size_t unpadded_len = end + 1 - str - ((*end == '=') ? 1 : 0);
size_t expected_len = ceil(4 * ((float)*buflen / 3));
size_t expected_len = (size_t)ceil(4 * ((float)*buflen / 3));

if (expected_len != unpadded_len)
{
Expand Down