set(LLAMA_WIN_APP_MANIFEST "${CMAKE_CURRENT_LIST_DIR}/../common/win-app.manifest") if(WIN32) if(MSVC OR CMAKE_CXX_SIMULATE_ID STREQUAL "MSVC") set(LLAMA_WIN_APP_MSVC_ABI TRUE) else() set(LLAMA_WIN_APP_MSVC_ABI FALSE) endif() if(NOT LLAMA_WIN_APP_MSVC_ABI) if(CMAKE_VERSION VERSION_LESS 3.21) message(FATAL_ERROR "CMake 3.21 or newer is required to build for Windows with the GNU ABI") endif() enable_language(RC) set(LLAMA_WIN_APP_MANIFEST_RC "${CMAKE_CURRENT_BINARY_DIR}/win-app-manifest.rc") configure_file("${CMAKE_CURRENT_LIST_DIR}/win-app.rc.in" "${LLAMA_WIN_APP_MANIFEST_RC}" @ONLY) set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${LLAMA_WIN_APP_MANIFEST}") endif() endif() function(llama_add_app_manifest target) if(NOT WIN32) return() endif() get_target_property(_aliased ${target} ALIASED_TARGET) if(_aliased) return() endif() get_target_property(_type ${target} TYPE) if(NOT _type STREQUAL "EXECUTABLE") return() endif() if(LLAMA_WIN_APP_MSVC_ABI) target_sources(${target} PRIVATE "${LLAMA_WIN_APP_MANIFEST}") else() if(NOT TARGET llama-win-app-manifest-res) add_library(llama-win-app-manifest-res OBJECT ${LLAMA_WIN_APP_MANIFEST_RC}) set_source_files_properties(${LLAMA_WIN_APP_MANIFEST_RC} PROPERTIES OBJECT_DEPENDS "${LLAMA_WIN_APP_MANIFEST}") endif() target_link_libraries(${target} PRIVATE "$") endif() endfunction() function(llama_apply_app_manifests_dir dir) get_property(_targets DIRECTORY "${dir}" PROPERTY BUILDSYSTEM_TARGETS) foreach(_target IN LISTS _targets) llama_add_app_manifest(${_target}) endforeach() get_property(_subdirs DIRECTORY "${dir}" PROPERTY SUBDIRECTORIES) foreach(_subdir IN LISTS _subdirs) llama_apply_app_manifests_dir("${_subdir}") endforeach() endfunction() function(llama_apply_app_manifests) if(NOT WIN32) return() endif() get_property(_subdirs DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" PROPERTY SUBDIRECTORIES) foreach(_dir IN LISTS _subdirs) get_filename_component(_name "${_dir}" NAME) if(_name STREQUAL "app" OR _name STREQUAL "examples" OR _name STREQUAL "pocs" OR _name STREQUAL "tests" OR _name STREQUAL "tools") llama_apply_app_manifests_dir("${_dir}") endif() endforeach() endfunction()