Description: Update source code for Python 3
 Python 2 reaches End-of-Life in January 2020. The latest patch completely
 removes Python 2 support per release team guidance.
Author: Olek Wojnar <olekw.dev@gmail.com>
Last-Update: 2019-12-08

--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,7 +1,7 @@
 ################################################################################
 # Top-level CMakeLists.txt file for Crazy Eddie's GUI System
 ################################################################################
-cmake_minimum_required(VERSION 3.1)
+cmake_minimum_required(VERSION 3.12.4)
 if (POLICY CMP0017)
     cmake_policy(SET CMP0017 OLD)
 endif()
@@ -142,16 +142,26 @@
 
 find_package(Lua51)
 find_package(TOLUAPP)
-find_package(PythonInterp)
 
-## ensure python3 not picked up as default
-find_package(PythonVersion)
-if (UNIX AND PYTHON_VERSION_FOUND)
-  find_package(PythonLibs ${PYTHON_VERSION_STRING} EXACT)
+find_package(Python3 COMPONENTS Interpreter Development)
+find_package(Boost)
+if(${Boost_VERSION} GREATER_EQUAL 1.67)
+    if (Python3_FOUND)
+        set(CEGUI_PYTHON3_VERSION_NUM ${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR})
+        find_package(Boost COMPONENTS python${CEGUI_PYTHON3_VERSION_NUM})
+        set(CEGUI_Boost_PYTHON3_LIBRARY_VARIABLE Boost_PYTHON${CEGUI_PYTHON3_VERSION_NUM}_LIBRARY)
+        set(CEGUI_Boost_PYTHON3_LIBRARY ${${CEGUI_Boost_PYTHON3_LIBRARY_VARIABLE}})
+    endif()
 else()
-  find_package(PythonLibs)
+    find_package(Boost COMPONENTS python)
+endif()
+
+if (Python3_Interpreter_FOUND)
+    set (PYTHONINTERP_FOUND TRUE)
+endif()
+if (DEFINED Python3_LIBRARIES)
+    set (PYTHONLIBS_FOUND TRUE)
 endif()
-find_package(Boost)
 
 find_package(Doxygen)
 find_package(GTK2 COMPONENTS gtk)
