Merge topic 'peheader'
bd827f9
WIN: Use COFF file header header for architecture detection (#14083)
This commit is contained in:
commit
5b141a7b29
|
@ -330,6 +330,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}")
|
||||
|
|
|
@ -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}")
|
||||
|
||||
|
|
Loading…
Reference in New Issue