# cmake/ThirdParty.cmake include("${CMAKE_CURRENT_LIST_DIR}/FetchDependencies.cmake") macro(log msg) message(STATUS "[ThirdParty] ${msg}") endmacro() set(BUILD_CONFIGS Debug Release) # =========================================== # 1) ZLIB (zlib131.zip → zlib-1.3.1) - без изменений # =========================================== set(ZLIB_SRC_DIR "${THIRDPARTY_DIR}/zlib-1.3.1") set(ZLIB_BUILD_DIR "${ZLIB_SRC_DIR}/build") set(ZLIB_INSTALL_DIR "${ZLIB_SRC_DIR}/install") file(MAKE_DIRECTORY "${ZLIB_BUILD_DIR}") # проверяем, собран ли уже zlib set(_have_zlib FALSE) foreach(candidate "${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib" ) if(EXISTS "${candidate}") set(_have_zlib TRUE) break() endif() endforeach() if(NOT _have_zlib) log("Configuring zlib ...") execute_process( COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S "${ZLIB_SRC_DIR}" -B "${ZLIB_BUILD_DIR}" -DCMAKE_INSTALL_PREFIX=${ZLIB_INSTALL_DIR} RESULT_VARIABLE _zlib_cfg_res ) if(NOT _zlib_cfg_res EQUAL 0) message(FATAL_ERROR "zlib configure failed") endif() foreach(cfg IN LISTS BUILD_CONFIGS) log("Building ZLIB (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --build "${ZLIB_BUILD_DIR}" --config ${cfg} RESULT_VARIABLE _zlib_build_res ) if(NOT _zlib_build_res EQUAL 0) message(FATAL_ERROR "ZLIB build failed for configuration ${cfg}") endif() log("Installing ZLIB (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --install "${ZLIB_BUILD_DIR}" --config ${cfg} RESULT_VARIABLE _zlib_inst_res ) if(NOT _zlib_inst_res EQUAL 0) message(FATAL_ERROR "ZLIB install failed for configuration ${cfg}") endif() endforeach() endif() # ИСПРАВЛЕНИЕ: Используем свойства для конкретных конфигураций add_library(zlib_external_lib UNKNOWN IMPORTED GLOBAL) set_target_properties(zlib_external_lib PROPERTIES # Динамическая линковка (если zlib.lib - это импорт-библиотека для zlibd.dll) #IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zlibd.lib" #IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlib.lib" # Можно также указать статические библиотеки, если вы хотите их использовать IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zlibstaticd.lib" IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib" INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INSTALL_DIR}/include" ) # =========================================== # 2) SDL2 (release-2.32.10.zip → SDL-release-2.32.10) - без изменений # =========================================== set(SDL2_SRC_DIR "${THIRDPARTY_DIR}/SDL-release-2.32.10") set(SDL2_BUILD_DIR "${SDL2_SRC_DIR}/build") set(SDL2_INSTALL_DIR "${SDL2_SRC_DIR}/install") file(MAKE_DIRECTORY "${SDL2_BUILD_DIR}") set(_have_sdl2 FALSE) foreach(candidate "${SDL2_INSTALL_DIR}/lib/SDL2.lib" "${SDL2_INSTALL_DIR}/lib/SDL2-static.lib" "${SDL2_INSTALL_DIR}/lib/SDL2d.lib" ) if(EXISTS "${candidate}") set(_have_sdl2 TRUE) break() endif() endforeach() if(NOT _have_sdl2) log("Configuring SDL2 ...") execute_process( COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S "${SDL2_SRC_DIR}" -B "${SDL2_BUILD_DIR}" -DCMAKE_INSTALL_PREFIX=${SDL2_INSTALL_DIR} -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} # путь к zlib для SDL2 RESULT_VARIABLE _sdl_cfg_res ) if(NOT _sdl_cfg_res EQUAL 0) message(FATAL_ERROR "SDL2 configure failed") endif() # --- ИЗМЕНЕНИЕ: Цикл по конфигурациям Debug и Release --- foreach(cfg IN LISTS BUILD_CONFIGS) log("Building SDL2 (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --build "${SDL2_BUILD_DIR}" --config ${cfg} RESULT_VARIABLE _sdl_build_res ) if(NOT _sdl_build_res EQUAL 0) message(FATAL_ERROR "SDL2 build failed for configuration ${cfg}") endif() log("Installing SDL2 (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --install "${SDL2_BUILD_DIR}" --config ${cfg} RESULT_VARIABLE _sdl_inst_res ) if(NOT _sdl_inst_res EQUAL 0) message(FATAL_ERROR "SDL2 install failed for configuration ${cfg}") endif() endforeach() # ------------------------------------------------------ endif() # ИСПРАВЛЕНИЕ: SDL2: Используем свойства для конкретных конфигураций add_library(SDL2_external_lib UNKNOWN IMPORTED GLOBAL) set_target_properties(SDL2_external_lib PROPERTIES # Динамическая линковка SDL2 IMPORTED_LOCATION_DEBUG "${SDL2_INSTALL_DIR}/lib/SDL2d.lib" IMPORTED_LOCATION_RELEASE "${SDL2_INSTALL_DIR}/lib/SDL2.lib" # Оба include-пути: и include, и include/SDL2 INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INSTALL_DIR}/include;${SDL2_INSTALL_DIR}/include/SDL2" ) # SDL2main (обычно статическая) add_library(SDL2main_external_lib UNKNOWN IMPORTED GLOBAL) set_target_properties(SDL2main_external_lib PROPERTIES # ИСПРАВЛЕНО: Указываем пути для Debug и Release, используя # соглашение, что Debug имеет суффикс 'd', а Release — нет. IMPORTED_LOCATION_DEBUG "${SDL2_INSTALL_DIR}/lib/SDL2maind.lib" IMPORTED_LOCATION_RELEASE "${SDL2_INSTALL_DIR}/lib/SDL2main.lib" INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INSTALL_DIR}/include" ) log("-----${SDL2_INSTALL_DIR}/lib/SDL2maind.lib") # =========================================== # 3) libpng (v1.6.51.zip → libpng-1.6.51) - без изменений # =========================================== set(LIBPNG_SRC_DIR "${THIRDPARTY_DIR}/libpng-1.6.51") set(LIBPNG_BUILD_DIR "${LIBPNG_SRC_DIR}/build") set(LIBPNG_INSTALL_DIR "${LIBPNG_SRC_DIR}/install") # на будущее file(MAKE_DIRECTORY "${LIBPNG_BUILD_DIR}") # Проверяем, есть ли уже .lib (build/Debug или install/lib) set(_libpng_candidates "${LIBPNG_BUILD_DIR}/Debug/libpng16_staticd.lib" "${LIBPNG_BUILD_DIR}/Release/libpng16_static.lib" ) set(_have_png FALSE) foreach(candidate IN LISTS _libpng_candidates) if(EXISTS "${candidate}") set(_have_png TRUE) break() endif() endforeach() if(NOT _have_png) log("Configuring libpng ...") execute_process( COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S "${LIBPNG_SRC_DIR}" -B "${LIBPNG_BUILD_DIR}" -DCMAKE_INSTALL_PREFIX=${LIBPNG_INSTALL_DIR} -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} -DZLIB_ROOT=${ZLIB_INSTALL_DIR} RESULT_VARIABLE _png_cfg_res ) if(NOT _png_cfg_res EQUAL 0) message(FATAL_ERROR "libpng configure failed") endif() # --- ИЗМЕНЕНИЕ: Цикл по конфигурациям Debug и Release --- foreach(cfg IN LISTS BUILD_CONFIGS) log("Building libpng (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --build "${LIBPNG_BUILD_DIR}" --config ${cfg} RESULT_VARIABLE _png_build_res ) if(NOT _png_build_res EQUAL 0) message(FATAL_ERROR "libpng build failed for configuration ${cfg}") endif() # Поскольку вы не используете "cmake --install" для libpng, # здесь нет необходимости в дополнительном шаге установки. # Файлы .lib будут сгенерированы в подкаталоге ${LIBPNG_BUILD_DIR}/${cfg} (например, build/Debug или build/Release). endforeach() # ------------------------------------------------------ endif() add_library(libpng_external_lib UNKNOWN IMPORTED GLOBAL) set_target_properties(libpng_external_lib PROPERTIES # Предполагая, что libpng использует статический вариант IMPORTED_LOCATION_DEBUG "${LIBPNG_BUILD_DIR}/Debug/libpng16_staticd.lib" IMPORTED_LOCATION_RELEASE "${LIBPNG_BUILD_DIR}/Release/libpng16_static.lib" # png.h, pngconf.h – в SRC, pnglibconf.h – в BUILD INTERFACE_INCLUDE_DIRECTORIES "${LIBPNG_SRC_DIR};${LIBPNG_BUILD_DIR}" ) # =========================================== # 4) libzip (v1.11.4.zip → libzip-1.11.4) - НОВАЯ ЗАВИСИМОСТЬ # =========================================== set(LIBZIP_SRC_DIR "${THIRDPARTY_DIR}/libzip-1.11.4") set(LIBZIP_BUILD_DIR "${LIBZIP_SRC_DIR}/build") #set(LIBZIP_INSTALL_DIR "${LIBZIP_SRC_DIR}/install") set(LIBZIP_BASE_DIR "${LIBZIP_SRC_DIR}/install") file(MAKE_DIRECTORY "${LIBZIP_BUILD_DIR}") # Проверяем, собран ли уже libzip set(_have_zip FALSE) foreach(candidate "${LIBZIP_BASE_DIR}-Debug/lib/zip.lib" "${LIBZIP_BASE_DIR}-Release/lib/zip.lib" ) if(EXISTS "${candidate}") set(_have_zip TRUE) break() endif() endforeach() if(NOT _have_zip) foreach(cfg IN LISTS BUILD_CONFIGS) log("Configuring libzip (${cfg})...") execute_process( COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" -S "${LIBZIP_SRC_DIR}" -B "${LIBZIP_SRC_DIR}/build-${cfg}" -DCMAKE_INSTALL_PREFIX=${LIBZIP_BASE_DIR}-${cfg} -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} -DZLIB_ROOT=${ZLIB_INSTALL_DIR} -DENABLE_COMMONCRYPTO=OFF -DENABLE_GNUTLS=OFF -DENABLE_MBEDTLS=OFF -DENABLE_OPENSSL=OFF -DENABLE_WINDOWS_CRYPTO=OFF -DENABLE_FUZZ=OFF RESULT_VARIABLE _zip_cfg_res ) if(NOT _zip_cfg_res EQUAL 0) message(FATAL_ERROR "libzip configure failed") endif() log("Building libzip (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --build "${LIBZIP_SRC_DIR}/build-${cfg}" --config ${cfg} -v RESULT_VARIABLE _zip_build_res ) if(NOT _zip_build_res EQUAL 0) message(FATAL_ERROR "libzip build failed for configuration ${cfg}") endif() log("Installing libzip (${cfg}) ...") execute_process( COMMAND ${CMAKE_COMMAND} --install "${LIBZIP_SRC_DIR}/build-${cfg}" --config ${cfg} -v RESULT_VARIABLE _zip_inst_res ) if(NOT _zip_inst_res EQUAL 0) message(FATAL_ERROR "libzip install failed for configuration ${cfg}") endif() endforeach() endif() add_library(libzip_external_lib UNKNOWN IMPORTED GLOBAL) set_target_properties(libzip_external_lib PROPERTIES IMPORTED_LOCATION_DEBUG "${LIBZIP_BASE_DIR}-Debug/lib/zip.lib" # ИСПРАВЛЕНО IMPORTED_LOCATION_RELEASE "${LIBZIP_BASE_DIR}-Release/lib/zip.lib" # ИСПРАВЛЕНО INTERFACE_INCLUDE_DIRECTORIES "$,${LIBZIP_BASE_DIR}-Debug/include,${LIBZIP_BASE_DIR}-Release/include>" # libzip требует zlib для линковки INTERFACE_LINK_LIBRARIES zlib_external_lib ) # =========================================== # 5) Eigen (5.0.0.zip → eigen-5.0.0) - HEADER-ONLY # =========================================== set(EIGEN_SRC_DIR "${THIRDPARTY_DIR}/eigen-5.0.0") if(NOT TARGET eigen_external_lib) add_library(eigen_external_lib INTERFACE) target_include_directories(eigen_external_lib INTERFACE "${EIGEN_SRC_DIR}") endif() # =========================================== # 6) Boost (1.90.0) - HEADER-ONLY # =========================================== set(BOOST_VERSION "1.90.0") set(BOOST_ARCHIVE_NAME "boost_1_90_0.zip") set(BOOST_ARCHIVE "${THIRDPARTY_DIR}/${BOOST_ARCHIVE_NAME}") # Внутри архива папка называется boost_1_90_0 set(BOOST_SRC_DIR "${THIRDPARTY_DIR}/boost_1_90_0") if(NOT TARGET boost_external_lib) add_library(boost_external_lib INTERFACE) # Boost заголовки находятся непосредственно в корне распакованной папки target_include_directories(boost_external_lib INTERFACE "${BOOST_SRC_DIR}") endif()