From 9e99a95c7db5be8c6b979b0170ab4cf78bb32307 Mon Sep 17 00:00:00 2001
From: Marc Chevrier <marc.chevrier@gmail.com>
Date: Tue, 18 Jun 2019 17:34:19 +0200
Subject: Android: ensure PIE behavior is consistent regardless CMP0083 policy

In commit c4b4d8b3a6 (POSITION_INDEPENDENT_CODE: Manage link flags for
executables, 2018-10-02, v3.14.0-rc1~395^2) we accidentally removed our
Android-specific logic for PIE under the CMP0083 OLD behavior.  Restore
it and also implement Android-specific logic for CMP0083 NEW behavior.

Fixes: #19393
---
 Help/policy/CMP0083.rst                   |  6 ++++++
 Modules/Platform/Android/abi-common.cmake | 20 ++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/Help/policy/CMP0083.rst b/Help/policy/CMP0083.rst
index 32acf1f..e0b09cf 100644
--- a/Help/policy/CMP0083.rst
+++ b/Help/policy/CMP0083.rst
@@ -28,6 +28,12 @@ This policy was introduced in CMake version 3.14. Use the
 Unlike most policies, CMake version |release| does not warn when this policy is
 not set and simply uses ``OLD`` behavior.
 
+.. Note::
+
+   Android platform has a special handling of ``PIE`` so it is not required
+   to use the :module:`CheckPIESupported` module to ensure flags are passed to
+   the linker.
+
 .. include:: DEPRECATED.txt
 
 Examples
diff --git a/Modules/Platform/Android/abi-common.cmake b/Modules/Platform/Android/abi-common.cmake
index a0b47f4..6bce3c7 100644
--- a/Modules/Platform/Android/abi-common.cmake
+++ b/Modules/Platform/Android/abi-common.cmake
@@ -12,6 +12,26 @@ if(NOT DEFINED CMAKE_POSITION_INDEPENDENT_CODE
   set(CMAKE_POSITION_INDEPENDENT_CODE ON)
 endif()
 
+cmake_policy(GET CMP0083 _CMP0083)
+if(_CMP0083 STREQUAL NEW)
+  # PIE Flags are managed by compiler configuration files
+  if(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 16)
+    # ensure PIE flags are passed to the linker
+    set(CMAKE_C_LINK_PIE_SUPPORTED YES CACHE INTERNAL "PIE (C)")
+    set(CMAKE_CXX_LINK_PIE_SUPPORTED YES CACHE INTERNAL "PIE (CXX)")
+    if(CMAKE_SYSTEM_VERSION VERSION_GREATER_EQUAL 21)
+      # no PIE executable are no longer supported
+      set(CMAKE_C_LINK_NO_PIE_SUPPORTED NO CACHE INTERNAL "NO_PIE (C)")
+      set(CMAKE_CXX_LINK_NO_PIE_SUPPORTED NO CACHE INTERNAL "NO_PIE (CXX)")
+    endif()
+  endif()
+else()
+  if(CMAKE_POSITION_INDEPENDENT_CODE)
+    string(APPEND _ANDROID_ABI_INIT_EXE_LDFLAGS " -fPIE -pie")
+  endif()
+endif()
+unset(_CMP0083)
+
 string(APPEND _ANDROID_ABI_INIT_EXE_LDFLAGS " -Wl,--gc-sections")
 
 if(NOT _ANDROID_ABI_INIT_EXE_LDFLAGS_NO_nocopyreloc)
-- 
cgit v0.12