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 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140
|
if(CMAKE_HOST_UNIX)
function(permissions_set f)
file(CHMOD ${f} FILE_PERMISSIONS OWNER_WRITE OWNER_READ OWNER_EXECUTE SETUID)
endfunction()
function(permissions_check f)
execute_process(COMMAND sh -c "stat -c %a \"${f}\""
OUTPUT_VARIABLE stat_out OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_VARIABLE stat_err
RESULT_VARIABLE stat_res
)
if(stat_res EQUAL 0)
if(NOT stat_out STREQUAL "4700")
message(FATAL_ERROR "Expected permissions 4700 but got ${stat_out}:\n ${f}")
endif()
endif()
endfunction()
else()
function(permissions_set)
endfunction()
function(permissions_check)
endfunction()
endif()
# Prepare binaries on which to operate.
set(in "${CMAKE_CURRENT_LIST_DIR}/${format}")
set(out "${CMAKE_CURRENT_BINARY_DIR}")
foreach(f ${dynamic})
file(COPY ${in}/${f} DESTINATION ${out} NO_SOURCE_PERMISSIONS)
list(APPEND dynamic_files "${out}/${f}")
endforeach()
foreach(f ${static})
file(COPY ${in}/${f} DESTINATION ${out} NO_SOURCE_PERMISSIONS)
list(APPEND static_files "${out}/${f}")
endforeach()
foreach(f ${dynamic_files})
permissions_set(${f})
# Check for the initial RPATH.
file(RPATH_CHECK FILE "${f}" RPATH "/sample/rpath")
if(NOT EXISTS "${f}")
message(FATAL_ERROR "RPATH_CHECK removed ${f}")
endif()
permissions_check(${f})
# Change the RPATH.
file(RPATH_CHANGE FILE "${f}"
OLD_RPATH "/sample/rpath"
NEW_RPATH "/path1:/path2")
set(rpath)
file(STRINGS "${f}" rpath REGEX "/path1:/path2" LIMIT_COUNT 1)
if(NOT rpath)
message(FATAL_ERROR "RPATH not changed in ${f}")
endif()
permissions_check(${f})
# Change the RPATH without compiler defined rpath removed
file(RPATH_CHANGE FILE "${f}"
OLD_RPATH "/path2"
NEW_RPATH "/path3")
set(rpath)
file(STRINGS "${f}" rpath REGEX "/path1:/path3" LIMIT_COUNT 1)
if(NOT rpath)
message(FATAL_ERROR "RPATH not updated in ${f}")
endif()
permissions_check(${f})
# Change the RPATH with compiler defined rpath removed
file(RPATH_CHANGE FILE "${f}"
OLD_RPATH "/path3"
NEW_RPATH "/rpath/sample"
INSTALL_REMOVE_ENVIRONMENT_RPATH)
set(rpath)
file(STRINGS "${f}" rpath REGEX "/rpath/sample" LIMIT_COUNT 1)
if(NOT rpath)
message(FATAL_ERROR "RPATH not updated in ${f}")
endif()
file(STRINGS "${f}" rpath REGEX "/path1" LIMIT_COUNT 1)
if(rpath)
message(FATAL_ERROR "RPATH not removed in ${f}")
endif()
permissions_check(${f})
# Remove the RPATH.
file(RPATH_REMOVE FILE "${f}")
set(rpath)
file(STRINGS "${f}" rpath REGEX "/rpath/sample" LIMIT_COUNT 1)
if(rpath)
message(FATAL_ERROR "RPATH not removed from ${f}")
endif()
permissions_check(${f})
# Check again...this should remove the file.
file(RPATH_CHECK FILE "${f}" RPATH "/sample/rpath")
if(EXISTS "${f}")
message(FATAL_ERROR "RPATH_CHECK did not remove ${f}")
endif()
endforeach()
# TODO Implement RPATH_SET in XCOFF.
if(format STREQUAL "ELF")
foreach(f ${dynamic})
file(COPY ${in}/${f} DESTINATION ${out} NO_SOURCE_PERMISSIONS)
endforeach()
foreach(f ${dynamic_files})
# Set the RPATH.
file(RPATH_SET FILE "${f}"
NEW_RPATH "/new/rpath")
set(rpath)
file(STRINGS "${f}" rpath REGEX "/new/rpath" LIMIT_COUNT 1)
if(NOT rpath)
message(FATAL_ERROR "RPATH not set in ${f}")
endif()
file(STRINGS "${f}" rpath REGEX "/rpath/sample" LIMIT_COUNT 1)
if(rpath)
message(FATAL_EROR "RPATH not removed in ${f}")
endif()
# Remove the RPATH.
file(RPATH_SET FILE "${f}"
NEW_RPATH "")
set(rpath)
file(STRINGS "${f}" rpath REGEX "/new/rpath" LIMIT_COUNT 1)
if(rpath)
message(FATAL_ERROR "RPATH not removed from ${f}")
endif()
# Check again...this should remove the file.
file(RPATH_CHECK FILE "${f}" RPATH "/new/rpath")
if(EXISTS "${f}")
message(FATAL_ERROR "RPATH_CHECK did not remove ${f}")
endif()
endforeach()
endif()
# Verify that modifying rpaths on a static library is a no-op
foreach(f ${static_files})
file(RPATH_CHANGE FILE "${f}" OLD_RPATH "/rpath/foo" NEW_RPATH "/rpath/bar")
endforeach()
|