diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..ba3171d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,79 @@ +cmake_minimum_required(VERSION 3.16) +project(Libcjpg VERSION 1.5.30 LANGUAGES C) +find_package(Gint 2.7.1 REQUIRED) + +set(SOURCES + jcapimin.c + jcapistd.c + jdapimin.c + jdapistd.c + jcomapi.c + jcparam.c + jctrans.c + jdtrans.c + jcinit.c + jcmaster.c + jcmainct.c + jcprepct.c + jccoefct.c + jccolor.c + jcsample.c + jcdctmgr.c + jfdctint.c + jfdctfst.c + jfdctflt.c + jchuff.c + jcarith.c + jcmarker.c + jdatadst.c + jdmaster.c + jdinput.c + jdmainct.c + jdcoefct.c + jdpostct.c + jdmarker.c + jdhuff.c + jdarith.c + jddctmgr.c + jidctint.c + jidctfst.c + jidctflt.c + jdsample.c + jdcolor.c + jdmerge.c + jquant1.c + jquant2.c + jdatasrc.c + jaricom.c + jerror.c + jmemmgr.c + jutils.c + jmemname.c +) +include_directories( + "${PROJECT_SOURCE_DIR}" + "${PROJECT_BINARY_DIR}/include" + "${FXSDK_COMPILER_INSTALL}/include" + "${FXSDK_COMPILER_INSTALL}/include/openlibm") +add_compile_options(-Os -lm -m4-nofpu -mb -std=c11 -ffreestanding -nostdlib -Wa,--dsp) +# Target name is "cJPG", output file is "libcJPG.a" (by default) +add_library(cJPG STATIC ${SOURCES}) +# After building, install the target (that is, libcJPG.a) in the compiler +install(TARGETS cPNG + DESTINATION "${FXSDK_COMPILER_INSTALL}") +# Install jpeglib.h from the build dir +install(FILES "${PROJECT_SOURCE_DIR}/jpeglib.h" + DESTINATION "${FXSDK_COMPILER_INSTALL}/include") +# Install jconfig.h from the build dir +install(FILES "${PROJECT_SOURCE_DIR}/jconfig.h" + DESTINATION "${FXSDK_COMPILER_INSTALL}/include") +# Install jmorecfg.h from the build dir +install(FILES "${PROJECT_SOURCE_DIR}/jmorecfg.h" + DESTINATION "${FXSDK_COMPILER_INSTALL}/include") +# Install jerror.h from the build dir +install(FILES "${PROJECT_SOURCE_DIR}/jerror.h" + DESTINATION "${FXSDK_COMPILER_INSTALL}/include") +# Install FindcPNG.cmake so that users can do find_package(LibcPNG) +install(FILES cmake/FindcJPG.cmake + DESTINATION "${FXSDK_CMAKE_MODULE_PATH}") + diff --git a/cmake/FindcJPG.cmake b/cmake/FindcJPG.cmake new file mode 100644 index 0000000..2ab6af5 --- /dev/null +++ b/cmake/FindcJPG.cmake @@ -0,0 +1,49 @@ +find_package(Gint 2.7 REQUIRED) +# Find libexample.a; if we had platform-specific versions we could look for +# libexample-${FXSDK_PLATFORM}.a instead. +execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=libcJPG.a + OUTPUT_VARIABLE EX_PATH OUTPUT_STRIP_TRAILING_WHITESPACE) +# EX_PATH is now the full path if libustl.a exists, "libustl.a" otherwise +if(NOT "${EX_PATH}" STREQUAL "libcPNG.a") + # Find the version.h header + execute_process( + COMMAND ${CMAKE_C_COMPILER} -print-file-name=include/jconfig.h + OUTPUT_VARIABLE EX_CONFIG OUTPUT_STRIP_TRAILING_WHITESPACE) + # Extract version information from the config.h header. This command prints + # the version on the line matching the regex and deletes every other line. + execute_process( + COMMAND sed -E "s/#define.*EX_VERSION\\s+\"(\\S+)\"$/\\1/p; d" ${EX_CONFIG} + OUTPUT_VARIABLE EX_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE) +endif() +# The commands above seem common for gint libraries, so the fxSDK provides a +# helper function to get that directly. We simply provide the archive name, +# header file name, macro name, and names for output variables. +# include(FindSimpleLibrary) +# find_simple_library(libexample.a include/example/config.h "EX_VERSION" +# PATH_VAR EX_PATH VERSION_VAR EX_VERSION) +# This CMake utility will handle the version comparisons and other checks. We +# just specify: +# -> Some variables that are defined only if the library is found (so if +# they're undefined, CMake will conclude libexample was not found) +# -> The version, so CMake can compare with the user's requested one +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(libcJPG + REQUIRED_VARS EX_CONFIG EX_VERSION + VERSION_VAR EX_VERSION) +# We now have a LibExample_FOUND variable, let's create the target that users +# can link against with target_link_libraries() +if(LibcJPG_FOUND) + # This is an imported target, we don't build it, we just claim it's here + add_library(libcJPG::libcJPG UNKNOWN IMPORTED) + # Here we declare the compiler and linker flags that every user of LibExample + # needs to use. + set_target_properties(libcJPG::libcJPG PROPERTIES + # If we specify where the library comes from, CMake will watch that file + # and relink any user application when the library is updated! + IMPORTED_LOCATION "${EX_PATH}" + # Linking options + INTERFACE_LINK_OPTIONS -lcJPG + # Dependencies (for order on the command-line) + IMPORTED_LINK_INTERFACE_LIBRARIES Gint::Gint) +endif()