--- a/cegui/src/ScriptModules/Python/bindings/CMakeLists.txt
+++ b/cegui/src/ScriptModules/Python/bindings/CMakeLists.txt
@@ -1,35 +1,4 @@
-execute_process(
-    COMMAND ${PYTHON_EXECUTABLE} -c "import distutils.sysconfig; print (distutils.sysconfig.get_python_lib(plat_specific=True, prefix=\"\"))"
-    OUTPUT_VARIABLE CEGUI_PYTHON_INSTALL_DIR
-    OUTPUT_STRIP_TRAILING_WHITESPACE
-)
-
-set( CEGUI_PYTHON_INSTALL_DIR "${CEGUI_PYTHON_INSTALL_DIR}/${CMAKE_PROJECT_NAME}-${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}" )
-
-if( CMAKE_COMPILER_IS_GNUCXX OR (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") )
-    set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-unused-local-typedefs -Wno-unused-parameter -Wno-address")
-    if( CMAKE_COMPILER_IS_GNUCXX )
-        set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-nonnull-compare")
-    endif()
-endif()
-
-include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-
-include_directories(SYSTEM
-                        ${PYTHON_INCLUDE_DIR}
-                        ${Boost_INCLUDE_DIR})
-
-cegui_add_python_module( ${CEGUI_PYCEGUI_CORE_LIBNAME} "output/CEGUI" "" )
-
-if (CEGUI_BUILD_RENDERER_NULL)
-    cegui_add_python_module( ${CEGUI_PYCEGUI_NULL_RENDERER_LIBNAME} "output/CEGUINullRenderer" ${CEGUI_NULL_RENDERER_LIBNAME} )
-endif()
-
-if (CEGUI_BUILD_RENDERER_OGRE)
-    cegui_add_python_module( ${CEGUI_PYCEGUI_OGRE_RENDERER_LIBNAME} "output/CEGUIOgreRenderer" ${CEGUI_OGRE_RENDERER_LIBNAME} )
-endif()
-
-if (CEGUI_BUILD_RENDERER_OPENGL)
-    cegui_add_python_module( ${CEGUI_PYCEGUI_OPENGL_RENDERER_LIBNAME} "output/CEGUIOpenGLRenderer" ${CEGUI_OPENGL_RENDERER_LIBNAME} )
+if (Python3_FOUND AND Python3_Development_FOUND)
+  include(python3.cmake)
 endif()
 
--- a/cmake/CEGUIMacros.cmake
+++ b/cmake/CEGUIMacros.cmake
@@ -456,12 +456,15 @@
 #
 # Define a PyCEGUI* extension module
 #
-macro( cegui_add_python_module PYTHON_MODULE_NAME SOURCE_DIR EXTRA_LIBS )
+macro( cegui_add_python_module PYTHON_MODULE_NAME_GENERIC SOURCE_DIR EXTRA_LIBS )
+	set(PYTHON_MODULE_NAME ${PYTHON_MODULE_NAME_GENERIC}_${MODULE_SUFFIX})
     file( GLOB ${PYTHON_MODULE_NAME}_SOURCE_FILES ${SOURCE_DIR}/*.cpp )
 
-    include_directories(BEFORE SYSTEM ${SOURCE_DIR})
-
     add_library(${PYTHON_MODULE_NAME} MODULE ${${PYTHON_MODULE_NAME}_SOURCE_FILES})
+    target_include_directories(${PYTHON_MODULE_NAME} PRIVATE ${SOURCE_DIR}
+                               ${CMAKE_CURRENT_SOURCE_DIR}
+                               ${PYTHON_INCLUDE_DIR}
+                               ${Boost_INCLUDE_DIR})
     target_link_libraries(${PYTHON_MODULE_NAME} ${CEGUI_BASE_LIBNAME} ${Boost_PYTHON_LIBRARY} ${PYTHON_LIBRARIES} ${EXTRA_LIBS} )
     set_target_properties(${PYTHON_MODULE_NAME} PROPERTIES PREFIX "")
     target_compile_definitions(${PYTHON_MODULE_NAME} PRIVATE CEGUI_DONT_USE_GLEW_LOCALLY=1) 
@@ -477,7 +480,7 @@
     endif()
 
     if (CMAKE_COMPILER_IS_GNUCXX)
-        set_target_properties(${PYTHON_MODULE_NAME} PROPERTIES COMPILE_FLAGS "-fvisibility=hidden")
+        set_target_properties(${PYTHON_MODULE_NAME} PROPERTIES COMPILE_FLAGS "-fvisibility=hidden" ARCHIVE_OUTPUT_NAME ${PYTHON_MODULE_NAME} OUTPUT_NAME ${PYTHON_MODULE_NAME_GENERIC} LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/${MODULE_SUFFIX}")
     endif()
 
     install(TARGETS ${PYTHON_MODULE_NAME} LIBRARY DESTINATION "${CEGUI_PYTHON_INSTALL_DIR}" COMPONENT cegui_python)
--- /dev/null
+++ b/cegui/src/ScriptModules/Python/bindings/python3.cmake
@@ -0,0 +1,13 @@
+set(MODULE_SUFFIX python3)
+set(PYTHON_INCLUDE_DIR ${Python3_INCLUDE_DIRS})
+set(CEGUI_PYTHON_INSTALL_DIR "${Python3_SITEARCH}/${CMAKE_PROJECT_NAME}-${CEGUI_VERSION_MAJOR}.${CEGUI_VERSION_MINOR}")
+set(PYTHON_LIBRARIES ${Python3_LIBRARIES})
+set(Boost_PYTHON_LIBRARY ${CEGUI_Boost_PYTHON3_LIBRARY})
+
+include(common.cmake)
+
+unset(MODULE_SUFFIX)
+unset(PYTHON_INCLUDE_DIR)
+unset(CEGUI_PYTHON_INSTALL_DIR)
+unset(PYTHON_LIBRARIES)
+unset(Boost_PYTHON_LIBRARY)
--- /dev/null
+++ b/cegui/src/ScriptModules/Python/bindings/common.cmake
@@ -0,0 +1,14 @@
+cegui_add_python_module( ${CEGUI_PYCEGUI_CORE_LIBNAME} "output/CEGUI" "" )
+
+if (CEGUI_BUILD_RENDERER_NULL)
+    cegui_add_python_module( ${CEGUI_PYCEGUI_NULL_RENDERER_LIBNAME} "output/CEGUINullRenderer" ${CEGUI_NULL_RENDERER_LIBNAME} )
+endif()
+
+if (CEGUI_BUILD_RENDERER_OGRE)
+    cegui_add_python_module( ${CEGUI_PYCEGUI_OGRE_RENDERER_LIBNAME} "output/CEGUIOgreRenderer" ${CEGUI_OGRE_RENDERER_LIBNAME} )
+endif()
+
+if (CEGUI_BUILD_RENDERER_OPENGL)
+    cegui_add_python_module( ${CEGUI_PYCEGUI_OPENGL_RENDERER_LIBNAME} "output/CEGUIOpenGLRenderer" ${CEGUI_OPENGL_RENDERER_LIBNAME} )
+endif()
+
