Skip to content
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
12 changes: 12 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,15 @@ Thumbs.db
/out
/CMakeSettings.json
/Releases
CMakeCache.txt
CMakeFiles/
Makefile
libcapsimage.pc
libcapsimage.so
libcapsimage.lib
libcapsimage.so.*
cmake_install.cmake
install_manifest.txt
CapsLibVersion.h
config.h
_deps/
66 changes: 48 additions & 18 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,12 +1,25 @@
cmake_minimum_required(VERSION 3.3)
project(capsimage)

set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
INCLUDE(GNUInstallDirs)
include(FindPkgConfig)

# set project title
set(PROJECT_TITLE CAPSImage)
set(PROJECT_TITLE_WIN32 CAPSImg)

# set and configure version
set(MAJOR_VERSION 5)
set(MINOR_VERSION 1)
set(PROJECT_VERSION ${MAJOR_VERSION}.${MINOR_VERSION})

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/LibIPF/CapsLibVersion.h.in ${CMAKE_BINARY_DIR}/CapsLibVersion.h)

# set description
set(PROJECT_DESCRIPTION "CAPSImage IPF/SPS decoder library written in C++")

# set default options
option(BUILD_SHARED_LIBS "Build a dynamic library instead of static library" ON)

if (APPLE)
Expand All @@ -18,17 +31,13 @@ endif()
option(ADD_INCLUDE_SUFFIX "Add major version suffix to include directory" OFF)
if (ADD_INCLUDE_SUFFIX)
set(INCLUDE_SUFFIX ${MAJOR_VERSION})
message(STATUS "Using '${INCLUDE_SUFFIX}' suffix on include directory")
message(STATUS "${PROJECT_TITLE} ${PROJECT_VERSION} include directory suffix: '${INCLUDE_SUFFIX}'")
endif()

include(CheckStructHasMember)
CHECK_STRUCT_HAS_MEMBER("struct dirent" d_type dirent.h HAVE_STRUCT_DIRENT_D_TYPE LANGUAGE CXX)

