set(derived_headers_location "${CMAKE_CURRENT_BINARY_DIR}/DerivedHeaders")

# Obtain the original headers from their staged location in the build directory.
set(original_headers_location "${CMAKE_BINARY_DIR}/include/lldb")
set(headers_to_process
  SBDefines.h
  lldb-defines.h
  lldb-enumerations.h
  lldb-types.h
)

file(MAKE_DIRECTORY ${derived_headers_location})

# Take the original headers and convert them RPC as necessary using the conversion script.
set(original_headers)
set(derived_headers)
foreach(header ${headers_to_process})
  set(original_header "${original_headers_location}/${header}")

  get_filename_component(header_filename ${header} NAME)
  string(REPLACE "lldb-" "lldb-rpc-" rpc_header_filename "${header_filename}")
  set(derived_header "${derived_headers_location}/${rpc_header_filename}")

  list(APPEND original_headers "${original_header}")
  list(APPEND derived_headers "${derived_header}")
  add_custom_command(OUTPUT ${derived_header}
    COMMAND ${Python3_EXECUTABLE} ${LLDB_SOURCE_DIR}/scripts/convert-lldb-header-to-rpc-header.py
            ${original_header} ${derived_header}
    DEPENDS ${original_header}

    COMMENT "Creating ${derived_header}"
  )
endforeach()

# Do the same thing for any header files that were autogenerated.
set(generated_headers_to_process
  API/SBLanguages.h
)
foreach(header ${generated_headers_to_process})
  set(original_header "${LLDB_OBJ_DIR}/include/lldb/${header}")

  get_filename_component(header_filename ${header} NAME)
  string(REPLACE "lldb-" "lldb-rpc-" rpc_header_filename "${header_filename}")
  set(derived_header "${derived_headers_location}/${rpc_header_filename}")

  list(APPEND original_headers "${original_header}")
  list(APPEND derived_headers "${derived_header}")
  add_custom_command(OUTPUT ${derived_header}
    COMMAND ${CMAKE_COMMAND} -E copy ${original_header} ${derived_header}
    COMMAND ${Python3_EXECUTABLE} ${LLDB_SOURCE_DIR}/scripts/convert-lldb-header-to-rpc-header.py
            ${original_header} ${derived_header}
    DEPENDS lldb-sbapi-dwarf-enums

    COMMENT "Creating ${derived_header}"
  )
endforeach()

add_custom_target(copy-aux-rpc-headers DEPENDS ${derived_headers})
add_dependencies(copy-aux-rpc-headers liblldb-header-staging)

list(APPEND public_headers
  ${derived_headers_location}/SBDefines.h
  ${derived_headers_location}/SBLanguages.h
  ${derived_headers_location}/lldb-rpc-enumerations.h
  ${derived_headers_location}/lldb-rpc-types.h
  ${derived_headers_location}/lldb-rpc-defines.h
)

# Collect and preprocess headers for the framework bundle
set(version_header
  ${derived_headers_location}/lldb-rpc-defines.h
)

function(FixIncludePaths in subfolder out)
  get_filename_component(base_name ${in} NAME)
  set(parked_header ${CMAKE_CURRENT_BINARY_DIR}/ParkedHeaders/${subfolder}/${base_name})
  set(${out} ${parked_header} PARENT_SCOPE)
  find_program(unifdef_EXECUTABLE unifdef)

  add_custom_command(OUTPUT ${parked_header}
    COMMAND ${LLDB_SOURCE_DIR}/scripts/framework-header-fix.py
            -f lldb_rpc -i ${in} -o ${parked_header} -p ${unifdef_EXECUTABLE} --unifdef_guards SWIG
    DEPENDS ${in}
    COMMENT "Fixing includes in ${in}"
  )
endfunction()

set(preprocessed_headers)

# Apply include-paths fix and any version fix on all headers and park them.
foreach(source_header ${public_headers})
  FixIncludePaths(${source_header} Headers parked_header)
  list(APPEND preprocessed_headers ${parked_header})
endforeach()

# Wrap header preprocessing in a target, so liblldbrpc can depend on.
add_custom_target(liblldbrpc-headers DEPENDS ${preprocessed_headers})
add_dependencies(liblldbrpc-headers copy-aux-rpc-headers liblldb-header-staging)
set_target_properties(liblldbrpc-headers PROPERTIES
  LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/ParkedHeaders
)
