123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #
- # Functions and utilities for build reproducibility
- #
- # Set a target to be reproducible
- function(set_reproducible_target target)
- # properties for static libraries
- set_target_properties(${target} PROPERTIES STATIC_LIBRARY_OPTIONS "-D")
- # properties on executables
- target_link_options(${target} PRIVATE -fdebug-prefix-map=${CMAKE_SOURCE_DIR}=)
- target_link_options(${target} PRIVATE -fdebug-prefix-map=${CMAKE_BINARY_DIR}=)
- if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "8")
- target_compile_options(${target} PRIVATE -ffile-prefix-map=${CMAKE_SOURCE_DIR}=)
- endif()
- # properties on sources
- get_target_property(sources ${target} SOURCES)
- get_target_property(source_dir ${target} SOURCE_DIR)
- foreach(file IN LISTS sources)
- cmake_path(ABSOLUTE_PATH file BASE_DIRECTORY ${source_dir})
- cmake_path(RELATIVE_PATH file BASE_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE rpath)
- set_property(
- SOURCE ${file}
- DIRECTORY ${source_dir}
- APPEND
- PROPERTY COMPILE_OPTIONS "-frandom-seed=${rpath}"
- )
- endforeach()
- endfunction()
- # Get the list of targets for all directories
- function(get_all_targets _result _dir)
- get_property(
- _subdirs
- DIRECTORY "${_dir}"
- PROPERTY SUBDIRECTORIES
- )
- foreach(_subdir IN LISTS _subdirs)
- get_all_targets(${_result} "${_subdir}")
- endforeach()
- get_directory_property(_sub_targets DIRECTORY "${_dir}" BUILDSYSTEM_TARGETS)
- set(${_result}
- ${${_result}} ${_sub_targets}
- PARENT_SCOPE
- )
- endfunction()
- # Make every target reproducible
- function(set_all_targets_reproducible)
- get_all_targets(targets ${CMAKE_SOURCE_DIR})
- foreach(target IN LISTS targets)
- set_reproducible_target(${target})
- endforeach()
- endfunction()
- # Set source epoch
- function(set_source_epoch epoch)
- set(ENV{SOURCE_DATE_EPOCH} ${epoch})
- if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "8")
- string(TIMESTAMP SOURCE_DATE_EPOCH "%Y-%m-%d")
- add_compile_definitions(SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH}")
- string(TIMESTAMP SOURCE_TIME_EPOCH "%H:%M:%S")
- add_compile_definitions(SOURCE_TIME_EPOCH="${SOURCE_TIME_EPOCH}")
- endif()
- endfunction()
|