forked from espressif/esp-idf
change(build_system): refactor reproducible build handling
- remove generate_debug_prefix_map.py, move its logic into CMake - move all reproducible builds logic into a new file, prefix_map.cmake
This commit is contained in:
@@ -152,46 +152,8 @@ if(CONFIG_COMPILER_DUMP_RTL_FILES)
|
|||||||
list(APPEND compile_options "-fdump-rtl-expand")
|
list(APPEND compile_options "-fdump-rtl-expand")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT ${CMAKE_C_COMPILER_VERSION} VERSION_LESS 8.0.0)
|
__generate_prefix_map(prefix_map_compile_options)
|
||||||
if(CONFIG_COMPILER_HIDE_PATHS_MACROS)
|
list(APPEND compile_options ${prefix_map_compile_options})
|
||||||
list(APPEND compile_options "-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=.")
|
|
||||||
list(APPEND compile_options "-fmacro-prefix-map=${IDF_PATH}=/IDF")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CONFIG_APP_REPRODUCIBLE_BUILD)
|
|
||||||
idf_build_set_property(DEBUG_PREFIX_MAP_GDBINIT "${BUILD_DIR}/prefix_map_gdbinit")
|
|
||||||
|
|
||||||
list(APPEND compile_options "-fdebug-prefix-map=${IDF_PATH}=/IDF")
|
|
||||||
list(APPEND compile_options "-fdebug-prefix-map=${PROJECT_DIR}=/IDF_PROJECT")
|
|
||||||
list(APPEND compile_options "-fdebug-prefix-map=${BUILD_DIR}=/IDF_BUILD")
|
|
||||||
|
|
||||||
# component dirs
|
|
||||||
idf_build_get_property(python PYTHON)
|
|
||||||
idf_build_get_property(idf_path IDF_PATH)
|
|
||||||
idf_build_get_property(component_dirs BUILD_COMPONENT_DIRS)
|
|
||||||
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${python}
|
|
||||||
"${idf_path}/tools/generate_debug_prefix_map.py"
|
|
||||||
"${BUILD_DIR}"
|
|
||||||
"${component_dirs}"
|
|
||||||
OUTPUT_VARIABLE result
|
|
||||||
RESULT_VARIABLE ret
|
|
||||||
)
|
|
||||||
if(NOT ret EQUAL 0)
|
|
||||||
message(FATAL_ERROR "This is a bug. Please report to https://github.com/espressif/esp-idf/issues")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
spaces2list(result)
|
|
||||||
list(LENGTH component_dirs length)
|
|
||||||
math(EXPR max_index "${length} - 1")
|
|
||||||
foreach(index RANGE ${max_index})
|
|
||||||
list(GET component_dirs ${index} folder)
|
|
||||||
list(GET result ${index} after)
|
|
||||||
list(APPEND compile_options "-fdebug-prefix-map=${folder}=${after}")
|
|
||||||
endforeach()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CONFIG_COMPILER_DISABLE_GCC12_WARNINGS)
|
if(CONFIG_COMPILER_DISABLE_GCC12_WARNINGS)
|
||||||
list(APPEND compile_options "-Wno-address"
|
list(APPEND compile_options "-Wno-address"
|
||||||
|
@@ -8,7 +8,6 @@ tools/ci/get_all_test_results.py
|
|||||||
tools/gdb_panic_server.py
|
tools/gdb_panic_server.py
|
||||||
tools/check_term.py
|
tools/check_term.py
|
||||||
tools/python_version_checker.py
|
tools/python_version_checker.py
|
||||||
tools/generate_debug_prefix_map.py
|
|
||||||
tools/ci/astyle-rules.yml
|
tools/ci/astyle-rules.yml
|
||||||
tools/ci/checkout_project_ref.py
|
tools/ci/checkout_project_ref.py
|
||||||
tools/ci/ci_fetch_submodule.py
|
tools/ci/ci_fetch_submodule.py
|
||||||
|
@@ -48,6 +48,7 @@ if(NOT __idf_env_set)
|
|||||||
include(ldgen)
|
include(ldgen)
|
||||||
include(dfu)
|
include(dfu)
|
||||||
include(version)
|
include(version)
|
||||||
|
include(prefix_map)
|
||||||
|
|
||||||
__build_init("${idf_path}")
|
__build_init("${idf_path}")
|
||||||
|
|
||||||
|
41
tools/cmake/prefix_map.cmake
Normal file
41
tools/cmake/prefix_map.cmake
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
# Utilities for remapping path prefixes
|
||||||
|
#
|
||||||
|
# __generate_prefix_map
|
||||||
|
# Prepares the list of compiler flags for remapping various paths
|
||||||
|
# to fixed names. This is used when reproducible builds are required.
|
||||||
|
# This function also creates a gdbinit file for the debugger to
|
||||||
|
# remap the substituted paths back to the real paths in the filesystem.
|
||||||
|
function(__generate_prefix_map compile_options_var)
|
||||||
|
set(compile_options)
|
||||||
|
idf_build_get_property(idf_path IDF_PATH)
|
||||||
|
idf_build_get_property(build_components BUILD_COMPONENTS)
|
||||||
|
|
||||||
|
if(CONFIG_COMPILER_HIDE_PATHS_MACROS)
|
||||||
|
list(APPEND compile_options "-fmacro-prefix-map=${CMAKE_SOURCE_DIR}=.")
|
||||||
|
list(APPEND compile_options "-fmacro-prefix-map=${idf_path}=/IDF")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_APP_REPRODUCIBLE_BUILD)
|
||||||
|
list(APPEND compile_options "-fdebug-prefix-map=${idf_path}=/IDF")
|
||||||
|
list(APPEND compile_options "-fdebug-prefix-map=${PROJECT_DIR}=/IDF_PROJECT")
|
||||||
|
list(APPEND compile_options "-fdebug-prefix-map=${BUILD_DIR}=/IDF_BUILD")
|
||||||
|
|
||||||
|
# Generate mapping for component paths
|
||||||
|
set(gdbinit_file_lines)
|
||||||
|
foreach(component_name ${build_components})
|
||||||
|
idf_component_get_property(component_dir ${component_name} COMPONENT_DIR)
|
||||||
|
|
||||||
|
string(TOUPPER ${component_name} component_name_uppercase)
|
||||||
|
set(substituted_path "/COMPONENT_${component_name_uppercase}_DIR")
|
||||||
|
list(APPEND compile_options "-fdebug-prefix-map=${component_dir}=${substituted_path}")
|
||||||
|
string(APPEND gdbinit_file_lines "set substitute-path ${substituted_path} ${component_dir}\n")
|
||||||
|
endforeach()
|
||||||
|
|
||||||
|
# Write the final gdbinit file
|
||||||
|
set(gdbinit_path "${BUILD_DIR}/prefix_map_gdbinit")
|
||||||
|
file(WRITE "${gdbinit_path}" "${gdbinit_file_lines}")
|
||||||
|
idf_build_set_property(DEBUG_PREFIX_MAP_GDBINIT "${gdbinit_path}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
set(${compile_options_var} ${compile_options} PARENT_SCOPE)
|
||||||
|
endfunction()
|
@@ -1,45 +0,0 @@
|
|||||||
# SPDX-FileCopyrightText: 2021 Espressif Systems (Shanghai) CO LTD
|
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
|
||||||
|
|
||||||
# General Workflow:
|
|
||||||
# 1. read all components dirs, a semicolon-separated string (cmake list)
|
|
||||||
# 2. map the component dir with a unique prefix /COMPONENT_<NAME>_DIR
|
|
||||||
# 2. write the prefix mapping file to $BUILD_DIR/prefix_map_gdbinit
|
|
||||||
# 3. print the unique prefix out, a space-separated string, will be used by the build system to add compile options.
|
|
||||||
|
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
from typing import List
|
|
||||||
|
|
||||||
|
|
||||||
def component_name(component_dir: str) -> str:
|
|
||||||
return '/COMPONENT_{}_DIR'.format(os.path.basename(component_dir).upper())
|
|
||||||
|
|
||||||
|
|
||||||
GDB_SUBSTITUTE_PATH_FMT = 'set substitute-path {} {}\n'
|
|
||||||
|
|
||||||
|
|
||||||
def write_gdbinit(build_dir: str, folders: List[str]) -> None:
|
|
||||||
gdb_init_filepath = os.path.join(build_dir, 'prefix_map_gdbinit')
|
|
||||||
|
|
||||||
with open(gdb_init_filepath, 'w') as fw:
|
|
||||||
for folder in folders:
|
|
||||||
fw.write(f'{GDB_SUBSTITUTE_PATH_FMT.format(component_name(folder), folder)}')
|
|
||||||
|
|
||||||
|
|
||||||
def main(build_dir: str, folders: List[str]) -> None:
|
|
||||||
write_gdbinit(build_dir, folders)
|
|
||||||
print(' '.join([component_name(folder) for folder in folders]), end='')
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
parser = argparse.ArgumentParser(description='print the debug-prefix-map and write to '
|
|
||||||
'$BUILD_DIR/prefix_map_gdbinit file')
|
|
||||||
|
|
||||||
parser.add_argument('build_dir',
|
|
||||||
help='build dir')
|
|
||||||
parser.add_argument('folders',
|
|
||||||
help='component folders, semicolon separated string')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
main(args.build_dir, args.folders.split(';'))
|
|
Reference in New Issue
Block a user