Browse Source

CMake presets. (#744)

* CI: use single build action
* CMake: use imported targets
* CI: do not build boost for linux
* CMake: add FORCE_BUNDLED_MINIZIP option
* linux: use external minizip and fuzzylite
* CMake: add presets
* .gitignore: ignore cmake build dirs
* github: use cmake presets
Konstantin 3 years ago
parent
commit
8fc14369a4

+ 41 - 39
.github/workflows/github.yml

@@ -8,7 +8,7 @@ on:
     pull_request:
     pull_request:
 env:
 env:
   # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
   # Customize the CMake build type here (Release, Debug, RelWithDebInfo, etc.)
-  BUILD_TYPE: Release
+  BUILD_TYPE: RelWithDebInfo
 
 
 jobs:
 jobs:
   build:
   build:
@@ -17,22 +17,18 @@ jobs:
         include:
         include:
           - platform: linux
           - platform: linux
             os: ubuntu-20.04
             os: ubuntu-20.04
-            cc: clang-10
-            cxx: clang++-10
             test: 0
             test: 0
-            cmake_args: -G Ninja
+            preset: linux-clang-release
           - platform: linux
           - platform: linux
             os: ubuntu-20.04
             os: ubuntu-20.04
-            cc: gcc-9
-            cxx: g++-9
             test: 0
             test: 0
-            cmake_args: -G Ninja
+            preset: linux-gcc-release
           - platform: mac
           - platform: mac
             os: macos-latest
             os: macos-latest
             test: 0
             test: 0
             pack: 1
             pack: 1
             extension: dmg
             extension: dmg
-            cmake_args: -G Ninja
+            preset: macos-ninja-release
           - platform: mxe
           - platform: mxe
             os: ubuntu-20.04
             os: ubuntu-20.04
             mxe: i686-w64-mingw32.shared
             mxe: i686-w64-mingw32.shared
@@ -46,15 +42,14 @@ jobs:
             test: 0
             test: 0
             pack: 1
             pack: 1
             extension: exe
             extension: exe
-            cmake_args: -G "Visual Studio 17 2022" -A x64 '-DCMAKE_TOOLCHAIN_FILE=vcpkg/scripts/buildsystems/vcpkg.cmake'
-            
+            preset: windows-msvc-release
     runs-on: ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
     defaults:
     defaults:
       run:
       run:
         shell: bash
         shell: bash
 
 
     steps:
     steps:
-    - uses: actions/checkout@v2
+    - uses: actions/checkout@v3
       with:
       with:
         submodules: recursive
         submodules: recursive
 
 
@@ -63,7 +58,7 @@ jobs:
       env:
       env:
         MXE_TARGET: ${{ matrix.mxe }}
         MXE_TARGET: ${{ matrix.mxe }}
         VCMI_BUILD_PLATFORM: x64
         VCMI_BUILD_PLATFORM: x64
-        
+
     - name: Git branch name
     - name: Git branch name
       id: git-branch-name
       id: git-branch-name
       uses: EthanSK/git-branch-name-action@v1
       uses: EthanSK/git-branch-name-action@v1
@@ -77,10 +72,13 @@ jobs:
         PULL_REQUEST: ${{ github.event.pull_request.number }}
         PULL_REQUEST: ${{ github.event.pull_request.number }}
 
 
     - name: Configure CMake
     - name: Configure CMake
+      if: "${{ matrix.preset == '' }}"
       run: |
       run: |
-        mkdir '${{github.workspace}}/build'
-        cd '${{github.workspace}}/build'
-        cmake ${{matrix.cmake_args}} .. -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
+        mkdir -p '${{github.workspace}}/out/build/${{matrix.preset}}'
+        cd '${{github.workspace}}/out/build/${{matrix.preset}}'
+        cmake \
+            ../.. -GNinja \
+            ${{matrix.cmake_args}} -DCMAKE_BUILD_TYPE=${{env.BUILD_TYPE}} \
             -DENABLE_TEST=${{matrix.test}} \
             -DENABLE_TEST=${{matrix.test}} \
             -DPACKAGE_NAME_SUFFIX:STRING="$VCMI_PACKAGE_NAME_SUFFIX" \
             -DPACKAGE_NAME_SUFFIX:STRING="$VCMI_PACKAGE_NAME_SUFFIX" \
             -DPACKAGE_FILE_NAME:STRING="$VCMI_PACKAGE_FILE_NAME"
             -DPACKAGE_FILE_NAME:STRING="$VCMI_PACKAGE_FILE_NAME"
@@ -88,54 +86,58 @@ jobs:
         CC: ${{ matrix.cc }}
         CC: ${{ matrix.cc }}
         CXX: ${{ matrix.cxx }}
         CXX: ${{ matrix.cxx }}
 
 
+    - name: CMake Preset
+      if: "${{ matrix.preset != '' }}"
+      run: |
+        cmake --preset ${{ matrix.preset }}
+
     - name: Build
     - name: Build
-      if: ${{ matrix.platform != 'msvc' }}
+      if: "${{ matrix.preset == '' }}"
       run: |
       run: |
-        cd '${{github.workspace}}/build'
-        ninja
-        
-    - name: Build MSVC
-      if: ${{ matrix.platform == 'msvc' }}
+        cmake --build '${{github.workspace}}/out/build/${{matrix.preset}}'
+
+    - name: Build Preset
+      if: "${{ matrix.preset != '' }}"
       run: |
       run: |
-        cd '${{github.workspace}}/build'
-        cmake --build . --config ${{env.BUILD_TYPE}}
+        cmake --build --preset ${{matrix.preset}}
 
 
     - name: Test
     - name: Test
-      if: ${{ matrix.test == 1 }}
+      if: ${{ matrix.test == 1 &&  matrix.preset != ''}}
       run: |
       run: |
-        cd '${{github.workspace}}/build'
-        ctest -C Release -V
-  
+        ctest --preset ${{matrix.preset}}
+
     - name: Pack
     - name: Pack
       id: cpack
       id: cpack
       if: ${{ matrix.pack == 1 }}
       if: ${{ matrix.pack == 1 }}
       run: |
       run: |
-        cd '${{github.workspace}}/build'
+        cd '${{github.workspace}}/out/build/${{matrix.preset}}'
         CPACK_PATH=`which -a cpack | grep -m1 -v -i chocolatey`
         CPACK_PATH=`which -a cpack | grep -m1 -v -i chocolatey`
-        "$CPACK_PATH" -C Release ${{ matrix.cpack_args }}
-        
+        "$CPACK_PATH" -C ${{env.BUILD_TYPE}} ${{ matrix.cpack_args }}
+        rm -rf _CPack_Packages
+
     - name: Additional logs
     - name: Additional logs
       if: ${{ failure() && steps.cpack.outcome == 'failure' && matrix.platform == 'mxe' }}
       if: ${{ failure() && steps.cpack.outcome == 'failure' && matrix.platform == 'mxe' }}
       run: |
       run: |
-        cat '${{github.workspace}}/build/_CPack_Packages/win32/NSIS/project.nsi'
-        cat '${{github.workspace}}/build/_CPack_Packages/win32/NSIS/NSISOutput.log'
-        
+        cat '${{github.workspace}}/out/build/${{matrix.preset}}/_CPack_Packages/win32/NSIS/project.nsi'
+        cat '${{github.workspace}}/out/build/${{matrix.preset}}/_CPack_Packages/win32/NSIS/NSISOutput.log'
+
     - name: Artifacts
     - name: Artifacts
       if: ${{ matrix.pack == 1 }}
       if: ${{ matrix.pack == 1 }}
-      uses: actions/upload-artifact@v2
+      uses: actions/upload-artifact@v3
       with:
       with:
         name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
         name: ${{ env.VCMI_PACKAGE_FILE_NAME }} - ${{ matrix.platform }}
-        path: ${{github.workspace}}/build/${{ env.VCMI_PACKAGE_FILE_NAME }}.${{ matrix.extension }}
-  
+        path: |
+          ${{github.workspace}}/**/${{ env.VCMI_PACKAGE_FILE_NAME }}.${{ matrix.extension }}
+
     - name: Upload build
     - name: Upload build
       if: ${{ matrix.pack == 1 && github.ref == 'refs/heads/develop' && matrix.platform != 'msvc' }}
       if: ${{ matrix.pack == 1 && github.ref == 'refs/heads/develop' && matrix.platform != 'msvc' }}
       run: |
       run: |
-        cd '${{github.workspace}}/build'
+        cd '${{github.workspace}}/out/build/${{matrix.preset}}'
         source '${{github.workspace}}/CI/upload_package.sh'
         source '${{github.workspace}}/CI/upload_package.sh'
       env:
       env:
         DEPLOY_RSA: ${{ secrets.DEPLOY_RSA }}
         DEPLOY_RSA: ${{ secrets.DEPLOY_RSA }}
         PACKAGE_EXTENSION: ${{ matrix.extension }}
         PACKAGE_EXTENSION: ${{ matrix.extension }}
-        
+
     - uses: act10ns/slack@v1
     - uses: act10ns/slack@v1
       with:
       with:
         status: ${{ job.status }}
         status: ${{ job.status }}
@@ -143,7 +145,7 @@ jobs:
       env:
       env:
         SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
         SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}
       if: always()
       if: always()
-      
+
     - name: Trigger Android
     - name: Trigger Android
       uses: peter-evans/repository-dispatch@v1
       uses: peter-evans/repository-dispatch@v1
       if: ${{ github.ref == 'refs/heads/develop' && matrix.platform == 'mxe' }}
       if: ${{ github.ref == 'refs/heads/develop' && matrix.platform == 'mxe' }}

+ 3 - 0
.gitignore

@@ -3,6 +3,9 @@
 /launcher/vcmilauncher
 /launcher/vcmilauncher
 /launcher/vcmilauncher_automoc.cpp
 /launcher/vcmilauncher_automoc.cpp
 
 
