diff --git a/CMakeLists.txt b/CMakeLists.txt index f892b5a47..7f18205a6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -69,6 +69,8 @@ if(ENABLE_LIBRETRO) "ENABLE_LIBRETRO is enabled but ${LIBRETRO_INCLUDE_DIR}/libretro.h was not found" ) endif() + + include(cmake/BuildDependencies.cmake) endif() find_path(LIBRETRO_INCLUDE_DIR libretro.h diff --git a/cmake/BuildDependencies.cmake b/cmake/BuildDependencies.cmake new file mode 100644 index 000000000..2a7ca143d --- /dev/null +++ b/cmake/BuildDependencies.cmake @@ -0,0 +1,226 @@ +include(FetchContent) + +option(ENABLE_STATIC_SDL2 + "Build and statically link SDL2" + OFF) + +option(ENABLE_STATIC_ZLIB + "Build and statically link zlib" + OFF) + +option(ENABLE_STATIC_CAPSIMAGE + "Build and statically link CapsImg" + OFF) + +# SDL2 +if(ENABLE_STATIC_SDL2) + set(SDL_SHARED OFF CACHE BOOL "" FORCE) + set(SDL_STATIC ON CACHE BOOL "" FORCE) + set(SDL_TESTS OFF CACHE BOOL "" FORCE) + set(SDL_TEST_LIBRARY OFF CACHE BOOL "" FORCE) + set(SDL_EXAMPLES OFF CACHE BOOL "" FORCE) + set(SDL_UNINSTALL OFF CACHE BOOL "" FORCE) + + FetchContent_Declare( + SDL2 + GIT_REPOSITORY https://github.com/libsdl-org/SDL.git + GIT_TAG release-2.32.8 + GIT_SHALLOW TRUE + ) + + FetchContent_MakeAvailable(SDL2) + + if(TARGET SDL2::SDL2-static) + set(SDL2_LIBRARIES SDL2::SDL2-static) + get_target_property(SDL2_INCLUDE_DIRS + SDL2::SDL2-static + INTERFACE_INCLUDE_DIRECTORIES) + elseif(TARGET SDL2-static) + set(SDL2_LIBRARIES SDL2-static) + get_target_property(SDL2_INCLUDE_DIRS + SDL2-static + INTERFACE_INCLUDE_DIRECTORIES) + else() + message(FATAL_ERROR "SDL2 static target was not created") + endif() + + include_directories(${SDL2_INCLUDE_DIRS}) +endif() + +# zlib +if(ENABLE_STATIC_ZLIB) + + set(ZLIB_BUILD_SHARED OFF CACHE BOOL "" FORCE) + + FetchContent_Declare( + zlib + GIT_REPOSITORY https://github.com/madler/zlib.git + GIT_TAG v1.3.1 + GIT_SHALLOW TRUE + ) + + FetchContent_MakeAvailable(zlib) + + if(TARGET zlibstatic) + + set(ZLIB_LIBRARY zlibstatic) + + if(NOT LIBRETRO_STATIC) + set_target_properties(zlibstatic PROPERTIES + POSITION_INDEPENDENT_CODE TRUE + ) + endif() + + if(NOT TARGET ZLIB::ZLIB) + add_library(ZLIB::ZLIB ALIAS zlibstatic) + endif() + + elseif(TARGET zlib) + + set(ZLIB_LIBRARY zlib) + + else() + + message(FATAL_ERROR "zlib static target was not created") + + endif() + + set(ZLIB_FOUND TRUE) + set(HAVE_LIBZ 1) + set(HAVE_ZLIB_H 1) +endif() + +# CapsImg +if(ENABLE_STATIC_CAPSIMAGE) + + message(STATUS "Building CapsImg statically") + + enable_language(CXX) + + FetchContent_Declare( + capsimg + GIT_REPOSITORY https://github.com/rsn8887/capsimg.git + GIT_TAG c92d17b4383ebf432788f7b5a38fdd6902376f00 + GIT_SHALLOW TRUE + ) + + if(POLICY CMP0169) + cmake_policy(SET CMP0169 OLD) + endif() + + FetchContent_Populate(capsimg) + + set(CAPSIMAGE_SOURCES + ${capsimg_SOURCE_DIR}/Codec/CTRawCodec.cpp + ${capsimg_SOURCE_DIR}/Codec/CTRawCodecDecompressor.cpp + ${capsimg_SOURCE_DIR}/Codec/DiskEncoding.cpp + + ${capsimg_SOURCE_DIR}/Core/BaseFile.cpp + ${capsimg_SOURCE_DIR}/Core/BitBuffer.cpp + ${capsimg_SOURCE_DIR}/Core/CRC.cpp + ${capsimg_SOURCE_DIR}/Core/DiskFile.cpp + ${capsimg_SOURCE_DIR}/Core/MemoryFile.cpp + + ${capsimg_SOURCE_DIR}/CAPSImg/CapsAPI.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsFDCEmulator.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsFile.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsFormatMFM.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsImage.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsImageStd.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/CapsLoader.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/DiskImage.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/DiskImageFactory.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/stdafx.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/StreamCueImage.cpp + ${capsimg_SOURCE_DIR}/CAPSImg/StreamImage.cpp + ) + + add_library(capsimage STATIC ${CAPSIMAGE_SOURCES}) + + set_target_properties(capsimage PROPERTIES + LINKER_LANGUAGE CXX + ) + + if(NOT LIBRETRO_STATIC) + set_target_properties(capsimage PROPERTIES + POSITION_INDEPENDENT_CODE TRUE + ) + endif() + + set(CAPSIMAGE_GENERATED_INCLUDE_DIR + ${CMAKE_CURRENT_BINARY_DIR}/capsimage/include + ) + + set(CAPSIMAGE_CAPS_INCLUDE_DIR + ${CAPSIMAGE_GENERATED_INCLUDE_DIR}/caps + ) + + file(MAKE_DIRECTORY + ${CAPSIMAGE_CAPS_INCLUDE_DIR} + ) + + file(GLOB CAPSIMAGE_LIBIPF_HEADERS + ${capsimg_SOURCE_DIR}/LibIPF/*.h + ) + + file(COPY + ${CAPSIMAGE_LIBIPF_HEADERS} + DESTINATION ${CAPSIMAGE_CAPS_INCLUDE_DIR} + ) + + file(READ ${capsimg_SOURCE_DIR}/Core/CommonTypes.h CAPSIMAGE_COMMONTYPES) + string(REPLACE + "typedef int8_t BYTE;" + "#ifndef _WIN32\ntypedef int8_t BYTE;" + CAPSIMAGE_COMMONTYPES "${CAPSIMAGE_COMMONTYPES}") + string(REPLACE + "typedef int32_t DWORD;" + "typedef int32_t DWORD;\n#endif" + CAPSIMAGE_COMMONTYPES "${CAPSIMAGE_COMMONTYPES}") + file(WRITE + ${CAPSIMAGE_CAPS_INCLUDE_DIR}/CommonTypes.h + "#include \n${CAPSIMAGE_COMMONTYPES}" + ) + + target_include_directories(capsimage + PUBLIC + ${CAPSIMAGE_GENERATED_INCLUDE_DIR} + ${capsimg_SOURCE_DIR}/LibIPF + ${capsimg_SOURCE_DIR}/Core + ${capsimg_SOURCE_DIR}/Codec + ${capsimg_SOURCE_DIR}/Device + ${capsimg_SOURCE_DIR}/CAPSImg + ) + + if(WIN32) + set(CAPSIMAGE_CONFIG_INCLUDE_DIR ${CMAKE_CURRENT_BINARY_DIR}/capsimage/config) + file(MAKE_DIRECTORY ${CAPSIMAGE_CONFIG_INCLUDE_DIR}) + + file(READ ${capsimg_SOURCE_DIR}/CAPSImg/config.h CAPSIMAGE_CONFIG) + string(REPLACE + "#define HAVE_STRUCT_DIRENT_D_TYPE 1" + "/* #undef HAVE_STRUCT_DIRENT_D_TYPE */ /* mingw's dirent has no d_type */" + CAPSIMAGE_CONFIG "${CAPSIMAGE_CONFIG}") + file(WRITE ${CAPSIMAGE_CONFIG_INCLUDE_DIR}/config.h "${CAPSIMAGE_CONFIG}") + + target_include_directories(capsimage BEFORE + PRIVATE + ${CAPSIMAGE_CONFIG_INCLUDE_DIR} + ) + endif() + + set(CAPSIMAGE_LIBRARY capsimage) + set(CAPSIMAGE_INCLUDE_DIR + ${CAPSIMAGE_GENERATED_INCLUDE_DIR} + ${capsimg_SOURCE_DIR}/CAPSImg + ) + set(CapsImage_FOUND TRUE) + set(HAVE_CAPSIMAGE 1) +endif() + +message(STATUS "") +message(STATUS "Built dependencies:") +message(STATUS " SDL2: ${SDL2_LIBRARIES}") +message(STATUS " zlib: ${ZLIB_LIBRARY}") +message(STATUS " CapsImg: ${CAPSIMAGE_LIBRARY}") +message(STATUS "")