diff --git a/cmake/flexYacc.cmake b/cmake/flexYacc.cmake index 239429c..9b58923 100644 --- a/cmake/flexYacc.cmake +++ b/cmake/flexYacc.cmake @@ -1,6 +1,13 @@ # Generic Flex/Yacc Generation Functions # 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 # Usage: generate_flex_lexer(OUTPUT_VAR INPUT_FILE [PREFIX] [HEADER_DEPENDENCY]) # OUTPUT_VAR: Variable name to store the output file path @@ -8,31 +15,36 @@ # PREFIX: Optional prefix for the generated files (defaults to basename of input file) # HEADER_DEPENDENCY: Optional header file that the lexer depends on (e.g., from Bison) function(generate_flex_lexer OUTPUT_VAR INPUT_FILE) - get_filename_component(INPUT_BASENAME ${INPUT_FILE} NAME_WE) + get_filename_component(INPUT_BASENAME ${INPUT_FILE} NAME_WE) - if(ARGC GREATER 2) - set(PREFIX ${ARGV2}) - else() - set(PREFIX ${INPUT_BASENAME}) - endif() + if(ARGC GREATER 2) + set(PREFIX ${ARGV2}) + else() + set(PREFIX ${INPUT_BASENAME}) + endif() - set(LEX_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) - set(LEX_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) + set(LEX_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) + set(LEX_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) - # Set up dependencies - set(DEPENDENCIES ${INPUT_FILE}) - if(ARGC GREATER 3) - list(APPEND DEPENDENCIES ${ARGV3}) - endif() + _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}) - add_custom_command( - OUTPUT ${LEX_OUTPUT} - DEPENDS ${DEPENDENCIES} - COMMAND ${FLEX_EXECUTABLE} --header-file=${LEX_HEADER} -o ${LEX_OUTPUT} ${INPUT_FILE} - COMMENT "Generating ${PREFIX}.cc from ${INPUT_FILE}" - ) + # Set up dependencies + set(DEPENDENCIES ${INPUT_FILE}) + if(ARGC GREATER 3) + list(APPEND DEPENDENCIES ${ARGV3}) + endif() - set(${OUTPUT_VAR} ${LEX_OUTPUT} PARENT_SCOPE) + add_custom_command( + OUTPUT ${LEX_OUTPUT} + DEPENDS ${DEPENDENCIES} + 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}" + ) + + set(${OUTPUT_VAR} ${LEX_OUTPUT} PARENT_SCOPE) endfunction() # Function to generate Bison parser files @@ -42,26 +54,31 @@ endfunction() # INPUT_FILE: Path to the .yy input file # PREFIX: Optional prefix for the generated files (defaults to basename of input file) function(generate_bison_parser OUTPUT_VAR HEADER_VAR INPUT_FILE) - get_filename_component(INPUT_BASENAME ${INPUT_FILE} NAME_WE) + get_filename_component(INPUT_BASENAME ${INPUT_FILE} NAME_WE) - if(ARGC GREATER 3) - set(PREFIX ${ARGV3}) - else() - set(PREFIX ${INPUT_BASENAME}) - endif() + if(ARGC GREATER 3) + set(PREFIX ${ARGV3}) + else() + set(PREFIX ${INPUT_BASENAME}) + endif() - set(YACC_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) - set(YACC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) + set(YACC_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.cc) + set(YACC_HEADER ${CMAKE_CURRENT_BINARY_DIR}/${PREFIX}.hh) - add_custom_command( - OUTPUT ${YACC_OUTPUT} ${YACC_HEADER} - DEPENDS ${INPUT_FILE} - COMMAND ${BISON_EXECUTABLE} -p ${PREFIX} --header=${YACC_HEADER} -o ${YACC_OUTPUT} ${INPUT_FILE} - COMMENT "Generating ${PREFIX}.cc and ${PREFIX}.hh from ${INPUT_FILE}" - ) + _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}) - set(${OUTPUT_VAR} ${YACC_OUTPUT} PARENT_SCOPE) - set(${HEADER_VAR} ${YACC_HEADER} PARENT_SCOPE) + add_custom_command( + OUTPUT ${YACC_OUTPUT} ${YACC_HEADER} + DEPENDS ${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}" + ) + + set(${OUTPUT_VAR} ${YACC_OUTPUT} PARENT_SCOPE) + set(${HEADER_VAR} ${YACC_HEADER} PARENT_SCOPE) endfunction() # Generate device attachment parser files using the generic functions