diff --git a/.gitignore b/.gitignore index 177fed4..e352ffd 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/CMakeLists.txt b/CMakeLists.txt index eb56fdd..8b145b8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) @@ -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 @@ -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) + $ + $ + $ + $ + $ + $) if (APPLE AND BUILD_FRAMEWORK) set_target_properties(${PROJECT_NAME} PROPERTIES @@ -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() + diff --git a/INSTALL.txt b/INSTALL.txt new file mode 100644 index 0000000..829abe0 --- /dev/null +++ b/INSTALL.txt @@ -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 diff --git a/cmake/FindCapsImage.cmake b/cmake/FindCapsImage.cmake new file mode 100644 index 0000000..0de90cd --- /dev/null +++ b/cmake/FindCapsImage.cmake @@ -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) diff --git a/libcapsimage.pc.in b/libcapsimage.pc.in new file mode 100644 index 0000000..9159617 --- /dev/null +++ b/libcapsimage.pc.in @@ -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}