file(GLOB SOURCES src/Core/*.cpp src/CAPSImg/*.cpp src/Codec/*.cpp)
file(GLOB HEADERS src/Core/*.h src/CAPSImg/*.h src/Codec/*.h src/Device/*.h)
file(GLOB API_HEADERS src/LibIPF/*.h;src/Core/CommonTypes.h)
set(API_HEADERS ${API_HEADERS} ${CMAKE_BINARY_DIR}/CapsLibVersion.h)

add_library(${PROJECT_NAME} ${SOURCES} ${HEADERS} ${API_HEADERS})

set_target_properties(${PROJECT_NAME} PROPERTIES
Expand All @@ -38,11 +47,12 @@ set_target_properties(${PROJECT_NAME} PROPERTIES

target_include_directories(${PROJECT_NAME} PRIVATE
${CMAKE_BINARY_DIR}
src/LibIPF
src/CAPSImg
src/Core
src/Codec
src/Device)
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/LibIPF>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/CAPSImg>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/Core>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/Codec>
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/src/Device>)

if (APPLE AND BUILD_FRAMEWORK)
set_target_properties(${PROJECT_NAME} PROPERTIES
Expand All @@ -56,21 +66,41 @@ if (APPLE AND BUILD_FRAMEWORK)
endif()

if (WIN32)
include(FetchContent)
FetchContent_Declare(
dirent
GIT_REPOSITORY http://github.com/tronkko/dirent
GIT_TAG master
)

FetchContent_MakeAvailable(dirent)

set_target_properties(${PROJECT_NAME} PROPERTIES OUTPUT_NAME ${PROJECT_TITLE_WIN32})
target_include_directories(${PROJECT_NAME} PRIVATE src/Compatibility)
target_include_directories( ${PROJECT_NAME} PRIVATE
${dirent_SOURCE_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}/src/Compatibility/dirent/include)
endif()

include(CheckStructHasMember)
CHECK_STRUCT_HAS_MEMBER("struct dirent" d_type dirent.h HAVE_STRUCT_DIRENT_D_TYPE LANGUAGE CXX)

configure_file(src/config.h.in ${CMAKE_BINARY_DIR}/config.h)
configure_file(src/LibIPF/CapsLibVersion.h.in ${CMAKE_BINARY_DIR}/CapsLibVersion.h)
target_compile_definitions(${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1)
set(ENV{PKG_CONFIG_PATH} "${PROJECT_BINARY_DIR}:$ENV{PKG_CONFIG_PATH}")
configure_file(lib${PROJECT_NAME}.pc.in ${PROJECT_BINARY_DIR}/lib${PROJECT_NAME}.pc @ONLY)

install(TARGETS ${PROJECT_NAME}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
install(TARGETS ${PROJECT_NAME} EXPORT ${PROJECT_NAME}Config
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
FRAMEWORK DESTINATION "/Library/Frameworks"
PUBLIC_HEADER DESTINATION include/caps${INCLUDE_SUFFIX})
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/caps${INCLUDE_SUFFIX})

# install pkgconfig and cmake files
install(FILES ${PROJECT_BINARY_DIR}/lib${PROJECT_NAME}.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig/)
install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cmake/FindCapsImage.cmake DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/)

if (NOT APPLE OR NOT BUILD_FRAMEWORK)
install(FILES ${API_HEADERS} DESTINATION include/caps${INCLUDE_SUFFIX})
install(FILES ${API_HEADERS} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/caps${INCLUDE_SUFFIX})
endif()

6 changes: 6 additions & 0 deletions INSTALL.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
To build and install CAPSImage on UNIX-like CMake systems run:

cmake -DADD_INCLUDE_SUFFIX=ON . && make install

Most projects and coexisting different versions expect the suffix
to be enabled
80 changes: 80 additions & 0 deletions cmake/FindCapsImage.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
INCLUDE(CheckLibraryExists)
INCLUDE(FindPackageHandleStandardArgs)
INCLUDE(GNUInstallDirs)
INCLUDE(FindPkgConfig)

SET(CapsImage_FOUND FALSE)

SET(CAPSIMAGE_INCLUDE_HINTS ${CMAKE_INSTALL_INCLUDEDIR})
SET(CAPSIMAGE_LIB_HINTS ${CMAKE_INSTALL_LIBDIR})
SET(CAPSIMAGE_VERSION_HINTS 5.1)

option(ADD_INCLUDE_SUFFIX "Add major version suffix to include directory" ON)
if (ADD_INCLUDE_SUFFIX)
string(REGEX REPLACE "^([0-9]+).([0-9]+)$" "\\1" CapsImage_INCLUDE_PATH_SUFFIX "${CAPSIMAGE_VERSION_HINTS}")
endif()

find_package(PkgConfig)
IF(PKG_CONFIG_FOUND)
PKG_SEARCH_MODULE(CapsImage libcapsimage QUIET)
IF(CAPSIMAGE_INCLUDE_DIRS)
SET(CAPSIMAGE_INCLUDE_HINTS ${CAPSIMAGE_INCLUDE_DIRS})
ENDIF()
IF(CAPSIMAGE_LIBRARY_DIRS)
SET(CAPSIMAGE_LIBRARY_HINTS ${CAPSIMAGE_LIBRARY_DIRS})
ENDIF()
IF(CAPSIMAGE_VERSION)
SET(CAPSIMAGE_VERSION_HINTS ${CAPSIMAGE_VERSION})
if (ADD_INCLUDE_SUFFIX)
string(REGEX REPLACE "^([0-9]+).([0-9]+)$" "\\1" CapsImage_INCLUDE_PATH_SUFFIX "${CAPSIMAGE_VERSION_HINTS}")
endif()
ENDIF()
ENDIF()

FIND_FILE(CAPSIMAGE_VERSION_HEADER NAMES CapsLibVersion.h HINTS ${CAPSIMAGE_INCLUDE_HINTS} PATH_SUFFIXES caps${CapsImage_INCLUDE_PATH_SUFFIX} caps)
IF(CAPSIMAGE_VERSION_HEADER_FOUND)
file(STRINGS "${CAPSIMAGE_VERSION_HEADER}" CAPSIMAGE_VERSION_RELEASE_LINE REGEX "^#define[ \t]+CAPS_LIB_RELEASE[ \t]+[0-9]+$")
file(STRINGS "${CAPSIMAGE_VERSION_HEADER}" CAPSIMAGE_VERSION_REVISION_LINE REGEX "^#define[ \t]+CAPS_LIB_REVISION[ \t]+[0-9]+$")
string(REGEX REPLACE "^#define[ \t]+CAPS_LIB_RELEASE[ \t]+([0-9]+)$" "\\1" CAPSIMAGE_VERSION_RELEASE "${CAPSIMAGE_VERSION_REALEASE_LINE}")
string(REGEX REPLACE "^#define[ \t]+CAPS_LIB_REVISION[ \t]+([0-9]+)$" "\\1" CAPSIMAGE_VERSION_REVISION "${CAPSIMAGE_VERSION_REVISION_LINE}")
unset(CAPSIMAGE_VERSION_RELEASE_LINE)
unset(CAPSIMAGE_VERSION_REVISION_LINE)
SET(CAPSIMAGE_VERSION ${CAPSIMAGE_VERSION_RELEASE}.${CAPSIMAGE_VERSION_REVISION})
SET(CAPSIMAGE_VERSION_STRING "${CAPSIMAGE_VERSION}")
IF(ADD_INCLUDE_SUFFIX)
SET(CapsImage_INCLUDE_PATH_SUFFIX "${CAPSIMAGE_VERSION_RELEASE}")
ENDIF()
ELSEIF(CAPSIMAGE_VERSION_HINTS)
string(REGEX REPLACE "^([0-9]+).([0-9]+)$" "\\1" CAPSIMAGE_VERSION_RELEASE "${CAPSIMAGE_VERSION_HINTS}")
string(REGEX REPLACE "^([0-9]+).([0-9]+)$" "\\2" CAPSIMAGE_VERSION_REVISION "${CAPSIMAGE_VERSION_HINTS}")
SET(CAPSIMAGE_VERSION ${CAPSIMAGE_VERSION_RELEASE}.${CAPSIMAGE_VERSION_REVISION})
SET(CAPSIMAGE_VERSION_STRING "${CAPSIMAGE_VERSION}")
IF(ADD_INCLUDE_SUFFIX)
SET(CapsImage_INCLUDE_PATH_SUFFIX "${CAPSIMAGE_VERSION_RELEASE}")
ENDIF()
ENDIF()
if(ADD_INCLUDE_SUFFIX)
message(STATUS "Using '${CapsImage_INCLUDE_PATH_SUFFIX}' suffix on include directory")
endif()

FIND_PATH(CAPSIMAGE_INCLUDE_DIR NAMES CapsLibAll.h HINTS ${CAPSIMAGE_INCLUDE_HINTS} PATH_SUFFIXES caps${CapsImage_INCLUDE_PATH_SUFFIX} caps)
FIND_LIBRARY(CAPSIMAGE_LIBRARY NAMES capsimage HINTS ${CAPSIMAGE_LIBRARY_HINTS} PATH_SUFFIXES lib capsimg capsimage)

MARK_AS_ADVANCED(CAPSIMAGE_LIBRARY CAPSIMAGE_INCLUDE_DIR CAPSIMAGE_VERSION CAPSIMAGE_VERSION_RELEASE CAPSIMAGE_VERSION_REVISION)

FIND_PACKAGE_HANDLE_STANDARD_ARGS(CapsImage DEFAULT_MSG
CAPSIMAGE_LIBRARY CAPSIMAGE_INCLUDE_DIR CAPSIMAGE_VERSION CAPSIMAGE_VERSION_RELEASE CAPSIMAGE_VERSION_REVISION)

if(CAPSIMAGE_FOUND)
set(CAPSIMAGE_LIBRARIES ${CAPSIMAGE_LIBRARY})
set(CAPSIMAGE_INCLUDE_DIRS ${CAPSIMAGE_INCLUDE_DIR})
if(NOT TARGET SPS::CapsImage)
add_library(SPS::CapsImage INTERFACE IMPORTED)
set_target_properties(SPS::CapsImage PROPERTIES
INTERFACE_INCLUDE_DIRECTORIES "${CAPSIMAGE_INCLUDE_DIR}"
INTERFACE_LINK_LIBRARIES "${CAPSIMAGE_LIBRARY}"
VERSION "${CAPSIMAGE_VERSION}")
endif()
endif()

unset(_cmake_find_capsimage_output)
13 changes: 13 additions & 0 deletions libcapsimage.pc.in
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
prefix=@CMAKE_INSTALL_PREFIX@
exe_prefix=${prefix}
libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@
includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@
include_suffix=@INCLUDE_SUFFIX@

Name: lib@PROJECT_NAME@
Description: @PROJECT_DESCRIPTION@
Version: @PROJECT_VERSION@

Requires:
Libs: -L${libdir} -l@PROJECT_NAME@
Cflags: -I${includedir} -I${includedir}/caps${include_suffix}