summaryrefslogtreecommitdiff
path: root/Modules
diff options
context:
space:
mode:
authorPatrick Gansterer <paroga@paroga.com>2013-08-05 20:04:44 +0200
committerPatrick Gansterer <paroga@paroga.com>2013-08-05 20:04:44 +0200
commitbd827f98efc1d4294b9a7d0fc134629b7507f4a1 (patch)
tree0c72621825b39f087e474ce2f6b9aae90381fdf7 /Modules
parent1768014dfc8aee30430d57c8f984aad0abb15094 (diff)
downloadcmake-bd827f98efc1d4294b9a7d0fc134629b7507f4a1.tar.gz
WIN: Use COFF file header header for architecture detection (#14083)
Read the machine field from the COFF file header to get the exact target architecture for ARM and SHx on the Windows platform.
Diffstat (limited to 'Modules')
-rw-r--r--Modules/CMakeDetermineCompilerId.cmake29
-rw-r--r--Modules/Platform/Windows-MSVC.cmake7
2 files changed, 29 insertions, 7 deletions
diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake
index ae91a296a4..71bf29390e 100644
--- a/Modules/CMakeDetermineCompilerId.cmake
+++ b/Modules/CMakeDetermineCompilerId.cmake
@@ -341,6 +341,35 @@ function(CMAKE_DETERMINE_COMPILER_ID_CHECK lang file)
endif()
endforeach()
+ # Detect the exact architecture from the PE header.
+ if(WIN32)
+ # The offset to the PE signature is stored at 0x3c.
+ file(READ ${file} peoffsethex LIMIT 1 OFFSET 60 HEX)
+ string(SUBSTRING "${peoffsethex}" 0 1 peoffsethex1)
+ string(SUBSTRING "${peoffsethex}" 1 1 peoffsethex2)
+ set(peoffsetexpression "${peoffsethex1} * 16 + ${peoffsethex2}")
+ string(REPLACE "a" "10" peoffsetexpression "${peoffsetexpression}")
+ string(REPLACE "b" "11" peoffsetexpression "${peoffsetexpression}")
+ string(REPLACE "c" "12" peoffsetexpression "${peoffsetexpression}")
+ string(REPLACE "d" "13" peoffsetexpression "${peoffsetexpression}")
+ string(REPLACE "e" "14" peoffsetexpression "${peoffsetexpression}")
+ string(REPLACE "f" "15" peoffsetexpression "${peoffsetexpression}")
+ math(EXPR peoffset "${peoffsetexpression}")
+
+ file(READ ${file} peheader LIMIT 6 OFFSET ${peoffset} HEX)
+ if(peheader STREQUAL "50450000a201")
+ set(ARCHITECTURE_ID "SH3")
+ elseif(peheader STREQUAL "50450000a301")
+ set(ARCHITECTURE_ID "SH3DSP")
+ elseif(peheader STREQUAL "50450000a601")
+ set(ARCHITECTURE_ID "SH4")
+ elseif(peheader STREQUAL "50450000a801")
+ set(ARCHITECTURE_ID "SH5")
+ elseif(peheader STREQUAL "50450000c201")
+ set(ARCHITECTURE_ID "THUMB")
+ endif()
+ endif()
+
# Check if a valid compiler and platform were found.
if(COMPILER_ID AND NOT COMPILER_ID_TWICE)
set(CMAKE_${lang}_COMPILER_ID "${COMPILER_ID}")
diff --git a/Modules/Platform/Windows-MSVC.cmake b/Modules/Platform/Windows-MSVC.cmake
index 9f97570589..1a2d3e9893 100644
--- a/Modules/Platform/Windows-MSVC.cmake
+++ b/Modules/Platform/Windows-MSVC.cmake
@@ -171,13 +171,6 @@ set(_MACHINE_ARCH_FLAG ${MSVC_C_ARCHITECTURE_ID})
if(NOT _MACHINE_ARCH_FLAG)
set(_MACHINE_ARCH_FLAG ${MSVC_CXX_ARCHITECTURE_ID})
endif()
-if(WINCE)
- if(_MACHINE_ARCH_FLAG MATCHES "ARM")
- set(_MACHINE_ARCH_FLAG "THUMB")
- elseif(_MACHINE_ARCH_FLAG MATCHES "SH")
- set(_MACHINE_ARCH_FLAG "SH4")
- endif()
-endif()
set (CMAKE_EXE_LINKER_FLAGS_INIT
"${CMAKE_EXE_LINKER_FLAGS_INIT} /machine:${_MACHINE_ARCH_FLAG}")