+build/
+.cache/*
+out/
 *.dll
 *.dll
 *.exe
 *.exe
 *.depend
 *.depend

+ 12 - 16
AI/CMakeLists.txt

@@ -8,32 +8,28 @@ else()
 	option(FORCE_BUNDLED_FL "Force to use FuzzyLite included into VCMI's source tree" OFF)
 	option(FORCE_BUNDLED_FL "Force to use FuzzyLite included into VCMI's source tree" OFF)
 endif()
 endif()
 
 
+if(TBB_FOUND AND MSVC)
+	   install_vcpkg_imported_tgt(TBB::tbb)
+endif()
+
+
 if(NOT FORCE_BUNDLED_FL)
 if(NOT FORCE_BUNDLED_FL)
-	find_package(FuzzyLite)
+	find_package(fuzzylite)
 else()
 else()
-	set(FL_FOUND FALSE)
+	set(fuzzylite_FOUND FALSE)
 endif()
 endif()
 
 
-if(TBB_FOUND AND MSVC)
-	get_target_property(TBB_LIB_LOCATION TBB::tbb LOCATION)
-	get_filename_component(TBB_LIB_FOLDER ${TBB_LIB_LOCATION} PATH)
-	get_filename_component(TBB_DLL ${TBB_LIB_FOLDER}/../bin/tbb.dll ABSOLUTE)
-	message("${TBB_DLL}")
-	install(FILES ${TBB_DLL} DESTINATION ${BIN_DIR})
+if(TARGET fuzzylite::fuzzylite AND MSVC)
+	install_vcpkg_imported_tgt(fuzzylite::fuzzylite)
 endif()
 endif()
 
 
-if(FL_FOUND)
-	if(MSVC)
-		get_filename_component(FL_LIB_FOLDER ${FL_LIBRARIES} PATH)
-		get_filename_component(FL_DLL ${FL_LIB_FOLDER}/../bin/fuzzylite.dll ABSOLUTE)
-		message("${FL_DLL}")
-		install(FILES ${FL_DLL} DESTINATION ${BIN_DIR})
-	endif()
-else()
+if(NOT fuzzylite_FOUND)
     set(FL_BUILD_BINARY OFF CACHE BOOL "")
     set(FL_BUILD_BINARY OFF CACHE BOOL "")
     set(FL_BUILD_SHARED OFF CACHE BOOL "")
     set(FL_BUILD_SHARED OFF CACHE BOOL "")
 	set(FL_BUILD_TESTS OFF CACHE BOOL "")
 	set(FL_BUILD_TESTS OFF CACHE BOOL "")
 	add_subdirectory(FuzzyLite/fuzzylite EXCLUDE_FROM_ALL)
 	add_subdirectory(FuzzyLite/fuzzylite EXCLUDE_FROM_ALL)
+	add_library(fuzzylite::fuzzylite ALIAS fl-static)
+	target_include_directories(fl-static PUBLIC ${CMAKE_HOME_DIRECTORY}/AI/FuzzyLite/fuzzylite)
 endif()
 endif()
 
 
 #######################################
 #######################################

+ 1 - 10
AI/Nullkiller/CMakeLists.txt

@@ -128,18 +128,9 @@ endif()
 
 
 add_library(Nullkiller SHARED ${Nullkiller_SRCS} ${Nullkiller_HEADERS})
 add_library(Nullkiller SHARED ${Nullkiller_SRCS} ${Nullkiller_HEADERS})
 
 
-if(FL_FOUND)
-	target_include_directories(Nullkiller PUBLIC ${FL_INCLUDE_DIRS})
-else()
-	target_include_directories(Nullkiller PUBLIC ${CMAKE_HOME_DIRECTORY}/AI/FuzzyLite/fuzzylite)
-endif()
 target_include_directories(Nullkiller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 target_include_directories(Nullkiller PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 
 
-if(FL_FOUND)
-	target_link_libraries(Nullkiller PRIVATE ${FL_LIBRARIES} vcmi)
-else()
-	target_link_libraries(Nullkiller PRIVATE fl-static vcmi)
-endif()
+target_link_libraries(Nullkiller PRIVATE vcmi fuzzylite::fuzzylite)
 
 
 target_link_libraries(Nullkiller PRIVATE TBB::tbb)
 target_link_libraries(Nullkiller PRIVATE TBB::tbb)
 
 

+ 1 - 10
AI/VCAI/CMakeLists.txt

@@ -109,18 +109,9 @@ endif()
 
 
 add_library(VCAI SHARED ${VCAI_SRCS} ${VCAI_HEADERS})
 add_library(VCAI SHARED ${VCAI_SRCS} ${VCAI_HEADERS})
 
 
-if(FL_FOUND)
-	target_include_directories(VCAI PUBLIC ${FL_INCLUDE_DIRS})
-else()
-	target_include_directories(VCAI PUBLIC ${CMAKE_HOME_DIRECTORY}/AI/FuzzyLite/fuzzylite)
-endif()
 target_include_directories(VCAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 target_include_directories(VCAI PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 
 
-if(FL_FOUND)
-	target_link_libraries(VCAI PRIVATE ${FL_LIBRARIES} vcmi)
-else()
-	target_link_libraries(VCAI PRIVATE fl-static vcmi)
-endif()
+target_link_libraries(VCAI PRIVATE vcmi fuzzylite::fuzzylite)
 
 
 vcmi_set_output_dir(VCAI "AI")
 vcmi_set_output_dir(VCAI "AI")
 
 

+ 4 - 9
CI/linux/before_install.sh

@@ -2,15 +2,10 @@
 
 
 sudo apt-get update
 sudo apt-get update
 
 
-# Boost
-wget -nv https://boostorg.jfrog.io/artifactory/main/release/1.66.0/source/boost_1_66_0.tar.gz
-tar xfz boost_1_66_0.tar.gz
-cd boost_1_66_0
-./bootstrap.sh --with-libraries=program_options,filesystem,system,thread,locale,date_time
-./b2
-sudo ./b2 install
-
 # Dependencies
 # Dependencies
+sudo apt-get install libboost-all-dev
 sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
 sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
 sudo apt-get install qtbase5-dev
 sudo apt-get install qtbase5-dev
-sudo apt-get install ninja-build zlib1g-dev libavformat-dev libswscale-dev libtbb-dev libluajit-5.1-dev
+sudo apt-get install ninja-build zlib1g-dev libavformat-dev libswscale-dev libtbb-dev libluajit-5.1-dev
+# Optional dependencies
+sudo apt-get install libminizip-dev libfuzzylite-dev

+ 49 - 24
CMakeLists.txt

@@ -124,6 +124,14 @@ set (CMAKE_CXX_STANDARD 14)
 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
 set(CMAKE_CXX_VISIBILITY_PRESET hidden)
 set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
 set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
 
 
+#Global fallback mapping
+# RelWithDebInfo falls back to Release, then MinSizeRel
+set(CMAKE_MAP_IMPORTED_CONFIG_RELWITHDEBINFO RelWithDebInfo Release MinSizeRel "")
+# MinSizeRel falls back to Release, then RelWithDebInfo
+set(CMAKE_MAP_IMPORTED_CONFIG_MINSIZEREL MinSizeRel Release RelWithDebInfo "")
+# Release falls back to RelWithDebInfo, then MinSizeRel
+set(CMAKE_MAP_IMPORTED_CONFIG_RELEASE Release RelWithDebInfo MinSizeRel "")
+
 if(APPLE)
 if(APPLE)
 	set(CMAKE_MACOSX_RPATH 0)
 	set(CMAKE_MACOSX_RPATH 0)
 endif(APPLE)
 endif(APPLE)
@@ -216,39 +224,56 @@ endif()
 #        Finding packages                  #
 #        Finding packages                  #
 ############################################
 ############################################
 
 
-set(FFmpeg_FIND_COMPONENTS AVFORMAT SWSCALE)
-find_package(Boost 1.48.0 COMPONENTS date_time filesystem locale program_options system thread REQUIRED)
+find_package(Boost 1.48.0 REQUIRED COMPONENTS date_time filesystem locale program_options system thread)
 find_package(ZLIB REQUIRED)
 find_package(ZLIB REQUIRED)
-find_package(FFmpeg REQUIRED)
-find_package(Minizip)
-if(MINIZIP_FOUND)
-	add_definitions(-DUSE_SYSTEM_MINIZIP)
+find_package(ffmpeg REQUIRED COMPONENTS avutil swscale avformat avcodec)
+option(FORCE_BUNDLED_MINIZIP "Force bundled Minizip library" OFF)
+if(NOT FORCE_BUNDLED_MINIZIP)
+	find_package(minizip)
+	if(TARGET minizip::minizip)
+		add_definitions(-DUSE_SYSTEM_MINIZIP)
+	endif()
 endif()
 endif()
 
 
 find_package(SDL2 REQUIRED)
 find_package(SDL2 REQUIRED)
 find_package(SDL2_image REQUIRED)
 find_package(SDL2_image REQUIRED)
 find_package(SDL2_mixer REQUIRED)
 find_package(SDL2_mixer REQUIRED)
+if(TARGET SDL2_mixer::SDL2_mixer)
+	add_library(SDL2::Mixer ALIAS SDL2_mixer::SDL2_mixer)
+endif()
 find_package(SDL2_ttf REQUIRED)
 find_package(SDL2_ttf REQUIRED)
+if(TARGET SDL2_ttf::SDL2_ttf)
+	add_library(SDL2::TTF ALIAS SDL2_ttf::SDL2_ttf)
+endif()
 find_package(TBB REQUIRED)
 find_package(TBB REQUIRED)
 
 
 if(ENABLE_LAUNCHER)
 if(ENABLE_LAUNCHER)
 	# Widgets finds its own dependencies (QtGui and QtCore).
 	# Widgets finds its own dependencies (QtGui and QtCore).
-	find_package(Qt5Widgets REQUIRED)
-	find_package(Qt5Network REQUIRED)
+	find_package(Qt5 COMPONENTS Widgets Network REQUIRED)
 endif()
 endif()
 
 
 if(ENABLE_LUA)
 if(ENABLE_LUA)
+	find_package(luajit)
 	# MXE paths hardcoded for current dependencies pack - tried and could not make it work another way
 	# MXE paths hardcoded for current dependencies pack - tried and could not make it work another way
-	if((MINGW) AND (${CMAKE_CROSSCOMPILING}) AND (DEFINED MSYS))
-		set(LUA_INCLUDE_DIR "/usr/lib/mxe/usr/i686-w64-mingw32.static/include/luajit-2.0")
-		set(LUA_LIBRARY "/usr/lib/mxe/usr/i686-w64-mingw32.static/lib/libluajit-5.1.a")
+	if((MINGW) AND (${CMAKE_CROSSCOMPILING}) AND (DEFINED MSYS) AND (NOT TARGET luajit::luajit))
+		add_library(luajit::luajit STATIC IMPORTED)
+		set_target_properties(luajit::luajit PROPERTIES
+			INTERFACE_INCLUDE_DIRECTORIES "/usr/lib/mxe/usr/i686-w64-mingw32.static/include/luajit-2.0")
+		set_target_properties(luajit::luajit PROPERTIES
+			IMPORTED_LOCATION "/usr/lib/mxe/usr/i686-w64-mingw32.static/lib/libluajit-5.1.a")
 	endif()
 	endif()
-	find_package(LuaJIT)
-	if(LUAJIT_FOUND)
+	if(TARGET luajit::luajit)
 		message(STATUS "Using LuaJIT provided by system")
 		message(STATUS "Using LuaJIT provided by system")
 	else()
 	else()
 		message(STATUS "Cannot find LuaJIT! Fallback to using usual Lua.")
 		message(STATUS "Cannot find LuaJIT! Fallback to using usual Lua.")
 		find_package(Lua REQUIRED)
 		find_package(Lua REQUIRED)
+		if(Lua_FOUND)
+			add_library(luajit::luajit UNKNOWN IMPORTED)
+			set_target_properties(luajit::luajit PROPERTIES
+				INTERFACE_INCLUDE_DIRECTORIES "${LUA_INCLUDE_DIR}")
+			set_target_properties(luajit::luajit PROPERTIES
+				IMPORTED_LOCATION "${LUA_LIBRARIES}")
+		endif()
 	endif()
 	endif()
 endif()
 endif()
 
 
@@ -318,9 +343,9 @@ endif()
 if(ENABLE_LUA)
 if(ENABLE_LUA)
 	add_subdirectory(scripting/lua)
 	add_subdirectory(scripting/lua)
 endif()
 endif()
-if(NOT MINIZIP_FOUND)
+if(NOT TARGET minizip::minizip)
 	add_subdirectory_with_folder("3rdparty" lib/minizip)
 	add_subdirectory_with_folder("3rdparty" lib/minizip)
-	set(MINIZIP_LIBRARIES minizip)
+	add_library(minizip::minizip ALIAS minizip)
 endif()
 endif()
 add_subdirectory(lib)
 add_subdirectory(lib)
 add_subdirectory(client)
 add_subdirectory(client)
@@ -371,19 +396,19 @@ if(WIN32)
 			${Qtbin_folder}/Qt5Core${debug_postfix}.dll
 			${Qtbin_folder}/Qt5Core${debug_postfix}.dll
 			${Qtbin_folder}/Qt5Gui${debug_postfix}.dll
 			${Qtbin_folder}/Qt5Gui${debug_postfix}.dll
 			${Qtbin_folder}/Qt5Widgets${debug_postfix}.dll
 			${Qtbin_folder}/Qt5Widgets${debug_postfix}.dll
+			${Qtbin_folder}/Qt5Network${debug_postfix}.dll
 			${Qtbin_folder}/icu*.dll)
 			${Qtbin_folder}/icu*.dll)
-		file(GLOB dep_qwindows
-			${Qtbin_folder}/../plugins/platforms/qwindows${debug_postfix}.dll)
-	endif()
-
-	if (ENABLE_LAUNCHER)
-		file(GLOB dep_files
-			${dep_files}
-			${Qtbin_folder}/Qt5Network${debug_postfix}.dll)
+		get_target_property(integration_type Qt5::QWindowsIntegrationPlugin TYPE)
+		if(NOT(integration_type STREQUAL "INTERFACE_LIBRARY"))
+			get_target_property(integration_loc Qt5::QWindowsIntegrationPlugin LOCATION)
+			install(
+				FILES ${integration_loc}
+				DESTINATION ${BIN_DIR}/platforms
+			)
+		endif()
 	endif()
 	endif()
 
 
 	install(FILES ${dep_files} DESTINATION ${BIN_DIR})
 	install(FILES ${dep_files} DESTINATION ${BIN_DIR})
-	install(FILES ${dep_qwindows} DESTINATION ${BIN_DIR}/platforms)
 endif(WIN32)
 endif(WIN32)
 
 
 #######################################
 #######################################

+ 135 - 0
CMakePresets.json

@@ -0,0 +1,135 @@
+{
+    "version": 2,
+    "configurePresets": [
+        {
+            "name": "default-release",
+            "hidden": true,
+            "binaryDir": "${sourceDir}/out/build/${presetName}",
+            "generator": "Ninja",
+            "cacheVariables": {
+                "CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
+                "PACKAGE_FILE_NAME" : "$env{VCMI_PACKAGE_FILE_NAME}",
+                "PACKAGE_NAME_SUFFIX" : "$env{VCMI_PACKAGE_NAME_SUFFIX}",
+                "CMAKE_BUILD_TYPE": "RelWithDebInfo",
+                "FORCE_BUNDLED_FL" : "0",
+                "ENABLE_TEST": "0"
+            }
+        },
+        {
+            "name": "linux-clang-release",
+            "displayName": "Clang x86_64-pc-linux-gnu",
+            "description": "VCMI Linux Clang",
+            "inherits": "default-release",
+            "cacheVariables": {
+                "CMAKE_C_COMPILER": "/usr/bin/clang",
+                "CMAKE_CXX_COMPILER": "/usr/bin/clang++"
+            }
+        },
+        {
+            "name": "linux-gcc-release",
+            "displayName": "GCC x86_64-pc-linux-gnu",
+            "description": "VCMI Linux GCC",
+            "inherits": "default-release",
+            "cacheVariables": {
+                "CMAKE_C_COMPILER": "/usr/bin/gcc",
+                "CMAKE_CXX_COMPILER": "/usr/bin/g++"
+            }
+        },
+        {
+            "name": "windows-msvc-release",
+            "displayName": "Windows x64 RelWithDebInfo",
+            "description": "VCMI RelWithDebInfo build",
+            "inherits": "default-release",
+            "generator": "Visual Studio 17 2022",
+            "architecture": {
+                "value": "x64",
+                "strategy": "set"
+            },
+            "cacheVariables": {
+                "CMAKE_TOOLCHAIN_FILE": "${sourceDir}/vcpkg/scripts/buildsystems/vcpkg.cmake",
+                "CMAKE_POLICY_DEFAULT_CMP0091": "NEW",
+                "FORCE_BUNDLED_MINIZIP": "ON"
+            }
+        },
+        {
+            "name": "macos-ninja-release",
+            "displayName": "Ninja release",
+            "description": "VCMI MacOS Ninja",
+            "inherits": "default-release"
+        },
+        {
+            "name": "macos-xcode-release",
+            "displayName": "XCode release",
+            "description": "VCMI MacOS Xcode",
+            "inherits": "default-release",
+            "generator": "Xcode"
+        }
+    ],
+    "buildPresets": [
+        {
+            "name": "default-release",
+            "hidden": true,
+            "configuration": "RelWithDebInfo"
+        },
+        {
+            "name": "linux-clang-release",
+            "configurePreset": "linux-clang-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "linux-gcc-release",
+            "configurePreset": "linux-gcc-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "macos-xcode-release",
+            "configurePreset": "macos-xcode-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "macos-ninja-release",
+            "configurePreset": "macos-ninja-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "windows-msvc-release",
+            "configurePreset": "windows-msvc-release",
+            "inherits": "default-release"
+        }
+    ],
+    "testPresets": [
+        {
+            "name": "default-release",
+            "hidden": true,
+            "output": {
+                "shortProgress": true,
+                "verbosity": "verbose"
+            }
+        },
+        {
+          "name": "linux-clang-release",
+          "configurePreset": "linux-clang-release",
+          "inherits": "default-release"
+        },
+        {
+            "name": "linux-gcc-release",
+            "configurePreset": "linux-gcc-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "macos-xcode-release",
+            "configurePreset": "macos-xcode-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "macos-ninja-release",
+            "configurePreset": "macos-ninja-release",
+            "inherits": "default-release"
+        },
+        {
+            "name": "windows-msvc-release",
+            "configurePreset": "windows-msvc-release",
+            "inherits": "default-release"
+        }
+    ]
+}

+ 4 - 10
client/CMakeLists.txt

@@ -173,23 +173,17 @@ if(WIN32)
 	)
 	)
 	set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT vcmiclient)
 	set_property(DIRECTORY ${CMAKE_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT vcmiclient)
 	if(NOT ENABLE_DEBUG_CONSOLE)
 	if(NOT ENABLE_DEBUG_CONSOLE)
-		target_link_libraries(vcmiclient ${SDLMAIN_LIBRARY})
+		target_link_libraries(vcmiclient SDL2::SDL2main)
 	endif()
 	endif()
 endif()
 endif()
 
 
 target_link_libraries(vcmiclient PRIVATE
 target_link_libraries(vcmiclient PRIVATE
-		vcmi ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY} ${SDL2_MIXER_LIBRARY} ${SDL2_TTF_LIBRARY}
-		${FFMPEG_LIBRARIES} ${FFMPEG_EXTRA_LINKING_OPTIONS} ${TBB_LIBRARIES}
+		vcmi SDL2::SDL2 SDL2::Image SDL2::Mixer SDL2::TTF
+		ffmpeg::swscale ffmpeg::avutil ffmpeg::avcodec ffmpeg::avformat TBB::tbb
 )
 )
 
 
 target_include_directories(vcmiclient
 target_include_directories(vcmiclient
-	PUBLIC	${CMAKE_CURRENT_SOURCE_DIR}
-	PUBLIC	${SDL2_INCLUDE_DIR}
-	PRIVATE ${SDL2_TTF_INCLUDE_DIR}
-	PRIVATE ${SDL2_MIXER_INCLUDE_DIR}
-	PRIVATE ${SDL2_IMAGE_INCLUDE_DIR}
-	PRIVATE ${FFMPEG_INCLUDE_DIRS}
-)
+	PUBLIC	${CMAKE_CURRENT_SOURCE_DIR})
 
 
 vcmi_set_output_dir(vcmiclient "")
 vcmi_set_output_dir(vcmiclient "")
 
 

+ 0 - 163
cmake_modules/FindFFmpeg.cmake

@@ -1,163 +0,0 @@
-# vim: ts=2 sw=2
-# - Try to find the required ffmpeg components(default: AVFORMAT, AVUTIL, AVCODEC)
-#
-# Once done this will define
-#  FFMPEG_FOUND         - System has the all required components.
-#  FFMPEG_INCLUDE_DIRS  - Include directory necessary for using the required components headers.
-#  FFMPEG_LIBRARIES     - Link these to use the required ffmpeg components.
-#  FFMPEG_DEFINITIONS   - Compiler switches required for using the required ffmpeg components.
-#
-# For each of the components it will additionally set.
-#   - AVCODEC
-#   - AVDEVICE
-#   - AVFORMAT
-#   - AVUTIL
-#   - POSTPROCESS
-#   - SWSCALE
-# the following variables will be defined
-#  <component>_FOUND        - System has <component>
-#  <component>_INCLUDE_DIRS - Include directory necessary for using the <component> headers
-#  <component>_LIBRARIES    - Link these to use <component>
-#  <component>_DEFINITIONS  - Compiler switches required for using <component>
-#  <component>_VERSION      - The components version
-#
-# Copyright (c) 2006, Matthias Kretz, <[email protected]>
-# Copyright (c) 2008, Alexander Neundorf, <[email protected]>
-# Copyright (c) 2011, Michael Jansen, <[email protected]>
-#
-# Redistribution and use is allowed according to the terms of the BSD license.
-# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
-
-include(FindPackageHandleStandardArgs)
-
-# The default components were taken from a survey over other FindFFMPEG.cmake files
-if (NOT FFmpeg_FIND_COMPONENTS)
-  set(FFmpeg_FIND_COMPONENTS AVCODEC AVFORMAT AVUTIL SWSCALE)
-endif ()
-
-if(MSVC)
-  if(CMAKE_SIZEOF_VOID_P EQUAL 8)
-    set(VC_LIB_PATH_SUFFIX lib/x64)
-  else()
-    set(VC_LIB_PATH_SUFFIX lib/x86)
-  endif()
-endif()
-
-#
-### Macro: set_component_found
-#
-# Marks the given component as found if both *_LIBRARIES AND *_INCLUDE_DIRS is present.
-#
-macro(set_component_found _component )
-  if (${_component}_LIBRARIES AND ${_component}_INCLUDE_DIRS)
-    # message(STATUS "  - ${_component} found.")
-    set(${_component}_FOUND TRUE)
-  else ()
-    # message(STATUS "  - ${_component} not found.")
-  endif ()
-endmacro()
-
-#
-### Macro: find_component
-#
-# Checks for the given component by invoking pkgconfig and then looking up the libraries and
-# include directories.
-#
-macro(find_component _component _pkgconfig _library _header)
-
-  if (NOT WIN32)
-     # use pkg-config to get the directories and then use these values
-     # in the FIND_PATH() and FIND_LIBRARY() calls
-     find_package(PkgConfig)
-     if (PKG_CONFIG_FOUND)
-       pkg_check_modules(PC_${_component} ${_pkgconfig})
-     endif ()
-  endif (NOT WIN32)
-
-  find_path(${_component}_INCLUDE_DIRS ${_header}
-    HINTS
-      ${PC_LIB${_component}_INCLUDEDIR}
-      ${PC_LIB${_component}_INCLUDE_DIRS}
-    PATH_SUFFIXES
-      ffmpeg
-  )
-
-  find_library(${_component}_LIBRARIES NAMES ${_library}
-      HINTS
-        ${PC_LIB${_component}_LIBDIR}
-        ${PC_LIB${_component}_LIBRARY_DIRS}
-	  PATH_SUFFIXES
-	    ${VC_LIB_PATH_SUFFIX}
-  )
-
-  set(${_component}_DEFINITIONS  ${PC_${_component}_CFLAGS_OTHER} CACHE STRING "The ${_component} CFLAGS.")
-  set(${_component}_VERSION      ${PC_${_component}_VERSION}      CACHE STRING "The ${_component} version number.")
-
-  set_component_found(${_component})
-
-  mark_as_advanced(
-    ${_component}_INCLUDE_DIRS
-    ${_component}_LIBRARIES
-    ${_component}_DEFINITIONS
-    ${_component}_VERSION)
-
-endmacro()
-
-
-# Check for cached results. If there are skip the costly part.
-if (NOT FFMPEG_LIBRARIES)
-
-  # Check for all possible component.
-  find_component(AVCODEC  libavcodec  avcodec  libavcodec/avcodec.h)
-  find_component(AVFORMAT libavformat avformat libavformat/avformat.h)
-  find_component(AVDEVICE libavdevice avdevice libavdevice/avdevice.h)
-  find_component(AVUTIL   libavutil   avutil   libavutil/avutil.h)
-  find_component(SWSCALE  libswscale  swscale  libswscale/swscale.h)
-  find_component(POSTPROC libpostproc postproc libpostproc/postprocess.h)
-
-  # Check if the required components were found and add their stuff to the FFMPEG_* vars.
-  foreach (_component ${FFmpeg_FIND_COMPONENTS})
-    if (${_component}_FOUND)
-      # message(STATUS "Required component ${_component} present.")
-      set(FFMPEG_LIBRARIES   ${FFMPEG_LIBRARIES}   ${${_component}_LIBRARIES})
-      set(FFMPEG_DEFINITIONS ${FFMPEG_DEFINITIONS} ${${_component}_DEFINITIONS})
-      list(APPEND FFMPEG_INCLUDE_DIRS ${${_component}_INCLUDE_DIRS})
-    else ()
-      # message(STATUS "Required component ${_component} missing.")
-    endif ()
-  endforeach ()
-
-  # Build the include path with duplicates removed.
-  if (FFMPEG_INCLUDE_DIRS)
-    list(REMOVE_DUPLICATES FFMPEG_INCLUDE_DIRS)
-  endif ()
-
-  # cache the vars.
-  set(FFMPEG_INCLUDE_DIRS ${FFMPEG_INCLUDE_DIRS} CACHE STRING "The FFmpeg include directories." FORCE)
-  set(FFMPEG_LIBRARIES    ${FFMPEG_LIBRARIES}    CACHE STRING "The FFmpeg libraries." FORCE)
-  set(FFMPEG_DEFINITIONS  ${FFMPEG_DEFINITIONS}  CACHE STRING "The FFmpeg cflags." FORCE)
-
-  mark_as_advanced(FFMPEG_INCLUDE_DIRS
-                   FFMPEG_LIBRARIES
-                   FFMPEG_DEFINITIONS)
-
-endif ()
-
-# Now set the noncached _FOUND vars for the components.
-foreach (_component AVCODEC AVDEVICE AVFORMAT AVUTIL POSTPROCESS SWSCALE)
-  set_component_found(${_component})
-endforeach ()
-
-# Compile the list of required vars
-set(_FFmpeg_REQUIRED_VARS FFMPEG_LIBRARIES FFMPEG_INCLUDE_DIRS)
-foreach (_component ${FFmpeg_FIND_COMPONENTS})
-  list(APPEND _FFmpeg_REQUIRED_VARS ${_component}_LIBRARIES ${_component}_INCLUDE_DIRS)
-endforeach ()
-
-# On OS X we ffmpeg libraries depend on VideoDecodeAcceleration and CoreVideo frameworks
-IF (APPLE)
-	SET(FFMPEG_EXTRA_LINKING_OPTIONS "-framework VideoDecodeAcceleration -framework CoreVideo -lbz2")
-ENDIF()
-
-# Give a nice error message if some of the required vars are missing.
-find_package_handle_standard_args(FFmpeg DEFAULT_MSG ${_FFmpeg_REQUIRED_VARS})

+ 0 - 50
cmake_modules/FindLuaJIT.cmake

@@ -1,50 +0,0 @@
-# Locate LuaJIT library
-# This module defines
-#  LUAJIT_FOUND, if false, do not try to link to Lua
-#  LUA_INCLUDE_DIR, where to find lua.h
-#  LUA_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
-#
-# This module is similar to FindLua51.cmake except that it finds LuaJit instead.
-
-FIND_PATH(LUA_INCLUDE_DIR luajit.h
-	HINTS
-	$ENV{LUA_DIR}
-	PATH_SUFFIXES include/luajit include/luajit-2.1 include/luajit-2.0 include/luajit-5_1-2.1 include/luajit-5_1-2.0 include
-	PATHS
-	~/Library/Frameworks
-	/Library/Frameworks
-	/sw # Fink
-	/opt/local # DarwinPorts
-	/opt/csw # Blastwave
-	/opt
-)
-
-FIND_LIBRARY(LUA_LIBRARY
-	NAMES luajit-5.1 lua51
-	HINTS
-	$ENV{LUA_DIR}
-	PATH_SUFFIXES lib64 lib
-	PATHS
-	~/Library/Frameworks
-	/Library/Frameworks
-	/sw
-	/opt/local
-	/opt/csw
-	/opt
-)
-
-IF(LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/luajit.h")
-	FILE(STRINGS "${LUA_INCLUDE_DIR}/luajit.h" lua_version_str REGEX "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT .+\"")
-
-	STRING(REGEX REPLACE "^#define[ \t]+LUA_RELEASE[ \t]+\"LuaJIT ([^\"]+)\".*" "\\1" LUA_VERSION_STRING "${lua_version_str}")
-	UNSET(lua_version_str)
-ENDIF()
-
-INCLUDE(FindPackageHandleStandardArgs)
-# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if
-# all listed variables are TRUE
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(LuaJit
-	REQUIRED_VARS LUA_LIBRARY LUA_INCLUDE_DIR
-	VERSION_VAR LUA_VERSION_STRING)
-
-MARK_AS_ADVANCED(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY)

+ 309 - 137
cmake_modules/FindSDL2.cmake

@@ -1,196 +1,298 @@
-#.rst:
-# FindSDL2
-# --------
-#
-# Locate SDL2 library
-#
-# This module defines
-#
-# ::
-#
-#   SDL2_LIBRARY, the name of the library to link against
-#   SDL2_FOUND, if false, do not try to link to SDL
-#   SDL2_INCLUDE_DIR, where to find SDL.h
-#   SDL2_VERSION_STRING, human-readable string containing the version of SDL
-#
-#
-#
-# This module responds to the flag:
-#
-# ::
-#
-#   SDL2_BUILDING_LIBRARY
-#     If this is defined, then no SDL2_main will be linked in because
-#     only applications need main().
-#     Otherwise, it is assumed you are building an application and this
-#     module will attempt to locate and set the proper link flags
-#     as part of the returned SDL2_LIBRARY variable.
-#
-#
-#
-# Don't forget to include SDLmain.h and SDLmain.m your project for the
-# OS X framework based version.  (Other versions link to -lSDL2main which
-# this module will try to find on your behalf.) Also for OS X, this
-# module will automatically add the -framework Cocoa on your behalf.
-#
-#
-#
-# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your
-# configuration and no SDL2_LIBRARY, it means CMake did not find your SDL
-# library (SDL2.dll, libSDL2.so, SDL.framework, etc).  Set
-# SDL2_LIBRARY_TEMP to point to your SDL library, and configure again.
-# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this
-# value as appropriate.  These values are used to generate the final
-# SDL2_LIBRARY variable, but when these values are unset, SDL2_LIBRARY
-# does not get created.
-#
-#
-#
-# $SDL2DIR is an environment variable that would correspond to the
-# ./configure --prefix=$SDL2DIR used in building SDL.  l.e.galup 9-20-02
-#
-# Modified by Eric Wing.  Added code to assist with automated building
-# by using environmental variables and providing a more
-# controlled/consistent search behavior.  Added new modifications to
-# recognize OS X frameworks and additional Unix paths (FreeBSD, etc).
-# Also corrected the header search path to follow "proper" SDL
-# guidelines.  Added a search for SDLmain which is needed by some
-# platforms.  Added a search for threads which is needed by some
-# platforms.  Added needed compile switches for MinGW.
-#
-# On OSX, this will prefer the Framework version (if found) over others.
-# People will have to manually change the cache values of SDL2_LIBRARY to
-# override this selection or set the CMake environment
-# CMAKE_INCLUDE_PATH to modify the search paths.
-#
-
-#=============================================================================
-# Copyright 2003-2009 Kitware, Inc.
-# Copyright 2012 Benjamin Eikel
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file kitware license.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
-if (NOT WIN32)
-    find_package(PkgConfig)
-    if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_SDL2 sdl2)
-        set(SDL2_VERSION_STRING ${_SDL2_VERSION})
-    endif ()
-endif ()
-
-find_path(SDL2_INCLUDE_DIR 
-    SDL.h
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#  Copyright 2019 Amine Ben Hassouna <[email protected]>
+#  Copyright 2000-2019 Kitware, Inc. and Contributors
+#  All rights reserved.
+
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+
+#  * Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+
+#  * Neither the name of Kitware, Inc. nor the names of Contributors
+#    may be used to endorse or promote products derived from this
+#    software without specific prior written permission.
+
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#[=======================================================================[.rst:
+FindSDL2
+--------
+
+Locate SDL2 library
+
+This module defines the following 'IMPORTED' targets:
+
+::
+
+  SDL2::SDL2
+    The SDL2 library, if found.
+    Libraries should link to SDL2::SDL2
+
+  SDL2::SDL2main
+    The SDL2main library, if found.
+    Applications should link to SDL2::SDL2main instead of SDL2::SDL2
+
+
+
+This module will set the following variables in your project:
+
+::
+
+  SDL2_LIBRARIES, the name of the library to link against
+  SDL2_INCLUDE_DIRS, where to find SDL.h
+  SDL2_FOUND, if false, do not try to link to SDL2
+  SDL2MAIN_FOUND, if false, do not try to link to SDL2main
+  SDL2_VERSION_STRING, human-readable string containing the version of SDL2
+
+
+
+This module responds to the following cache variables:
+
+::
+
+  SDL2_PATH
+    Set a custom SDL2 Library path (default: empty)
+
+  SDL2_NO_DEFAULT_PATH
+    Disable search SDL2 Library in default path.
+      If SDL2_PATH (default: ON)
+      Else (default: OFF)
+
+  SDL2_INCLUDE_DIR
+    SDL2 headers path.
+
+  SDL2_LIBRARY
+    SDL2 Library (.dll, .so, .a, etc) path.
+
+  SDL2MAIN_LIBRAY
+    SDL2main Library (.a) path.
+
+  SDL2_BUILDING_LIBRARY
+    This flag is useful only when linking to SDL2_LIBRARIES insead of
+    SDL2::SDL2main. It is required only when building a library that links to
+    SDL2_LIBRARIES, because only applications need main() (No need to also
+    link to SDL2main).
+    If this flag is defined, then no SDL2main will be added to SDL2_LIBRARIES
+    and no SDL2::SDL2main target will be created.
+
+
+Don't forget to include SDLmain.h and SDLmain.m in your project for the
+OS X framework based version. (Other versions link to -lSDL2main which
+this module will try to find on your behalf.) Also for OS X, this
+module will automatically add the -framework Cocoa on your behalf.
+
+
+Additional Note: If you see an empty SDL2_LIBRARY in your project
+configuration, it means CMake did not find your SDL2 library
+(SDL2.dll, libsdl2.so, SDL2.framework, etc). Set SDL2_LIBRARY to point
+to your SDL2 library, and  configure again. Similarly, if you see an
+empty SDL2MAIN_LIBRARY, you should set this value as appropriate. These
+values are used to generate the final SDL2_LIBRARIES variable and the
+SDL2::SDL2 and SDL2::SDL2main targets, but when these values are unset,
+SDL2_LIBRARIES, SDL2::SDL2 and SDL2::SDL2main does not get created.
+
+
+$SDL2DIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2DIR used in building SDL2.  l.e.galup 9-20-02
+
+
+
+Created by Amine Ben Hassouna:
+  Adapt FindSDL.cmake to SDL2 (FindSDL2.cmake).
+  Add cache variables for more flexibility:
+    SDL2_PATH, SDL2_NO_DEFAULT_PATH (for details, see doc above).
+  Mark 'Threads' as a required dependency for non-OSX systems.
+  Modernize the FindSDL2.cmake module by creating specific targets:
+    SDL2::SDL2 and SDL2::SDL2main (for details, see doc above).
+
+
+Original FindSDL.cmake module:
+  Modified by Eric Wing.  Added code to assist with automated building
+  by using environmental variables and providing a more
+  controlled/consistent search behavior.  Added new modifications to
+  recognize OS X frameworks and additional Unix paths (FreeBSD, etc).
+  Also corrected the header search path to follow "proper" SDL
+  guidelines.  Added a search for SDLmain which is needed by some
+  platforms.  Added a search for threads which is needed by some
+  platforms.  Added needed compile switches for MinGW.
+
+On OSX, this will prefer the Framework version (if found) over others.
+People will have to manually change the cache value of SDL2_LIBRARY to
+override this selection or set the SDL2_PATH variable or the CMake
+environment CMAKE_INCLUDE_PATH to modify the search paths.
+
+Note that the header path has changed from SDL/SDL.h to just SDL.h
+This needed to change because "proper" SDL convention is #include
+"SDL.h", not <SDL/SDL.h>.  This is done for portability reasons
+because not all systems place things in SDL/ (see FreeBSD).
+#]=======================================================================]
+
+# Define options for searching SDL2 Library in a custom path
+
+set(SDL2_PATH "" CACHE STRING "Custom SDL2 Library path")
+
+set(_SDL2_NO_DEFAULT_PATH OFF)
+if(SDL2_PATH)
+  set(_SDL2_NO_DEFAULT_PATH ON)
+endif()
+
+set(SDL2_NO_DEFAULT_PATH ${_SDL2_NO_DEFAULT_PATH}
+    CACHE BOOL "Disable search SDL2 Library in default path")
+unset(_SDL2_NO_DEFAULT_PATH)
+
+set(SDL2_NO_DEFAULT_PATH_CMD)
+if(SDL2_NO_DEFAULT_PATH)
+  set(SDL2_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH)
+endif()
+
+# Search for the SDL2 include directory
+find_path(SDL2_INCLUDE_DIR SDL.h
   HINTS
   HINTS
-    ${_SDL2_INCLUDEDIR}
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    SDL2
-    include/SDL2 
-    include
+    ${SDL2_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES SDL2
+                # path suffixes to search inside ENV{SDL2DIR}
+                include/SDL2 include
+  PATHS ${SDL2_PATH}
+  DOC "Where the SDL2 headers can be found"
 )
 )
 
 
+set(SDL2_INCLUDE_DIRS "${SDL2_INCLUDE_DIR}")
+
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
   set(VC_LIB_PATH_SUFFIX lib/x64)
   set(VC_LIB_PATH_SUFFIX lib/x64)
 else()
 else()
   set(VC_LIB_PATH_SUFFIX lib/x86)
   set(VC_LIB_PATH_SUFFIX lib/x86)
 endif()
 endif()
 
 
-find_library(SDL2_LIBRARY_TEMP
-  NAMES 
-    SDL2
+# SDL-2.0 is the name used by FreeBSD ports...
+# don't confuse it for the version number.
+find_library(SDL2_LIBRARY
+  NAMES SDL2 SDL-2.0
   HINTS
   HINTS
-    ${_SDL2_LIBDIR}
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    lib 
-    ${VC_LIB_PATH_SUFFIX}
+    ${SDL2_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+  PATHS ${SDL2_PATH}
+  DOC "Where the SDL2 Library can be found"
 )
 )
 
 
+set(SDL2_LIBRARIES "${SDL2_LIBRARY}")
+
 if(NOT SDL2_BUILDING_LIBRARY)
 if(NOT SDL2_BUILDING_LIBRARY)
-  if(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework")
+  if(NOT SDL2_INCLUDE_DIR MATCHES ".framework")
     # Non-OS X framework versions expect you to also dynamically link to
     # Non-OS X framework versions expect you to also dynamically link to
-    # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms
-    # seem to provide SDLmain for compatibility even though they don't
+    # SDL2main. This is mainly for Windows and OS X. Other (Unix) platforms
+    # seem to provide SDL2main for compatibility even though they don't
     # necessarily need it.
     # necessarily need it.
+
+    if(SDL2_PATH)
+      set(SDL2MAIN_LIBRARY_PATHS "${SDL2_PATH}")
+    endif()
+
+    if(NOT SDL2_NO_DEFAULT_PATH)
+      set(SDL2MAIN_LIBRARY_PATHS
+            /sw
+            /opt/local
+            /opt/csw
+            /opt
+            "${SDL2MAIN_LIBRARY_PATHS}"
+      )
+    endif()
+
     find_library(SDL2MAIN_LIBRARY
     find_library(SDL2MAIN_LIBRARY
-      NAMES 
-        SDL2main
+      NAMES SDL2main
       HINTS
       HINTS
         ENV SDL2DIR
         ENV SDL2DIR
-      PATH_SUFFIXES 
-        lib
-        ${VC_LIB_PATH_SUFFIX}
-      PATHS
-        /sw
-        /opt/local
-        /opt/csw
-        /opt
+        ${SDL2_NO_DEFAULT_PATH_CMD}
+      PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+      PATHS ${SDL2MAIN_LIBRARY_PATHS}
+      DOC "Where the SDL2main library can be found"
     )
     )
+    unset(SDL2MAIN_LIBRARY_PATHS)
   endif()
   endif()
 endif()
 endif()
 
 
-# SDL may require threads on your system.
+# SDL2 may require threads on your system.
 # The Apple build may not need an explicit flag because one of the
 # The Apple build may not need an explicit flag because one of the
 # frameworks may already provide it.
 # frameworks may already provide it.
 # But for non-OSX systems, I will use the CMake Threads package.
 # But for non-OSX systems, I will use the CMake Threads package.
 if(NOT APPLE)
 if(NOT APPLE)
-  find_package(Threads)
+  find_package(Threads QUIET)
+  if(NOT Threads_FOUND)
+    set(SDL2_THREADS_NOT_FOUND "Could NOT find Threads (Threads is required by SDL2).")
+    if(SDL2_FIND_REQUIRED)
+      message(FATAL_ERROR ${SDL2_THREADS_NOT_FOUND})
+    else()
+        if(NOT SDL2_FIND_QUIETLY)
+          message(STATUS ${SDL2_THREADS_NOT_FOUND})
+        endif()
+      return()
+    endif()
+    unset(SDL2_THREADS_NOT_FOUND)
+  endif()
 endif()
 endif()
 
 
-# MinGW needs an additional library, mwindows
-# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -lmwindows
-# (Actually on second look, I think it only needs one of the m* libraries.)
+# MinGW needs an additional link flag, -mwindows
+# It's total link flags should look like -lmingw32 -lSDL2main -lSDL2 -mwindows
 if(MINGW)
 if(MINGW)
-  set(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW")
+  set(MINGW32_LIBRARY mingw32 "-mwindows" CACHE STRING "link flags for MinGW")
 endif()
 endif()
 
 
-if(SDL2_LIBRARY_TEMP)
-  # For SDLmain
+if(SDL2_LIBRARY)
+  # For SDL2main
   if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
   if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY)
-    list(FIND SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX)
+    list(FIND SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX)
     if(_SDL2_MAIN_INDEX EQUAL -1)
     if(_SDL2_MAIN_INDEX EQUAL -1)
-      set(SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP})
+      set(SDL2_LIBRARIES "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARIES})
     endif()
     endif()
     unset(_SDL2_MAIN_INDEX)
     unset(_SDL2_MAIN_INDEX)
   endif()
   endif()
 
 
-  # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa.
+  # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
   # CMake doesn't display the -framework Cocoa string in the UI even
   # CMake doesn't display the -framework Cocoa string in the UI even
   # though it actually is there if I modify a pre-used variable.
   # though it actually is there if I modify a pre-used variable.
   # I think it has something to do with the CACHE STRING.
   # I think it has something to do with the CACHE STRING.
   # So I use a temporary variable until the end so I can set the
   # So I use a temporary variable until the end so I can set the
   # "real" variable in one-shot.
   # "real" variable in one-shot.
   if(APPLE)
   if(APPLE)
-    set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa")
+    set(SDL2_LIBRARIES ${SDL2_LIBRARIES} -framework Cocoa)
   endif()
   endif()
 
 
   # For threads, as mentioned Apple doesn't need this.
   # For threads, as mentioned Apple doesn't need this.
   # In fact, there seems to be a problem if I used the Threads package
   # In fact, there seems to be a problem if I used the Threads package
   # and try using this line, so I'm just skipping it entirely for OS X.
   # and try using this line, so I'm just skipping it entirely for OS X.
   if(NOT APPLE)
   if(NOT APPLE)
-    set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT})
+    set(SDL2_LIBRARIES ${SDL2_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
   endif()
   endif()
 
 
   # For MinGW library
   # For MinGW library
   if(MINGW)
   if(MINGW)
-    set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP})
+    set(SDL2_LIBRARIES ${MINGW32_LIBRARY} ${SDL2_LIBRARIES})
   endif()
   endif()
 
 
-  # Set the final string here so the GUI reflects the final state.
-  set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found")
-  # Set the temp variable to INTERNAL so it is not seen in the CMake GUI
-  set(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "")
 endif()
 endif()
 
 
-if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h" AND NOT SDL2_VERSION_STRING)
+# Read SDL2 version
+if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_INCLUDE_DIR}/SDL_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_PATCHLEVEL[ \t]+[0-9]+$")
@@ -206,11 +308,81 @@ if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL_version.h" AND NOT SDL2_
   unset(SDL2_VERSION_PATCH)
   unset(SDL2_VERSION_PATCH)
 endif()
 endif()
 
 
-set(SDL2_LIBRARIES ${SDL2_LIBRARY})
-set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR})
-
 include(FindPackageHandleStandardArgs)
 include(FindPackageHandleStandardArgs)
 
 
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2
                                   REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR
                                   REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR
                                   VERSION_VAR SDL2_VERSION_STRING)
                                   VERSION_VAR SDL2_VERSION_STRING)
+
+if(SDL2MAIN_LIBRARY)
+  FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2main
+                                    REQUIRED_VARS SDL2MAIN_LIBRARY SDL2_INCLUDE_DIR
+                                    VERSION_VAR SDL2_VERSION_STRING)
+endif()
+
+
+mark_as_advanced(SDL2_PATH
+                 SDL2_NO_DEFAULT_PATH
+                 SDL2_LIBRARY
+                 SDL2MAIN_LIBRARY
+                 SDL2_INCLUDE_DIR
+                 SDL2_BUILDING_LIBRARY)
+
+
+# SDL2:: targets (SDL2::SDL2 and SDL2::SDL2main)
+if(SDL2_FOUND)
+
+  # SDL2::SDL2 target
+  if(SDL2_LIBRARY AND NOT TARGET SDL2::SDL2)
+    add_library(SDL2::SDL2 UNKNOWN IMPORTED)
+    set_target_properties(SDL2::SDL2 PROPERTIES
+                          IMPORTED_LOCATION "${SDL2_LIBRARY}"
+                          INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_DIR}")
+
+    if(APPLE)
+      # For OS X, SDL2 uses Cocoa as a backend so it must link to Cocoa.
+      # For more details, please see above.
+      set_property(TARGET SDL2::SDL2 APPEND PROPERTY
+                   INTERFACE_LINK_OPTIONS -framework Cocoa)
+    else()
+      # For threads, as mentioned Apple doesn't need this.
+      # For more details, please see above.
+      set_property(TARGET SDL2::SDL2 APPEND PROPERTY
+                   INTERFACE_LINK_LIBRARIES Threads::Threads)
+    endif()
+  endif()
+
+  # SDL2::SDL2main target
+  # Applications should link to SDL2::SDL2main instead of SDL2::SDL2
+  # For more details, please see above.
+  if(NOT SDL2_BUILDING_LIBRARY AND NOT TARGET SDL2::SDL2main)
+
+    if(SDL2_INCLUDE_DIR MATCHES ".framework" OR NOT SDL2MAIN_LIBRARY)
+      add_library(SDL2::SDL2main INTERFACE IMPORTED)
+      set_property(TARGET SDL2::SDL2main PROPERTY
+                   INTERFACE_LINK_LIBRARIES SDL2::SDL2)
+    elseif(SDL2MAIN_LIBRARY)
+      # MinGW requires that the mingw32 library is specified before the
+      # libSDL2main.a static library when linking.
+      # The SDL2::SDL2mainInternal target is used internally to make sure that
+      # CMake respects this condition.
+      add_library(SDL2::SDL2mainInternal UNKNOWN IMPORTED)
+      set_property(TARGET SDL2::SDL2mainInternal PROPERTY
+                   IMPORTED_LOCATION "${SDL2MAIN_LIBRARY}")
+      set_property(TARGET SDL2::SDL2mainInternal PROPERTY
+                   INTERFACE_LINK_LIBRARIES SDL2::SDL2)
+
+      add_library(SDL2::SDL2main INTERFACE IMPORTED)
+
+      if(MINGW)
+        # MinGW needs an additional link flag '-mwindows' and link to mingw32
+        set_property(TARGET SDL2::SDL2main PROPERTY
+                     INTERFACE_LINK_LIBRARIES "mingw32" "-mwindows")
+      endif()
+
+      set_property(TARGET SDL2::SDL2main APPEND PROPERTY
+                   INTERFACE_LINK_LIBRARIES SDL2::SDL2mainInternal)
+    endif()
+
+  endif()
+endif()

+ 192 - 61
cmake_modules/FindSDL2_image.cmake

@@ -1,57 +1,172 @@
-#.rst:
-# FindSDL2_image
-# --------------
-#
-# Locate SDL2_image library
-#
-# This module defines:
-#
-# ::
-#
-#   SDL2_IMAGE_LIBRARIES, the name of the library to link against
-#   SDL2_IMAGE_INCLUDE_DIRS, where to find the headers
-#   SDL2_IMAGE_FOUND, if false, do not try to link against
-#   SDL2_IMAGE_VERSION_STRING - human-readable string containing the version of SDL2_image
-#
-# $SDL2DIR is an environment variable that would correspond to the
-# ./configure --prefix=$SDL2DIR used in building SDL.
-#
-# Created by Eric Wing.  This was influenced by the FindSDL2.cmake
-# module, but with modifications to recognize OS X frameworks and
-# additional Unix paths (FreeBSD, etc).
-
-#=============================================================================
-# Copyright 2005-2009 Kitware, Inc.
-# Copyright 2012 Benjamin Eikel
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file kitware license.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
-if (NOT WIN32)
-    find_package(PkgConfig)
-    if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_SDL2_IMAGE SDL2_image)
-        set(SDL2_IMAGE_VERSION_STRING ${_SDL2_IMAGE_VERSION})
-    endif ()
-endif ()
-
-find_path(SDL2_IMAGE_INCLUDE_DIR
-    SDL_image.h
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#  Copyright 2019 Amine Ben Hassouna <[email protected]>
+#  Copyright 2000-2019 Kitware, Inc. and Contributors
+#  All rights reserved.
+
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+
+#  * Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+
+#  * Neither the name of Kitware, Inc. nor the names of Contributors
+#    may be used to endorse or promote products derived from this
+#    software without specific prior written permission.
+
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#[=======================================================================[.rst:
+FindSDL2_image
+--------------
+
+Locate SDL2_image library
+
+This module defines the following 'IMPORTED' target:
+
+::
+
+  SDL2::Image
+    The SDL2_image library, if found.
+    Have SDL2::SDL2 as a link dependency.
+
+
+
+This module will set the following variables in your project:
+
+::
+
+  SDL2_IMAGE_LIBRARIES, the name of the library to link against
+  SDL2_IMAGE_INCLUDE_DIRS, where to find the headers
+  SDL2_IMAGE_FOUND, if false, do not try to link against
+  SDL2_IMAGE_VERSION_STRING - human-readable string containing the
+                              version of SDL2_image
+
+
+
+This module responds to the following cache variables:
+
+::
+
+  SDL2_IMAGE_PATH
+    Set a custom SDL2_image Library path (default: empty)
+
+  SDL2_IMAGE_NO_DEFAULT_PATH
+    Disable search SDL2_image Library in default path.
+      If SDL2_IMAGE_PATH (default: ON)
+      Else (default: OFF)
+
+  SDL2_IMAGE_INCLUDE_DIR
+    SDL2_image headers path.
+
+  SDL2_IMAGE_LIBRARY
+    SDL2_image Library (.dll, .so, .a, etc) path.
+
+
+Additional Note: If you see an empty SDL2_IMAGE_LIBRARY in your project
+configuration, it means CMake did not find your SDL2_image library
+(SDL2_image.dll, libsdl2_image.so, etc). Set SDL2_IMAGE_LIBRARY to point
+to your SDL2_image library, and  configure again. This value is used to
+generate the final SDL2_IMAGE_LIBRARIES variable and the SDL2::Image target,
+but when this value is unset, SDL2_IMAGE_LIBRARIES and SDL2::Image does not
+get created.
+
+
+$SDL2IMAGEDIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2IMAGEDIR used in building SDL2_image.
+
+$SDL2DIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2DIR used in building SDL2.
+
+
+
+Created by Amine Ben Hassouna:
+  Adapt FindSDL_image.cmake to SDL2_image (FindSDL2_image.cmake).
+  Add cache variables for more flexibility:
+    SDL2_IMAGE_PATH, SDL2_IMAGE_NO_DEFAULT_PATH (for details, see doc above).
+  Add SDL2 as a required dependency.
+  Modernize the FindSDL2_image.cmake module by creating a specific target:
+    SDL2::Image (for details, see doc above).
+
+Original FindSDL_image.cmake module:
+  Created by Eric Wing.  This was influenced by the FindSDL.cmake
+  module, but with modifications to recognize OS X frameworks and
+  additional Unix paths (FreeBSD, etc).
+#]=======================================================================]
+
+# SDL2 Library required
+find_package(SDL2 QUIET)
+if(NOT SDL2_FOUND)
+  set(SDL2_IMAGE_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_image).")
+  if(SDL2_image_FIND_REQUIRED)
+    message(FATAL_ERROR ${SDL2_IMAGE_SDL2_NOT_FOUND})
+  else()
+      if(NOT SDL2_image_FIND_QUIETLY)
+        message(STATUS ${SDL2_IMAGE_SDL2_NOT_FOUND})
+      endif()
+    return()
+  endif()
+  unset(SDL2_IMAGE_SDL2_NOT_FOUND)
+endif()
+
+#Try config mode first - conan hack
+include(FindPackageHandleStandardArgs)
+
+find_package(sdl_image CONFIG QUIET)
+if(TARGET sdl_image::sdl_image)
+	add_library(SDL2::Image ALIAS sdl_image::sdl_image)
+  find_package_handle_standard_args(SDL2_image
+                                    REQUIRED_VARS sdl_image_LIBRARIES sdl_image_INCLUDE_DIRS
+                                    VERSION_VAR sdl_image_VERSION_STRING)
+  return()
+endif()
+
+# Define options for searching SDL2_image Library in a custom path
+
+set(SDL2_IMAGE_PATH "" CACHE STRING "Custom SDL2_image Library path")
+
+set(_SDL2_IMAGE_NO_DEFAULT_PATH OFF)
+if(SDL2_IMAGE_PATH)
+  set(_SDL2_IMAGE_NO_DEFAULT_PATH ON)
+endif()
+
+set(SDL2_IMAGE_NO_DEFAULT_PATH ${_SDL2_IMAGE_NO_DEFAULT_PATH}
+    CACHE BOOL "Disable search SDL2_image Library in default path")
+unset(_SDL2_IMAGE_NO_DEFAULT_PATH)
+
+set(SDL2_IMAGE_NO_DEFAULT_PATH_CMD)
+if(SDL2_IMAGE_NO_DEFAULT_PATH)
+  set(SDL2_IMAGE_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH)
+endif()
+
+# Search for the SDL2_image include directory
+find_path(SDL2_IMAGE_INCLUDE_DIR SDL_image.h
   HINTS
   HINTS
-    ${_SDL2_IMAGE_INCLUDEDIR}
     ENV SDL2IMAGEDIR
     ENV SDL2IMAGEDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    SDL2
-    include/SDL2 
-    include
+    ${SDL2_IMAGE_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES SDL2
+                # path suffixes to search inside ENV{SDL2DIR}
+                # and ENV{SDL2IMAGEDIR}
+                include/SDL2 include
+  PATHS ${SDL2_IMAGE_PATH}
+  DOC "Where the SDL2_image headers can be found"
 )
 )
 
 
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@@ -60,19 +175,20 @@ else()
   set(VC_LIB_PATH_SUFFIX lib/x86)
   set(VC_LIB_PATH_SUFFIX lib/x86)
 endif()
 endif()
 
 
+# Search for the SDL2_image library
 find_library(SDL2_IMAGE_LIBRARY
 find_library(SDL2_IMAGE_LIBRARY
-  NAMES 
-    SDL2_image
+  NAMES SDL2_image
   HINTS
   HINTS
-    ${_SDL2_IMAGE_LIBDIR}
     ENV SDL2IMAGEDIR
     ENV SDL2IMAGEDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    lib 
-    ${VC_LIB_PATH_SUFFIX}
+    ${SDL2_IMAGE_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+  PATHS ${SDL2_IMAGE_PATH}
+  DOC "Where the SDL2_image Library can be found"
 )
 )
 
 
-if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" AND NOT SDL2_IMAGE_VERSION_STRING)
+# Read SDL2_image version
+if(SDL2_IMAGE_INCLUDE_DIR AND EXISTS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_IMAGE_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_IMAGE_INCLUDE_DIR}/SDL_image.h" SDL2_IMAGE_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_IMAGE_PATCHLEVEL[ \t]+[0-9]+$")
@@ -91,10 +207,25 @@ endif()
 set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY})
 set(SDL2_IMAGE_LIBRARIES ${SDL2_IMAGE_LIBRARY})
 set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})
 set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR})
 
 
-include(FindPackageHandleStandardArgs)
-
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
 FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_image
                                   REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
                                   REQUIRED_VARS SDL2_IMAGE_LIBRARIES SDL2_IMAGE_INCLUDE_DIRS
                                   VERSION_VAR SDL2_IMAGE_VERSION_STRING)
                                   VERSION_VAR SDL2_IMAGE_VERSION_STRING)
 
 
-mark_as_advanced(SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR)
+
+mark_as_advanced(SDL2_IMAGE_PATH
+                 SDL2_IMAGE_NO_DEFAULT_PATH
+                 SDL2_IMAGE_LIBRARY
+                 SDL2_IMAGE_INCLUDE_DIR)
+
+
+if(SDL2_IMAGE_FOUND)
+
+  # SDL2::Image target
+  if(SDL2_IMAGE_LIBRARY AND NOT TARGET SDL2::Image)
+    add_library(SDL2::Image UNKNOWN IMPORTED)
+    set_target_properties(SDL2::Image PROPERTIES
+                          IMPORTED_LOCATION "${SDL2_IMAGE_LIBRARY}"
+                          INTERFACE_INCLUDE_DIRECTORIES "${SDL2_IMAGE_INCLUDE_DIR}"
+                          INTERFACE_LINK_LIBRARIES SDL2::SDL2)
+  endif()
+endif()

+ 179 - 60
cmake_modules/FindSDL2_mixer.cmake

@@ -1,58 +1,159 @@
-#.rst:
-# FindSDL2_mixer
-# --------------
-#
-# Locate SDL2_mixer library
-#
-# This module defines:
-#
-# ::
-#
-#   SDL2_MIXER_LIBRARIES, the name of the library to link against
-#   SDL2_MIXER_INCLUDE_DIRS, where to find the headers
-#   SDL2_MIXER_FOUND, if false, do not try to link against
-#   SDL2_MIXER_VERSION_STRING - human-readable string containing the version of SDL_mixer
-#
-# $SDL2DIR is an environment variable that would correspond to the
-# ./configure --prefix=$SDL2DIR used in building SDL.
-#
-# Created by Eric Wing.  This was influenced by the FindSDL2.cmake
-# module, but with modifications to recognize OS X frameworks and
-# additional Unix paths (FreeBSD, etc).
-
-#=============================================================================
-# Copyright 2005-2009 Kitware, Inc.
-# Copyright 2012 Benjamin Eikel
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file kitware license.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
-if (NOT WIN32)
-    find_package(PkgConfig)
-    if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_SDL2_MIXER SDL2_mixer)
-        set(SDL2_MIXER_STRING ${_SDL2_MIXER_VERSION})
-    endif ()
-endif ()
-
-
-find_path(SDL2_MIXER_INCLUDE_DIR 
-    SDL_mixer.h
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#  Copyright 2019 Amine Ben Hassouna <[email protected]>
+#  Copyright 2000-2019 Kitware, Inc. and Contributors
+#  All rights reserved.
+
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+
+#  * Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+
+#  * Neither the name of Kitware, Inc. nor the names of Contributors
+#    may be used to endorse or promote products derived from this
+#    software without specific prior written permission.
+
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#[=======================================================================[.rst:
+FindSDL2_mixer
+--------------
+
+Locate SDL2_mixer library
+
+This module defines the following 'IMPORTED' target:
+
+::
+
+  SDL2::Mixer
+    The SDL2_mixer library, if found.
+    Have SDL2::SDL2 as a link dependency.
+
+
+
+This module will set the following variables in your project:
+
+::
+
+  SDL2_MIXER_LIBRARIES, the name of the library to link against
+  SDL2_MIXER_INCLUDE_DIRS, where to find the headers
+  SDL2_MIXER_FOUND, if false, do not try to link against
+  SDL2_MIXER_VERSION_STRING - human-readable string containing the
+                              version of SDL2_mixer
+
+This module responds to the following cache variables:
+
+::
+
+  SDL2_MIXER_PATH
+    Set a custom SDL2_mixer Library path (default: empty)
+
+  SDL2_MIXER_NO_DEFAULT_PATH
+    Disable search SDL2_mixer Library in default path.
+      If SDL2_MIXER_PATH (default: ON)
+      Else (default: OFF)
+
+  SDL2_MIXER_INCLUDE_DIR
+    SDL2_mixer headers path.
+
+  SDL2_MIXER_LIBRARY
+    SDL2_mixer Library (.dll, .so, .a, etc) path.
+
+
+Additional Note: If you see an empty SDL2_MIXER_LIBRARY in your project
+configuration, it means CMake did not find your SDL2_mixer library
+(SDL2_mixer.dll, libsdl2_mixer.so, etc). Set SDL2_MIXER_LIBRARY to point
+to your SDL2_mixer library, and  configure again. This value is used to
+generate the final SDL2_MIXER_LIBRARIES variable and the SDL2::Mixer target,
+but when this value is unset, SDL2_MIXER_LIBRARIES and SDL2::Mixer does not
+get created.
+
+
+$SDL2MIXERDIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2MIXERDIR used in building SDL2_mixer.
+
+$SDL2DIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2DIR used in building SDL2.
+
+
+
+Created by Amine Ben Hassouna:
+  Adapt FindSDL_mixer.cmake to SDL2_mixer (FindSDL2_mixer.cmake).
+  Add cache variables for more flexibility:
+    SDL2_MIXER_PATH, SDL2_MIXER_NO_DEFAULT_PATH (for details, see doc above).
+  Add SDL2 as a required dependency.
+  Modernize the FindSDL2_mixer.cmake module by creating a specific target:
+    SDL2::Mixer (for details, see doc above).
+
+Original FindSDL_mixer.cmake module:
+  Created by Eric Wing.  This was influenced by the FindSDL.cmake
+  module, but with modifications to recognize OS X frameworks and
+  additional Unix paths (FreeBSD, etc).
+#]=======================================================================]
+
+# SDL2 Library required
+find_package(SDL2 QUIET)
+if(NOT SDL2_FOUND)
+  set(SDL2_MIXER_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_mixer).")
+  if(SDL2_mixer_FIND_REQUIRED)
+    message(FATAL_ERROR ${SDL2_MIXER_SDL2_NOT_FOUND})
+  else()
+      if(NOT SDL2_mixer_FIND_QUIETLY)
+        message(STATUS ${SDL2_MIXER_SDL2_NOT_FOUND})
+      endif()
+    return()
+  endif()
+  unset(SDL2_MIXER_SDL2_NOT_FOUND)
+endif()
+
+
+# Define options for searching SDL2_mixer Library in a custom path
+
+set(SDL2_MIXER_PATH "" CACHE STRING "Custom SDL2_mixer Library path")
+
+set(_SDL2_MIXER_NO_DEFAULT_PATH OFF)
+if(SDL2_MIXER_PATH)
+  set(_SDL2_MIXER_NO_DEFAULT_PATH ON)
+endif()
+
+set(SDL2_MIXER_NO_DEFAULT_PATH ${_SDL2_MIXER_NO_DEFAULT_PATH}
+    CACHE BOOL "Disable search SDL2_mixer Library in default path")
+unset(_SDL2_MIXER_NO_DEFAULT_PATH)
+
+set(SDL2_MIXER_NO_DEFAULT_PATH_CMD)
+if(SDL2_MIXER_NO_DEFAULT_PATH)
+  set(SDL2_MIXER_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH)
+endif()
+
+# Search for the SDL2_mixer include directory
+find_path(SDL2_MIXER_INCLUDE_DIR SDL_mixer.h
   HINTS
   HINTS
-    ${_SDL2_MIXER_INCLUDEDIR}
     ENV SDL2MIXERDIR
     ENV SDL2MIXERDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES
-    SDL2
-    include/SDL2 
-    include
+    ${SDL2_MIXER_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES SDL2
+                # path suffixes to search inside ENV{SDL2DIR}
+                # and ENV{SDL2MIXERDIR}
+                include/SDL2 include
+  PATHS ${SDL2_MIXER_PATH}
+  DOC "Where the SDL2_mixer headers can be found"
 )
 )
 
 
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@@ -61,19 +162,20 @@ else()
   set(VC_LIB_PATH_SUFFIX lib/x86)
   set(VC_LIB_PATH_SUFFIX lib/x86)
 endif()
 endif()
 
 
+# Search for the SDL2_mixer library
 find_library(SDL2_MIXER_LIBRARY
 find_library(SDL2_MIXER_LIBRARY
-  NAMES 
-    SDL2_mixer
+  NAMES SDL2_mixer
   HINTS
   HINTS
-    ${_SDL2_MIXER_LIBDIR}
     ENV SDL2MIXERDIR
     ENV SDL2MIXERDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    lib
-    ${VC_LIB_PATH_SUFFIX}
+    ${SDL2_MIXER_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+  PATHS ${SDL2_MIXER_PATH}
+  DOC "Where the SDL2_mixer Library can be found"
 )
 )
 
 
-if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" AND NOT SDL2_MIXER_STRING)
+# Read SDL2_mixer version
+if(SDL2_MIXER_INCLUDE_DIR AND EXISTS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_MIXER_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_MIXER_INCLUDE_DIR}/SDL_mixer.h" SDL2_MIXER_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_MIXER_PATCHLEVEL[ \t]+[0-9]+$")
@@ -98,4 +200,21 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_mixer
                                   REQUIRED_VARS SDL2_MIXER_LIBRARIES SDL2_MIXER_INCLUDE_DIRS
                                   REQUIRED_VARS SDL2_MIXER_LIBRARIES SDL2_MIXER_INCLUDE_DIRS
                                   VERSION_VAR SDL2_MIXER_VERSION_STRING)
                                   VERSION_VAR SDL2_MIXER_VERSION_STRING)
 
 
-mark_as_advanced(SDL2_MIXER_LIBRARY SDL2_MIXER_INCLUDE_DIR)
+
+mark_as_advanced(SDL2_MIXER_PATH
+                 SDL2_MIXER_NO_DEFAULT_PATH
+                 SDL2_MIXER_LIBRARY
+                 SDL2_MIXER_INCLUDE_DIR)
+
+
+if(SDL2_MIXER_FOUND)
+
+  # SDL2::Mixer target
+  if(SDL2_MIXER_LIBRARY AND NOT TARGET SDL2::Mixer)
+    add_library(SDL2::Mixer UNKNOWN IMPORTED)
+    set_target_properties(SDL2::Mixer PROPERTIES
+                          IMPORTED_LOCATION "${SDL2_MIXER_LIBRARY}"
+                          INTERFACE_INCLUDE_DIRECTORIES "${SDL2_MIXER_INCLUDE_DIR}"
+                          INTERFACE_LINK_LIBRARIES SDL2::SDL2)
+  endif()
+endif()

+ 181 - 59
cmake_modules/FindSDL2_ttf.cmake

@@ -1,57 +1,161 @@
-#.rst:
-# FindSDL2_ttf
-# ------------
-#
-# Locate SDL2_ttf library
-#
-# This module defines:
-#
-# ::
-#
-#   SDL2_TTF_LIBRARIES, the name of the library to link against
-#   SDL2_TTF_INCLUDE_DIRS, where to find the headers
-#   SDL2_TTF_FOUND, if false, do not try to link against
-#   SDL2_TTF_VERSION_STRING - human-readable string containing the version of SDL2_ttf
-#
-# $SDL2DIR is an environment variable that would correspond to the
-# ./configure --prefix=$SDL2DIR used in building SDL.
-#
-# Created by Eric Wing.  This was influenced by the FindSDL2.cmake
-# module, but with modifications to recognize OS X frameworks and
-# additional Unix paths (FreeBSD, etc).
-
-#=============================================================================
-# Copyright 2005-2009 Kitware, Inc.
-# Copyright 2012 Benjamin Eikel
-#
-# Distributed under the OSI-approved BSD License (the "License");
-# see accompanying file kitware license.txt for details.
-#
-# This software is distributed WITHOUT ANY WARRANTY; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-# See the License for more information.
-#=============================================================================
-# (To distribute this file outside of CMake, substitute the full
-#  License text for the above reference.)
-
-if (NOT WIN32)
-    find_package(PkgConfig)
-    if (PKG_CONFIG_FOUND)
-        pkg_check_modules(_SDL2_TTF SDL2_ttf)
-        set(SDL2_TTF_VERSION_STRING ${_SDL2_TTF_VERSION})
-    endif ()
-endif ()
-
-find_path(SDL2_TTF_INCLUDE_DIR
-    SDL_ttf.h
+# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
+# file Copyright.txt or https://cmake.org/licensing for details.
+
+#  Copyright 2019 Amine Ben Hassouna <[email protected]>
+#  Copyright 2000-2019 Kitware, Inc. and Contributors
+#  All rights reserved.
+
+#  Redistribution and use in source and binary forms, with or without
+#  modification, are permitted provided that the following conditions
+#  are met:
+
+#  * Redistributions of source code must retain the above copyright
+#    notice, this list of conditions and the following disclaimer.
+
+#  * Redistributions in binary form must reproduce the above copyright
+#    notice, this list of conditions and the following disclaimer in the
+#    documentation and/or other materials provided with the distribution.
+
+#  * Neither the name of Kitware, Inc. nor the names of Contributors
+#    may be used to endorse or promote products derived from this
+#    software without specific prior written permission.
+
+#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+#  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#[=======================================================================[.rst:
+FindSDL2_ttf
+------------
+
+Locate SDL2_ttf library
+
+This module defines the following 'IMPORTED' target:
+
+::
+
+  SDL2::TTF
+    The SDL2_ttf library, if found.
+    Have SDL2::SDL2 as a link dependency.
+
+
+
+This module will set the following variables in your project:
+
+::
+
+  SDL2_TTF_LIBRARIES, the name of the library to link against
+  SDL2_TTF_INCLUDE_DIRS, where to find the headers
+  SDL2_TTF_FOUND, if false, do not try to link against
+  SDL2_TTF_VERSION_STRING - human-readable string containing the
+                            version of SDL2_ttf
+
+
+
+This module responds to the following cache variables:
+
+::
+
+  SDL2_TTF_PATH
+    Set a custom SDL2_ttf Library path (default: empty)
+
+  SDL2_TTF_NO_DEFAULT_PATH
+    Disable search SDL2_ttf Library in default path.
+      If SDL2_TTF_PATH (default: ON)
+      Else (default: OFF)
+
+  SDL2_TTF_INCLUDE_DIR
+    SDL2_ttf headers path.
+
+  SDL2_TTF_LIBRARY
+    SDL2_ttf Library (.dll, .so, .a, etc) path.
+
+
+Additional Note: If you see an empty SDL2_TTF_LIBRARY in your project
+configuration, it means CMake did not find your SDL2_ttf library
+(SDL2_ttf.dll, libsdl2_ttf.so, etc). Set SDL2_TTF_LIBRARY to point
+to your SDL2_ttf library, and  configure again. This value is used to
+generate the final SDL2_TTF_LIBRARIES variable and the SDL2::TTF target,
+but when this value is unset, SDL2_TTF_LIBRARIES and SDL2::TTF does not
+get created.
+
+
+$SDL2TTFDIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2TTFDIR used in building SDL2_ttf.
+
+$SDL2DIR is an environment variable that would correspond to the
+./configure --prefix=$SDL2DIR used in building SDL2.
+
+
+
+Created by Amine Ben Hassouna:
+  Adapt FindSDL_ttf.cmake to SDL2_ttf (FindSDL2_ttf.cmake).
+  Add cache variables for more flexibility:
+    SDL2_TTF_PATH, SDL2_TTF_NO_DEFAULT_PATH (for details, see doc above).
+  Add SDL2 as a required dependency.
+  Modernize the FindSDL2_ttf.cmake module by creating a specific target:
+    SDL2::TTF (for details, see doc above).
+
+Original FindSDL_ttf.cmake module:
+  Created by Eric Wing.  This was influenced by the FindSDL.cmake
+  module, but with modifications to recognize OS X frameworks and
+  additional Unix paths (FreeBSD, etc).
+#]=======================================================================]
+
+# SDL2 Library required
+find_package(SDL2 QUIET)
+if(NOT SDL2_FOUND)
+  set(SDL2_TTF_SDL2_NOT_FOUND "Could NOT find SDL2 (SDL2 is required by SDL2_ttf).")
+  if(SDL2_ttf_FIND_REQUIRED)
+    message(FATAL_ERROR ${SDL2_TTF_SDL2_NOT_FOUND})
+  else()
+      if(NOT SDL2_ttf_FIND_QUIETLY)
+        message(STATUS ${SDL2_TTF_SDL2_NOT_FOUND})
+      endif()
+    return()
+  endif()
+  unset(SDL2_TTF_SDL2_NOT_FOUND)
+endif()
+
+
+# Define options for searching SDL2_ttf Library in a custom path
+
+set(SDL2_TTF_PATH "" CACHE STRING "Custom SDL2_ttf Library path")
+
+set(_SDL2_TTF_NO_DEFAULT_PATH OFF)
+if(SDL2_TTF_PATH)
+  set(_SDL2_TTF_NO_DEFAULT_PATH ON)
+endif()
+
+set(SDL2_TTF_NO_DEFAULT_PATH ${_SDL2_TTF_NO_DEFAULT_PATH}
+    CACHE BOOL "Disable search SDL2_ttf Library in default path")
+unset(_SDL2_TTF_NO_DEFAULT_PATH)
+
+set(SDL2_TTF_NO_DEFAULT_PATH_CMD)
+if(SDL2_TTF_NO_DEFAULT_PATH)
+  set(SDL2_TTF_NO_DEFAULT_PATH_CMD NO_DEFAULT_PATH)
+endif()
+
+# Search for the SDL2_ttf include directory
+find_path(SDL2_TTF_INCLUDE_DIR SDL_ttf.h
   HINTS
   HINTS
-    ${_SDL2_TTF_INCLUDEDIR}
     ENV SDL2TTFDIR
     ENV SDL2TTFDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES
-    SDL2
-    include/SDL2
-    include
+    ${SDL2_TTF_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES SDL2
+                # path suffixes to search inside ENV{SDL2DIR}
+                # and ENV{SDL2TTFDIR}
+                include/SDL2 include
+  PATHS ${SDL2_TTF_PATH}
+  DOC "Where the SDL2_ttf headers can be found"
 )
 )
 
 
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
 if(CMAKE_SIZEOF_VOID_P EQUAL 8)
@@ -60,19 +164,20 @@ else()
   set(VC_LIB_PATH_SUFFIX lib/x86)
   set(VC_LIB_PATH_SUFFIX lib/x86)
 endif()
 endif()
 
 
+# Search for the SDL2_ttf library
 find_library(SDL2_TTF_LIBRARY
 find_library(SDL2_TTF_LIBRARY
-  NAMES 
-    SDL2_ttf
+  NAMES SDL2_ttf
   HINTS
   HINTS
-    ${_SDL2_TTF_LIBDIR}
     ENV SDL2TTFDIR
     ENV SDL2TTFDIR
     ENV SDL2DIR
     ENV SDL2DIR
-  PATH_SUFFIXES 
-    lib 
-    ${VC_LIB_PATH_SUFFIX}
+    ${SDL2_TTF_NO_DEFAULT_PATH_CMD}
+  PATH_SUFFIXES lib ${VC_LIB_PATH_SUFFIX}
+  PATHS ${SDL2_TTF_PATH}
+  DOC "Where the SDL2_ttf Library can be found"
 )
 )
 
 
-if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" AND NOT SDL2_TTF_VERSION_STRING)
+# Read SDL2_ttf version
+if(SDL2_TTF_INCLUDE_DIR AND EXISTS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL_TTF_MAJOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL_TTF_MINOR_VERSION[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+[0-9]+$")
   file(STRINGS "${SDL2_TTF_INCLUDE_DIR}/SDL_ttf.h" SDL2_TTF_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL_TTF_PATCHLEVEL[ \t]+[0-9]+$")
@@ -97,4 +202,21 @@ FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2_ttf
                                   REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS
                                   REQUIRED_VARS SDL2_TTF_LIBRARIES SDL2_TTF_INCLUDE_DIRS
                                   VERSION_VAR SDL2_TTF_VERSION_STRING)
                                   VERSION_VAR SDL2_TTF_VERSION_STRING)
 
 
-mark_as_advanced(SDL2_TTF_LIBRARY SDL2_TTF_INCLUDE_DIR)
+
+mark_as_advanced(SDL2_TTF_PATH
+                 SDL2_TTF_NO_DEFAULT_PATH
+                 SDL2_TTF_LIBRARY
+                 SDL2_TTF_INCLUDE_DIR)
+
+
+if(SDL2_TTF_FOUND)
+
+  # SDL2::TTF target
+  if(SDL2_TTF_LIBRARY AND NOT TARGET SDL2::TTF)
+    add_library(SDL2::TTF UNKNOWN IMPORTED)
+    set_target_properties(SDL2::TTF PROPERTIES
+                          IMPORTED_LOCATION "${SDL2_TTF_LIBRARY}"
+                          INTERFACE_INCLUDE_DIRECTORIES "${SDL2_TTF_INCLUDE_DIR}"
+                          INTERFACE_LINK_LIBRARIES SDL2::SDL2)
+  endif()
+endif()

+ 6 - 15
cmake_modules/FindTBB.cmake

@@ -3,7 +3,7 @@
 #  find_package(TBB
 #  find_package(TBB
 #    [REQUIRED]             # Fail with error if TBB is not found
 #    [REQUIRED]             # Fail with error if TBB is not found
 #    )                      #
 #    )                      #
-# Once done, this will define 
+# Once done, this will define
 #
 #
 #  TBB_FOUND - system has TBB
 #  TBB_FOUND - system has TBB
 #  TBB_INCLUDE_DIRS - the TBB include directories
 #  TBB_INCLUDE_DIRS - the TBB include directories
@@ -67,38 +67,29 @@
 #=============================================================================
 #=============================================================================
 #  FindTBB helper functions and macros
 #  FindTBB helper functions and macros
 #
 #
-message("** Looking for TBB...")
 
 
 # Use TBBConfig.cmake if possible.
 # Use TBBConfig.cmake if possible.
-set(_tbb_find_quiet)
 
 
+set(_tbb_find_quiet)
 if (TBB_FIND_QUIETLY)
 if (TBB_FIND_QUIETLY)
   set(_tbb_find_quiet QUIET)
   set(_tbb_find_quiet QUIET)
 endif ()
 endif ()
-
 set(_tbb_find_components)
 set(_tbb_find_components)
 set(_tbb_find_optional_components)
 set(_tbb_find_optional_components)
-
 foreach (_tbb_find_component IN LISTS TBB_FIND_COMPONENTS)
 foreach (_tbb_find_component IN LISTS TBB_FIND_COMPONENTS)
   if (TBB_FIND_REQUIRED_${_tbb_find_component})
   if (TBB_FIND_REQUIRED_${_tbb_find_component})
-	list(APPEND _tbb_find_components "${_tbb_find_component}")
+    list(APPEND _tbb_find_components "${_tbb_find_component}")
   else ()
   else ()
-	list(APPEND _tbb_find_optional_components "${_tbb_find_component}")
+    list(APPEND _tbb_find_optional_components "${_tbb_find_component}")
   endif ()
   endif ()
 endforeach ()
 endforeach ()
-
 unset(_tbb_find_component)
 unset(_tbb_find_component)
-
 find_package(TBB CONFIG ${_tbb_find_quiet}
 find_package(TBB CONFIG ${_tbb_find_quiet}
   COMPONENTS ${_tbb_find_components}
   COMPONENTS ${_tbb_find_components}
   OPTIONAL_COMPONENTS ${_tbb_find_optional_components})
   OPTIONAL_COMPONENTS ${_tbb_find_optional_components})
-  
 unset(_tbb_find_quiet)
 unset(_tbb_find_quiet)
 unset(_tbb_find_components)
 unset(_tbb_find_components)
 unset(_tbb_find_optional_components)
 unset(_tbb_find_optional_components)
-
-set(TBB_LIBRARIES ${TBB_IMPORTED_TARGETS})
-
 if (TBB_FOUND)
 if (TBB_FOUND)
   return ()
   return ()
 endif ()
 endif ()
@@ -373,7 +364,7 @@ get_debug_names(TBB_LIBRARY_NAMES)
 
 
 
 
 find_path(TBB_INCLUDE_DIR
 find_path(TBB_INCLUDE_DIR
-          NAMES tbb/tbb_stddef.h
+          NAMES tbb/tbb.h
           PATHS ${TBB_INC_SEARCH_PATH})
           PATHS ${TBB_INC_SEARCH_PATH})
 
 
 find_library(TBB_LIBRARY_RELEASE
 find_library(TBB_LIBRARY_RELEASE
@@ -462,4 +453,4 @@ if(NOT TBB_VERSION)
         ".*#define TBB_COMPATIBLE_INTERFACE_VERSION ([0-9]+).*" "\\1"
         ".*#define TBB_COMPATIBLE_INTERFACE_VERSION ([0-9]+).*" "\\1"
         TBB_COMPATIBLE_INTERFACE_VERSION "${TBB_VERSION_CONTENTS}")
         TBB_COMPATIBLE_INTERFACE_VERSION "${TBB_VERSION_CONTENTS}")
 
 
-endif()
+endif()

+ 196 - 0
cmake_modules/Findffmpeg.cmake

@@ -0,0 +1,196 @@
+
+#[==[
+Provides the following variables:
+
+  * `ffmpeg_INCLUDE_DIRS`: Include directories necessary to use FFMPEG.
+  * `ffmpeg_LIBRARIES`: Libraries necessary to use FFMPEG. Note that this only
+    includes libraries for the components requested.
+  * `ffmpeg_VERSION`: The version of FFMPEG found.
+
+The following components are supported:
+
+  * `avcodec`
+  * `avdevice`
+  * `avfilter`
+  * `avformat`
+  * `avresample`
+  * `avutil`
+  * `swresample`
+  * `swscale`
+
+For each component, the following are provided:
+
+  * `ffmpeg_<component>_FOUND`: Libraries for the component.
+  * `ffmpeg_<component>_INCLUDE_DIRS`: Include directories for
+    the component.
+  * `ffmpeg_<component>_LIBRARIES`: Libraries for the component.
+  * `ffmpeg::<component>`: A target to use with `target_link_libraries`.
+
+Note that only components requested with `COMPONENTS` or `OPTIONAL_COMPONENTS`
+are guaranteed to set these variables or provide targets.
+#]==]
+
+function (_ffmpeg_find component headername)
+  find_path("ffmpeg_${component}_INCLUDE_DIR"
+    NAMES
+      "lib${component}/${headername}"
+    PATHS
+      "${ffmpeg_ROOT}/include"
+      ~/Library/Frameworks
+      /Library/Frameworks
+      /usr/local/include
+      /usr/include
+      /sw/include # Fink
+      /opt/local/include # DarwinPorts
+      /opt/csw/include # Blastwave
+      /opt/include
+      /usr/freeware/include
+    PATH_SUFFIXES
+      ffmpeg
+    DOC "FFMPEG's ${component} include directory")
+  mark_as_advanced("ffmpeg_${component}_INCLUDE_DIR")
+
+  # On Windows, static FFMPEG is sometimes built as `lib<name>.a`.
+  if (WIN32)
+    list(APPEND CMAKE_FIND_LIBRARY_SUFFIXES ".a" ".lib")
+    list(APPEND CMAKE_FIND_LIBRARY_PREFIXES "" "lib")
+  endif ()
+
+  find_library("ffmpeg_${component}_LIBRARY"
+    NAMES
+      "${component}"
+    PATHS
+      "${ffmpeg_ROOT}/lib"
+      ~/Library/Frameworks
+      /Library/Frameworks
+      /usr/local/lib
+      /usr/local/lib64
+      /usr/lib
+      /usr/lib64
+      /sw/lib
+      /opt/local/lib
+      /opt/csw/lib
+      /opt/lib
+      /usr/freeware/lib64
+      "${ffmpeg_ROOT}/bin"
+    DOC "FFMPEG's ${component} library")
+  mark_as_advanced("ffmpeg_${component}_LIBRARY")
+
+  if (ffmpeg_${component}_LIBRARY AND ffmpeg_${component}_INCLUDE_DIR)
+    set(_deps_found TRUE)
+    set(_deps_link)
+    foreach (_ffmpeg_dep IN LISTS ARGN)
+      if (TARGET "ffmpeg::${_ffmpeg_dep}")
+        list(APPEND _deps_link "ffmpeg::${_ffmpeg_dep}")
+      else ()
+        set(_deps_found FALSE)
+      endif ()
+    endforeach ()
+    if (_deps_found)
+      if (NOT TARGET "ffmpeg::${component}")
+        add_library("ffmpeg::${component}" UNKNOWN IMPORTED)
+        set_target_properties("ffmpeg::${component}" PROPERTIES
+          IMPORTED_LOCATION "${ffmpeg_${component}_LIBRARY}"
+          INTERFACE_INCLUDE_DIRECTORIES "${ffmpeg_${component}_INCLUDE_DIR}"
+          IMPORTED_LINK_INTERFACE_LIBRARIES "${_deps_link}")
+      endif ()
+      set("ffmpeg_${component}_FOUND" 1
+        PARENT_SCOPE)
+
+      set(version_header_path "${ffmpeg_${component}_INCLUDE_DIR}/lib${component}/version.h")
+      if (EXISTS "${version_header_path}")
+        string(TOUPPER "${component}" component_upper)
+        file(STRINGS "${version_header_path}" version
+          REGEX "#define  *LIB${component_upper}_VERSION_(MAJOR|MINOR|MICRO) ")
+        string(REGEX REPLACE ".*_MAJOR *\([0-9]*\).*" "\\1" major "${version}")
+        string(REGEX REPLACE ".*_MINOR *\([0-9]*\).*" "\\1" minor "${version}")
+        string(REGEX REPLACE ".*_MICRO *\([0-9]*\).*" "\\1" micro "${version}")
+        if (NOT major STREQUAL "" AND
+            NOT minor STREQUAL "" AND
+            NOT micro STREQUAL "")
+          set("ffmpeg_${component}_VERSION" "${major}.${minor}.${micro}"
+            PARENT_SCOPE)
+        endif ()
+      endif ()
+    else ()
+      set("ffmpeg_${component}_FOUND" 0
+        PARENT_SCOPE)
+      set(what)
+      if (NOT ffmpeg_${component}_LIBRARY)
+        set(what "library")
+      endif ()
+      if (NOT ffmpeg_${component}_INCLUDE_DIR)
+        if (what)
+          string(APPEND what " or headers")
+        else ()
+          set(what "headers")
+        endif ()
+      endif ()
+      set("ffmpeg_${component}_NOT_FOUND_MESSAGE"
+        "Could not find the ${what} for ${component}."
+        PARENT_SCOPE)
+    endif ()
+  endif ()
+endfunction ()
+
+_ffmpeg_find(avutil     avutil.h)
+_ffmpeg_find(avresample avresample.h
+  avutil)
+_ffmpeg_find(swresample swresample.h
+  avutil)
+_ffmpeg_find(swscale    swscale.h
+  avutil)
+_ffmpeg_find(avcodec    avcodec.h
+  avutil)
+_ffmpeg_find(avformat   avformat.h
+  avcodec avutil)
+_ffmpeg_find(avfilter   avfilter.h
+  avutil)
+_ffmpeg_find(avdevice   avdevice.h
+  avformat avutil)
+
+if (TARGET ffmpeg::avutil)
+  set(_ffmpeg_version_header_path "${ffmpeg_avutil_INCLUDE_DIR}/libavutil/ffversion.h")
+  if (EXISTS "${_ffmpeg_version_header_path}")
+    file(STRINGS "${_ffmpeg_version_header_path}" _ffmpeg_version
+      REGEX "FFMPEG_VERSION")
+    string(REGEX REPLACE ".*\"n?\(.*\)\"" "\\1" ffmpeg_VERSION "${_ffmpeg_version}")
+    unset(_ffmpeg_version)
+  else ()
+    set(ffmpeg_VERSION ffmpeg_VERSION-NOTFOUND)
+  endif ()
+  unset(_ffmpeg_version_header_path)
+endif ()
+
+set(ffmpeg_INCLUDE_DIRS)
+set(ffmpeg_LIBRARIES)
+set(_ffmpeg_required_vars)
+foreach (_ffmpeg_component IN LISTS ffmpeg_FIND_COMPONENTS)
+  if (TARGET "ffmpeg::${_ffmpeg_component}")
+    set(ffmpeg_${_ffmpeg_component}_INCLUDE_DIRS
+      "${ffmpeg_${_ffmpeg_component}_INCLUDE_DIR}")
+    set(ffmpeg_${_ffmpeg_component}_LIBRARIES
+      "${ffmpeg_${_ffmpeg_component}_LIBRARY}")
+    list(APPEND ffmpeg_INCLUDE_DIRS
+      "${ffmpeg_${_ffmpeg_component}_INCLUDE_DIRS}")
+    list(APPEND ffmpeg_LIBRARIES
+      "${ffmpeg_${_ffmpeg_component}_LIBRARIES}")
+    if (FFMEG_FIND_REQUIRED_${_ffmpeg_component})
+      list(APPEND _ffmpeg_required_vars
+        "ffmpeg_${_ffmpeg_required_vars}_INCLUDE_DIRS"
+        "ffmpeg_${_ffmpeg_required_vars}_LIBRARIES")
+    endif ()
+  endif ()
+endforeach ()
+unset(_ffmpeg_component)
+
+if (ffmpeg_INCLUDE_DIRS)
+  list(REMOVE_DUPLICATES ffmpeg_INCLUDE_DIRS)
+endif ()
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(ffmpeg
+  REQUIRED_VARS ffmpeg_INCLUDE_DIRS ffmpeg_LIBRARIES ${_ffmpeg_required_vars}
+  VERSION_VAR ffmpeg_VERSION
+  HANDLE_COMPONENTS)
+unset(_ffmpeg_required_vars)

+ 15 - 7
cmake_modules/FindFuzzyLite.cmake → cmake_modules/Findfuzzylite.cmake

@@ -19,7 +19,7 @@
 # (To distribute this file outside of CMake, substitute the full
 # (To distribute this file outside of CMake, substitute the full
 #  License text for the above reference.)
 #  License text for the above reference.)
 
 
-find_path(FL_INCLUDE_DIR 
+find_path(fuzzylite_INCLUDE_DIR 
     fl/fuzzylite.h
     fl/fuzzylite.h
   HINTS
   HINTS
     ENV FLDIR
     ENV FLDIR
@@ -35,7 +35,7 @@ else()
   set(VC_LIB_PATH_SUFFIX lib/x86)
   set(VC_LIB_PATH_SUFFIX lib/x86)
 endif()
 endif()
 
 
-find_library(FL_LIBRARY
+find_library(fuzzylite_LIBRARY
   NAMES 
   NAMES 
     fuzzylite
     fuzzylite
   HINTS
   HINTS
@@ -46,12 +46,20 @@ find_library(FL_LIBRARY
     ${VC_LIB_PATH_SUFFIX}
     ${VC_LIB_PATH_SUFFIX}
 )
 )
 
 
-set(FL_LIBRARIES ${FL_LIBRARY})
-set(FL_INCLUDE_DIRS ${FL_INCLUDE_DIR})
+set(fuzzylite_LIBRARIES ${fuzzylite_LIBRARY})
+set(fuzzylite_INCLUDE_DIRS ${fuzzylite_INCLUDE_DIR})
 
 
 include(FindPackageHandleStandardArgs)
 include(FindPackageHandleStandardArgs)
 
 
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(FL
-                                  REQUIRED_VARS FL_LIBRARIES FL_INCLUDE_DIRS)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(fuzzylite
+                                  REQUIRED_VARS fuzzylite_LIBRARIES fuzzylite_INCLUDE_DIRS)
 
 
-mark_as_advanced(FL_LIBRARY FL_INCLUDE_DIR)
+if (NOT TARGET "fuzzylite::fuzzylite" AND fuzzylite_FOUND)
+	add_library(fuzzylite::fuzzylite UNKNOWN IMPORTED)
+	set_target_properties(fuzzylite::fuzzylite PROPERTIES
+		INTERFACE_INCLUDE_DIRECTORIES "${fuzzylite_INCLUDE_DIR}")
+	set_target_properties(fuzzylite::fuzzylite PROPERTIES
+		IMPORTED_LOCATION "${fuzzylite_LIBRARY}")
+endif()
+
+mark_as_advanced(fuzzylite_LIBRARY fuzzylite_INCLUDE_DIR)

+ 58 - 0
cmake_modules/Findluajit.cmake

@@ -0,0 +1,58 @@
+# Locate LuaJIT library
+# This module defines
+#  LUAJIT_FOUND, if false, do not try to link to Lua
+#  luajit_INCLUDE_DIR, where to find lua.h
+#  luajit_VERSION_STRING, the version of Lua found (since CMake 2.8.8)
+#
+# This module is similar to FindLua51.cmake except that it finds LuaJit instead.
+
+FIND_PATH(luajit_INCLUDE_DIR luajit.h
+	HINTS
+	$ENV{luajit_DIR}
+	PATH_SUFFIXES include/luajit include/luajit-2.1 include/luajit-2.0 include/luajit-5_1-2.1 include/luajit-5_1-2.0 include
+	PATHS
+	~/Library/Frameworks
+	/Library/Frameworks
+	/sw # Fink
+	/opt/local # DarwinPorts
+	/opt/csw # Blastwave
+	/opt
+)
+
+FIND_LIBRARY(luajit_LIBRARY
+	NAMES luajit-5.1 lua51
+	HINTS
+	$ENV{luajit_DIR}
+	PATH_SUFFIXES lib64 lib
+	PATHS
+	~/Library/Frameworks
+	/Library/Frameworks
+	/sw
+	/opt/local
+	/opt/csw
+	/opt
+)
+
+IF(luajit_INCLUDE_DIR AND EXISTS "${luajit_INCLUDE_DIR}/luajit.h")
+	FILE(STRINGS "${luajit_INCLUDE_DIR}/luajit.h" luajit_version_str REGEX "^#define[ \t]+luajit_RELEASE[ \t]+\"LuaJIT .+\"")
+
+	STRING(REGEX REPLACE "^#define[ \t]+luajit_RELEASE[ \t]+\"LuaJIT ([^\"]+)\".*" "\\1" luajit_VERSION_STRING "${luajit_version_str}")
+	UNSET(luajit_version_str)
+ENDIF()
+
+INCLUDE(FindPackageHandleStandardArgs)
+# handle the QUIETLY and REQUIRED arguments and set LUAJIT_FOUND to TRUE if
+# all listed variables are TRUE
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(luajit
+	REQUIRED_VARS luajit_LIBRARY luajit_INCLUDE_DIR
+	VERSION_VAR luajit_VERSION_STRING)
+
+if (NOT TARGET "luajit::luajit" AND luajit_FOUND)
+	add_library(luajit::luajit UNKNOWN IMPORTED)
+	set_target_properties(luajit::luajit PROPERTIES
+		INTERFACE_INCLUDE_DIRECTORIES "${luajit_INCLUDE_DIR}")
+	set_target_properties(luajit::luajit PROPERTIES
+		IMPORTED_LOCATION "${luajit_LIBRARY}")
+endif()
+
+MARK_AS_ADVANCED(luajit_INCLUDE_DIR luajit_LIBRARY)

+ 22 - 14
cmake_modules/FindMinizip.cmake → cmake_modules/Findminizip.cmake

@@ -8,10 +8,10 @@
 #
 #
 # ::
 # ::
 #
 #
-#   MINIZIP_LIBRARY, the name of the library to link against
-#   MINIZIP_FOUND, if false, do not try to link to Minizip
-#   MINIZIP_INCLUDE_DIR, where to find unzip.h
-#   MINIZIP_VERSION_STRING, human-readable string containing the version of Minizip
+#   minizip_LIBRARY, the name of the library to link against
+#   minizip_FOUND, if false, do not try to link to Minizip
+#   minizip_INCLUDE_DIR, where to find unzip.h
+#   minizip_VERSION_STRING, human-readable string containing the version of Minizip
 #
 #
 #=============================================================================
 #=============================================================================
 # Copyright 2003-2009 Kitware, Inc.
 # Copyright 2003-2009 Kitware, Inc.
@@ -37,36 +37,44 @@ if (NOT WIN32)
     find_package(PkgConfig)
     find_package(PkgConfig)
     if (PKG_CONFIG_FOUND)
     if (PKG_CONFIG_FOUND)
         pkg_check_modules(_MINIZIP minizip)
         pkg_check_modules(_MINIZIP minizip)
-        set(MINIZIP_VERSION_STRING ${_MINIZIP_VERSION})
+        set(minizip_VERSION_STRING ${_minizip_VERSION})
     endif ()
     endif ()
 endif ()
 endif ()
 
 
-find_path(MINIZIP_INCLUDE_DIR 
+find_path(minizip_INCLUDE_DIR 
     minizip/unzip.h
     minizip/unzip.h
   HINTS
   HINTS
-    ${_MINIZIP_INCLUDEDIR}
+    ${_minizip_INCLUDEDIR}
     ENV MINIZIPDIR
     ENV MINIZIPDIR
   PATH_SUFFIXES 
   PATH_SUFFIXES 
     MINIZIP
     MINIZIP
     include
     include
 )
 )
 
 
-find_library(MINIZIP_LIBRARY
+find_library(minizip_LIBRARY
   NAMES 
   NAMES 
     minizip
     minizip
   HINTS
   HINTS
-    ${_MINIZIP_LIBDIR}
+    ${_minizip_LIBDIR}
     ENV MINIZIPDIR
     ENV MINIZIPDIR
   PATH_SUFFIXES 
   PATH_SUFFIXES 
     lib 
     lib 
     ${VC_LIB_PATH_SUFFIX}
     ${VC_LIB_PATH_SUFFIX}
 )
 )
 
 
-set(MINIZIP_LIBRARIES ${MINIZIP_LIBRARY})
-set(MINIZIP_INCLUDE_DIRS ${MINIZIP_INCLUDE_DIR})
+set(minizip_LIBRARIES ${minizip_LIBRARY})
+set(minizip_INCLUDE_DIRS ${minizip_INCLUDE_DIR})
 
 
 include(FindPackageHandleStandardArgs)
 include(FindPackageHandleStandardArgs)
 
 
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(MINIZIP
-                                  REQUIRED_VARS MINIZIP_LIBRARY MINIZIP_INCLUDE_DIR
-                                  VERSION_VAR MINIZIP_VERSION_STRING)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(minizip
+                                  REQUIRED_VARS minizip_LIBRARY minizip_INCLUDE_DIR
+                                  VERSION_VAR minizip_VERSION_STRING)
+
+if (NOT TARGET "minizip::minizip" AND minizip_FOUND)
+	add_library(minizip::minizip UNKNOWN IMPORTED)
+	set_target_properties(minizip::minizip PROPERTIES
+		INTERFACE_INCLUDE_DIRECTORIES "${minizip_INCLUDE_DIR}")
+	set_target_properties(minizip::minizip PROPERTIES
+		IMPORTED_LOCATION "${minizip_LIBRARY}")
+endif()

+ 10 - 0
cmake_modules/VCMIUtils.cmake

@@ -124,3 +124,13 @@ function(vcmi_print_git_commit_hash)
 	message(STATUS "-- -- End of Git information")
 	message(STATUS "-- -- End of Git information")
 
 
 endfunction()
 endfunction()
+
+#install imported target on windows
+function(install_vcpkg_imported_tgt tgt)
+	get_target_property(TGT_LIB_LOCATION ${tgt} LOCATION)
+	get_filename_component(TGT_LIB_FOLDER ${TGT_LIB_LOCATION} PATH)
+	get_filename_component(tgt_name ${TGT_LIB_LOCATION} NAME_WE)
+	get_filename_component(TGT_DLL ${TGT_LIB_FOLDER}/../bin/${tgt_name}.dll ABSOLUTE)
+	message("${tgt_name}: ${TGT_DLL}")
+	install(FILES ${TGT_DLL} DESTINATION ${BIN_DIR})
+endfunction(install_vcpkg_imported_tgt)

+ 0 - 2
launcher/CMakeLists.txt

@@ -101,8 +101,6 @@ endif()
 target_link_libraries(vcmilauncher vcmi Qt5::Widgets Qt5::Network)
 target_link_libraries(vcmilauncher vcmi Qt5::Widgets Qt5::Network)
 target_include_directories(vcmilauncher
 target_include_directories(vcmilauncher
 	PUBLIC	${CMAKE_CURRENT_SOURCE_DIR}
 	PUBLIC	${CMAKE_CURRENT_SOURCE_DIR}
-	PRIVATE	${Qt5Widgets_INCLUDE_DIRS}
-	PRIVATE	${Qt5Network_INCLUDE_DIRS}
 )
 )
 vcmi_set_output_dir(vcmilauncher "")
 vcmi_set_output_dir(vcmilauncher "")
 
 

+ 2 - 5
lib/CMakeLists.txt

@@ -398,17 +398,14 @@ assign_source_group(${lib_SRCS} ${lib_HEADERS})
 add_library(vcmi SHARED ${lib_SRCS} ${lib_HEADERS})
 add_library(vcmi SHARED ${lib_SRCS} ${lib_HEADERS})
 set_target_properties(vcmi PROPERTIES COMPILE_DEFINITIONS "VCMI_DLL=1")
 set_target_properties(vcmi PROPERTIES COMPILE_DEFINITIONS "VCMI_DLL=1")
 target_link_libraries(vcmi PUBLIC
 target_link_libraries(vcmi PUBLIC
-		${MINIZIP_LIBRARIES} ${SDL2_LIBRARY} ${ZLIB_LIBRARIES}
-		${SYSTEM_LIBS} ${Boost_LIBRARIES}
+		minizip::minizip SDL2::SDL2 ZLIB::ZLIB
+		${SYSTEM_LIBS} Boost::boost Boost::thread Boost::filesystem Boost::program_options Boost::locale Boost::date_time
 )
 )
 
 
 target_include_directories(vcmi
 target_include_directories(vcmi
 	PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
 	PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
 	PUBLIC ${CMAKE_HOME_DIRECTORY}
 	PUBLIC ${CMAKE_HOME_DIRECTORY}
 	PUBLIC ${CMAKE_HOME_DIRECTORY}/include
 	PUBLIC ${CMAKE_HOME_DIRECTORY}/include
-	PUBLIC ${Boost_INCLUDE_DIRS}
-	PUBLIC ${ZLIB_INCLUDE_DIR}
-	PRIVATE ${SDL2_INCLUDE_DIR}
 )
 )
 
 
 if(WIN32)
 if(WIN32)

+ 1 - 5
osx/CMakeLists.txt

@@ -74,11 +74,7 @@ if(WIN32)
 	
 	
 	#TODO: check if some equivalent of block below can be used for above block (easy qt dependencies copy)
 	#TODO: check if some equivalent of block below can be used for above block (easy qt dependencies copy)
 	if(ENABLE_LUA)
 	if(ENABLE_LUA)
-		if(EXISTS ${LUA_INCLUDE_DIR}/../../bin/lua51.dll)
-			install(CODE "
-				file(COPY ${LUA_INCLUDE_DIR}/../../bin/lua51.dll DESTINATION \${CMAKE_INSTALL_PREFIX})
-			")
-		endif()
+		install_vcpkg_imported_tgt(luajit::luajit)
 	endif()
 	endif()
 
 
 	#LuaJIT will not be copied automatically by not meeting criteria for this block of code
 	#LuaJIT will not be copied automatically by not meeting criteria for this block of code

+ 1 - 1
scripting/erm/CMakeLists.txt

@@ -15,7 +15,7 @@ set(lib_HDRS
 )
 )
 
 
 add_library(vcmiERM SHARED ${lib_SRCS} ${lib_HDRS})
 add_library(vcmiERM SHARED ${lib_SRCS} ${lib_HDRS})
-target_link_libraries(vcmiERM ${Boost_LIBRARIES} vcmi)
+target_link_libraries(vcmiERM Boost::boost vcmi)
 
 
 vcmi_set_output_dir(vcmiERM "scripting")
 vcmi_set_output_dir(vcmiERM "scripting")
 
 

+ 1 - 1
scripting/lua/CMakeLists.txt

@@ -40,7 +40,7 @@ set(lib_SRCS
 )
 )
 
 
 add_library(vcmiLua SHARED ${lib_SRCS})
 add_library(vcmiLua SHARED ${lib_SRCS})
-target_link_libraries(vcmiLua ${Boost_LIBRARIES} ${LUA_LIBRARY} vcmi)
+target_link_libraries(vcmiLua Boost::boost luajit::luajit vcmi)
 
 
 vcmi_set_output_dir(vcmiLua "scripting")
 vcmi_set_output_dir(vcmiLua "scripting")
 
 

+ 1 - 1
server/CMakeLists.txt

@@ -28,7 +28,7 @@ set(server_LIBS vcmi)
 if(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
 if(CMAKE_SYSTEM_NAME MATCHES FreeBSD)
 	set(server_LIBS execinfo ${server_LIBS})
 	set(server_LIBS execinfo ${server_LIBS})
 endif()
 endif()
-target_link_libraries(vcmiserver PRIVATE ${server_LIBS})
+target_link_libraries(vcmiserver PRIVATE ${server_LIBS} minizip::minizip)
 
 
 target_include_directories(vcmiserver
 target_include_directories(vcmiserver
 	PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}
 	PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}