diff --git a/Modules/FindBISON.cmake b/Modules/FindBISON.cmake index 313e54cb8c..a2c37cfe8f 100644 --- a/Modules/FindBISON.cmake +++ b/Modules/FindBISON.cmake @@ -330,7 +330,27 @@ if(BISON_EXECUTABLE) endif() unset(_BISON_CMP0088) + # Bison cannot create output directories. Create any missing determined + # directories where the files will be generated if they don't exist yet. + set(_BisonMakeDirectoryCommand "") + foreach(output IN LISTS BISON_TARGET_outputs) + cmake_path(GET output PARENT_PATH dir) + if(dir) + list(APPEND _BisonMakeDirectoryCommand ${dir}) + endif() + unset(dir) + endforeach() + if(_BisonMakeDirectoryCommand) + list(REMOVE_DUPLICATES _BisonMakeDirectoryCommand) + list( + PREPEND + _BisonMakeDirectoryCommand + COMMAND ${CMAKE_COMMAND} -E make_directory + ) + endif() + add_custom_command(OUTPUT ${BISON_TARGET_outputs} + ${_BisonMakeDirectoryCommand} COMMAND ${BISON_EXECUTABLE} ${BISON_TARGET_cmdopt} -o ${BisonOutput} ${_BisonInput} VERBATIM DEPENDS ${_BisonInput} @@ -350,7 +370,7 @@ if(BISON_EXECUTABLE) set(BISON_${Name}_OUTPUT_HEADER "${BISON_TARGET_output_header}") unset(_BisonInput) - + unset(_BisonMakeDirectoryCommand) endif() endmacro() # diff --git a/Modules/FindFLEX.cmake b/Modules/FindFLEX.cmake index d9d0afa56b..9cbe721cde 100644 --- a/Modules/FindFLEX.cmake +++ b/Modules/FindFLEX.cmake @@ -268,8 +268,28 @@ if(FLEX_EXECUTABLE) list(APPEND _flex_EXE_OPTS --header-file=${_flex_OUTPUT_HEADER_ABS}) endif() + # Flex cannot create output directories. Create any missing determined + # directories where the files will be generated if they don't exist yet. + set(_flex_MAKE_DIRECTORY_COMMAND "") + foreach(output IN LISTS _flex_TARGET_OUTPUTS) + cmake_path(GET output PARENT_PATH dir) + if(dir) + list(APPEND _flex_MAKE_DIRECTORY_COMMAND ${dir}) + endif() + unset(dir) + endforeach() + if(_flex_MAKE_DIRECTORY_COMMAND) + list(REMOVE_DUPLICATES _flex_MAKE_DIRECTORY_COMMAND) + list( + PREPEND + _flex_MAKE_DIRECTORY_COMMAND + COMMAND ${CMAKE_COMMAND} -E make_directory + ) + endif() + get_filename_component(_flex_EXE_NAME_WE "${FLEX_EXECUTABLE}" NAME_WE) add_custom_command(OUTPUT ${_flex_TARGET_OUTPUTS} + ${_flex_MAKE_DIRECTORY_COMMAND} COMMAND ${FLEX_EXECUTABLE} ${_flex_EXE_OPTS} -o${_flex_OUTPUT} ${_flex_INPUT} VERBATIM DEPENDS ${_flex_INPUT} @@ -287,12 +307,12 @@ if(FLEX_EXECUTABLE) unset(_flex_EXE_NAME_WE) unset(_flex_EXE_OPTS) unset(_flex_INPUT) + unset(_flex_MAKE_DIRECTORY_COMMAND) unset(_flex_OUTPUT) unset(_flex_OUTPUT_HEADER) unset(_flex_OUTPUT_HEADER_ABS) unset(_flex_TARGET_OUTPUTS) unset(_flex_WORKING_DIR) - endif() endmacro() #============================================================