aboutsummaryrefslogtreecommitdiff
path: root/cmake/CMakeMillerFuncs.cmake
blob: 223819be6d40a94a2efc5431415ba6c3ea44622b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function(GetMillerSectionFromInclude destfile definition out)

set(tmp "")
execute_process(COMMAND ${CMAKE_SOURCE_DIR}/batch/millerSectionFromInclude.sh ${destfile} ${definition} OUTPUT_VARIABLE tmp)
if (tmp STREQUAL "")
  unset(${out})
else()
  set(${out} "${tmp}" PARENT_SCOPE)
endif()

endfunction()


function(RemoveGCCFingerprintFromObj targetname)

  foreach(f ${ARGN})
    add_custom_command(TARGET ${targetname} PRE_LINK
      COMMAND ${CMAKE_OBJCOPY} -R '.rdata$$zzz' "${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/${targetname}.dir/${f}.obj"
      DEPENDS ${targetname}
    )
  endforeach(f)

endfunction()


function(RemoveFingerprints targetname)

set(tmp_stmp "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.${targetname}_no-fingerprints")
add_custom_command(OUTPUT ${tmp_stmp}
  # .edata && .idata is elementary for windows' LoadLibrary(...) func :/
  COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan --bold "RemoveFingerprints for ${targetname}"
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/removeGccVersion.py "$<TARGET_FILE:${targetname}>"
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/nullDataDirs.py "$<TARGET_FILE:${targetname}>"
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/removeDosStub.py "$<TARGET_FILE:${targetname}>"
  COMMAND ${CMAKE_COMMAND} -E touch ${tmp_stmp}
  DEPENDS ${targetname}
)
add_custom_target(${targetname}_no-fingerprints ALL DEPENDS ${targetname} ${tmp_stmp})

endfunction()


function(CreateBinary targetname outfile)

set(tmp_stmp "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/.${targetname}_bin-build")
add_custom_command(OUTPUT ${outfile} ${tmp_stmp}
  COMMAND ${CMAKE_COMMAND} -E cmake_echo_color --cyan --bold "CreateBinary: ${outfile}"
  COMMAND ${CMAKE_COMMAND} -E remove ${tmp_stmp}
  COMMAND ${CMAKE_COMMAND} -E copy "$<TARGET_FILE:${targetname}>" "${outfile}"
  COMMAND ${CMAKE_STRIP} -R .edata "${outfile}" || true
  COMMAND ${CMAKE_STRIP} -R .idata "${outfile}" || true
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/removeGccVersion.py "${outfile}"
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/nullDataDirs.py "${outfile}"
  COMMAND ${PYTHON} ${CMAKE_SOURCE_DIR}/batch/removeDosStub.py "${outfile}"
  COMMAND chmod -x "${outfile}"
  COMMAND ${CMAKE_COMMAND} -E touch ${tmp_stmp}
  DEPENDS ${targetname}
)
add_custom_target(${targetname}_bin ALL DEPENDS ${targetname} ${outfile} ${tmp_stmp})

endfunction()


function(PrefixPath var prefix)

  set(listVar "")
  foreach(f ${ARGN})
    list(APPEND listVar "${prefix}/${f}")
  endforeach(f)
  set(${var} "${listVar}" PARENT_SCOPE)

endfunction()


include(CheckCSourceCompiles)

function(CompileCSource source result cflags defs incl libs quiet)
  set(CMAKE_REQUIRED_FLAGS ${cflags})
  set(CMAKE_REQUIRED_DEFINITIONS ${defs})
  set(CMAKE_REQUIRED_INCLUDES ${incl})
  set(CMAKE_REQUIRED_LIBRARIES ${libs})
  set(CMAKE_REQUIRED_QUIET ${quiet})
  CHECK_C_SOURCE_COMPILES("${source}" ${result})
endfunction()

function(CloneGitSubmodule path)
  find_package(Git QUIET)
  option(GIT_SUBMODULE "Clone git submodules during build" ON)
  if(GIT_SUBMODULE)
    message(STATUS "Git Submodule update: ${GIT_EXECUTABLE} submodule update --init --recursive -- ${path}")
    execute_process(COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive -- "${path}"
                    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                    RESULT_VARIABLE GIT_SUBMOD_RESULT
                    ERROR_QUIET OUTPUT_QUIET)
    if(NOT GIT_SUBMOD_RESULT EQUAL "0")
      message(FATAL_ERROR "Git Submodule update failed with ${GIT_SUBMOD_RESULT}.")
    endif()
  endif()
endfunction()