cmake: use repo-relative paths for flex/bison #line output

Invoke flex and bison from CMAKE_SOURCE_DIR with relative input and
output paths so generated parser/lexer sources do not embed absolute
build directory paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-21 15:56:41 -04:00
parent a9de2bb1ab
commit 63ff0aa264
+19 -2
View File
@@ -1,6 +1,13 @@
# Generic Flex/Yacc Generation Functions # Generic Flex/Yacc Generation Functions
# This file provides reusable functions for generating C++ files from Flex/Bison sources # This file provides reusable functions for generating C++ files from Flex/Bison sources
# Emit #line paths relative to CMAKE_SOURCE_DIR so generated sources do not embed
# absolute build-tree paths (helps reproducible builds and Yocto QA buildpaths).
function(_flexyacc_path_relative_to_source OUT_VAR ABS_PATH)
file(RELATIVE_PATH ${OUT_VAR} ${CMAKE_SOURCE_DIR} ${ABS_PATH})
set(${OUT_VAR} ${${OUT_VAR}} PARENT_SCOPE)
endfunction()
# Function to generate Flex lexer files # Function to generate Flex lexer files
# Usage: generate_flex_lexer(OUTPUT_VAR INPUT_FILE [PREFIX] [HEADER_DEPENDENCY]) # Usage: generate_flex_lexer(OUTPUT_VAR INPUT_FILE [PREFIX] [HEADER_DEPENDENCY])
# OUTPUT_VAR: Variable name to store the output file path # OUTPUT_VAR: Variable name to store the output file path
@@ -19,6 +26,10 @@ function(generate_flex_lexer OUTPUT_VAR INPUT_FILE)
set(LEX_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) set(LEX_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc)
set(LEX_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) set(LEX_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh)
_flexyacc_path_relative_to_source(LEX_INPUT ${INPUT_FILE})
_flexyacc_path_relative_to_source(LEX_OUTPUT_REL ${LEX_OUTPUT})
_flexyacc_path_relative_to_source(LEX_HEADER_REL ${LEX_HEADER})
# Set up dependencies # Set up dependencies
set(DEPENDENCIES ${INPUT_FILE}) set(DEPENDENCIES ${INPUT_FILE})
if(ARGC GREATER 3) if(ARGC GREATER 3)
@@ -28,7 +39,8 @@ function(generate_flex_lexer OUTPUT_VAR INPUT_FILE)
add_custom_command( add_custom_command(
OUTPUT ${LEX_OUTPUT} OUTPUT ${LEX_OUTPUT}
DEPENDS ${DEPENDENCIES} DEPENDS ${DEPENDENCIES}
COMMAND ${FLEX_EXECUTABLE} --header-file=${LEX_HEADER} -o ${LEX_OUTPUT} ${INPUT_FILE} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${FLEX_EXECUTABLE} --header-file=${LEX_HEADER_REL} -o ${LEX_OUTPUT_REL} ${LEX_INPUT}
COMMENT "Generating ${PREFIX}.cc from ${INPUT_FILE}" COMMENT "Generating ${PREFIX}.cc from ${INPUT_FILE}"
) )
@@ -53,10 +65,15 @@ function(generate_bison_parser OUTPUT_VAR HEADER_VAR INPUT_FILE)
set(YACC_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) set(YACC_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc)
set(YACC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) set(YACC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh)
_flexyacc_path_relative_to_source(YACC_INPUT ${INPUT_FILE})
_flexyacc_path_relative_to_source(YACC_OUTPUT_REL ${YACC_OUTPUT})
_flexyacc_path_relative_to_source(YACC_HEADER_REL ${YACC_HEADER})
add_custom_command( add_custom_command(
OUTPUT ${YACC_OUTPUT} ${YACC_HEADER} OUTPUT ${YACC_OUTPUT} ${YACC_HEADER}
DEPENDS ${INPUT_FILE} DEPENDS ${INPUT_FILE}
COMMAND ${BISON_EXECUTABLE} -p ${PREFIX} --header=${YACC_HEADER} -o ${YACC_OUTPUT} ${INPUT_FILE} WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
COMMAND ${BISON_EXECUTABLE} -p ${PREFIX} --header=${YACC_HEADER_REL} -o ${YACC_OUTPUT_REL} ${YACC_INPUT}
COMMENT "Generating ${PREFIX}.cc and ${PREFIX}.hh from ${INPUT_FILE}" COMMENT "Generating ${PREFIX}.cc and ${PREFIX}.hh from ${INPUT_FILE}"
) )