SDL_image: CMake fixes for Windows build

From f51f5f696abd75c82e12a527a4d8deb9c2ae9cc5 Mon Sep 17 00:00:00 2001
From: Elias Daler <[EMAIL REDACTED]>
Date: Mon, 29 Mar 2021 04:30:43 +0300
Subject: [PATCH] CMake fixes for Windows build

* Link to a correct SDL target depending on build type (static or
shared)
* Link to a correct libpng target based on build type
* Fix libjpeg build (not all needed sources were included)
* Fix showimage build on Windows - need to link to SDL2main
* Use bundled zlib for build
---
 .gitignore                      |  4 ++++
 CMakeLists.txt                  | 41 +++++++++++++++++++++++++++------
 external/jpeg-9d/CMakeLists.txt | 11 ++++++---
 3 files changed, 46 insertions(+), 10 deletions(-)

diff --git a/.gitignore b/.gitignore
index 5cb0260..e74da17 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,3 +25,7 @@ Release
 *.suo
 *.sdf
 *.opensdf
+
+# generated zlib files
+external/zlib-1.2.11/zconf.h
+external/zlib-1.2.11/zconf.h.included
\ No newline at end of file
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d37a25e..ce2737b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,8 +1,8 @@
 cmake_minimum_required(VERSION 3.3.2)
 project(SDL_image C)
 
-if (NOT ANDROID AND NOT TARGET SDL2)
-    find_package(SDL2 REQUIRED)
+if (NOT ANDROID AND NOT (TARGET SDL2 OR TARGET SDL2-static))
+	find_package(SDL2 REQUIRED)
 endif()
 
 option(SUPPORT_JPG "Support loading JPEG images" ON)
@@ -11,6 +11,10 @@ option(SUPPORT_WEBP "Support loading WEBP images" OFF)
 option(BUILD_SHOWIMAGE "Build the showimage sample program" OFF)
 option(BUILD_SHARED_LIBS "Build the library as a shared library" ON)
 
+if (NOT BUILD_SHARED_LIBS)
+	set(CMAKE_POSITION_INDEPENDENT_CODE ON)
+endif()
+
 add_library(SDL2_image)
 target_sources(SDL2_image PRIVATE IMG.c IMG_png.c IMG_bmp.c IMG_gif.c
 		IMG_jpg.c IMG_lbm.c IMG_pcx.c IMG_pnm.c IMG_svg.c IMG_tga.c
@@ -31,15 +35,35 @@ if (SUPPORT_PNG)
 	set(HAVE_LD_VERSION_SCRIPT OFF CACHE BOOL "" FORCE)
 	target_compile_definitions(SDL2_image PRIVATE -DLOAD_PNG)
 
+  if (NOT TARGET zlib)
+	add_subdirectory(external/zlib-1.2.11 "${CMAKE_CURRENT_BINARY_DIR}/external/zlib-1.2.11")
+	set(ZLIB_INCLUDE_DIR "external/zlib-1.2.11")
+	set(SKIP_INSTALL_ALL ON) # SDL_image doesn't support installing currently
+	if (BUILD_SHARED_LIBS)
+		set(ZLIB_LIBRARY zlib)
+	else()
+		set(ZLIB_LIBRARY zlibstatic)
+	endif()
+	target_include_directories(${ZLIB_LIBRARY} PUBLIC
+		"${ZLIB_INCLUDE_DIR}"
+		"${CMAKE_CURRENT_BINARY_DIR}/external/zlib-1.2.11" # zconf.h is generated there
+	)
+  endif()
+
 	add_subdirectory(external/libpng-1.6.37)
 	include_directories(external/libpng-1.6.37)
-	target_link_libraries(SDL2_image PRIVATE png)
+	if(BUILD_SHARED_LIBS)
+		target_link_libraries(SDL2_image PRIVATE png)
+	else()
+		target_link_libraries(SDL2_image PRIVATE png_static)
+	endif()
 endif()
 
 if (SUPPORT_WEBP)
 	target_compile_definitions(SDL2_image PRIVATE -DLOAD_WEBP)
 	# missing cpufeatures
 	add_subdirectory(external/libwebp-1.0.3)
+	include_directories(external/libwebp-1.0.3/src)
 	target_link_libraries(SDL2_image PRIVATE webp)
 endif()
 
@@ -47,13 +71,16 @@ add_library(SDL2::image ALIAS SDL2_image)
 
 target_include_directories(SDL2_image PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
 
-if (ANDROID)
-    target_link_libraries(SDL2_image PRIVATE SDL2)
+if (BUILD_SHARED_LIBS)
+	target_link_libraries(SDL2_image PUBLIC SDL2::SDL2)
 else()
-    target_link_libraries(SDL2_image PRIVATE SDL2::SDL2)
+	target_link_libraries(SDL2_image PUBLIC SDL2::SDL2-static)
 endif()
 
 if(BUILD_SHOWIMAGE)
 	add_executable(showimage showimage.c)
-	target_link_libraries(showimage PRIVATE SDL2::SDL2 SDL2::image)
+	target_link_libraries(showimage PRIVATE SDL2::image)
+	if (WIN32)
+		target_link_libraries(showimage PRIVATE SDL2::SDL2main)
+	endif()
 endif()
diff --git a/external/jpeg-9d/CMakeLists.txt b/external/jpeg-9d/CMakeLists.txt
index 9fb35ec..7d8340e 100644
--- a/external/jpeg-9d/CMakeLists.txt
+++ b/external/jpeg-9d/CMakeLists.txt
@@ -1,7 +1,7 @@
 cmake_minimum_required(VERSION 3.3.2)
 project(jpeg C)
 
-add_library(jpeg SHARED)
+add_library(jpeg)
 target_sources(jpeg PRIVATE
 		jaricom.c jcapimin.c jcapistd.c jcarith.c jccoefct.c jccolor.c
 		jcdctmgr.c jchuff.c jcinit.c jcmainct.c jcmarker.c jcmaster.c
@@ -10,8 +10,13 @@ target_sources(jpeg PRIVATE
 		jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c jdmaster.c
 		jdmerge.c jdpostct.c jdsample.c jdtrans.c jerror.c jfdctflt.c
 		jfdctfst.c jfdctint.c jidctflt.c jquant1.c
-		jquant2.c jutils.c jmemmgr.c
-		jmem-android.c)
+		jquant2.c jutils.c jmemmgr.c)
+
+if (ANDROID)
+	target_sources(jpeg PRIVATE jmem-android.c)
+else()
+	target_sources(jpeg PRIVATE jmemansi.c)
+endif()
 
 
 target_sources(jpeg PRIVATE jidctint.c jidctfst.c)