cmake_minimum_required(VERSION 3.15)
project(Foxglove-Schemas CXX)

find_package(Protobuf 3 REQUIRED)

FILE(GLOB all_protos "schemas/proto/foxglove/*.proto")

# Create lists of all the generated headers and sources
FOREACH(f ${all_protos})
    file(RELATIVE_PATH f ${CMAKE_CURRENT_SOURCE_DIR}/schemas/proto ${f})
    STRING(REGEX REPLACE "\\.proto$" "" f ${f})
    LIST(APPEND proto_headers "${CMAKE_CURRENT_SOURCE_DIR}/autogenerated/${f}.pb.h")
    LIST(APPEND proto_sources "${CMAKE_CURRENT_SOURCE_DIR}/autogenerated/${f}.pb.cc")
ENDFOREACH(f)

LIST(APPEND proto_sources ${proto_headers})

# Create a directory for the generated files
FILE(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/autogenerated)

# Execute the protoc compiler
add_custom_command(
    OUTPUT ${proto_sources}
    COMMAND ${CMAKE_COMMAND} -E make_directory autogenerated
    COMMAND ${Protobuf_PROTOC_EXECUTABLE} --proto_path=${CMAKE_CURRENT_SOURCE_DIR}/schemas/proto --cpp_out=${CMAKE_CURRENT_SOURCE_DIR}/autogenerated ${all_protos}
)

add_library(foxglove_schemas_protobuf ${proto_sources})

target_include_directories(foxglove_schemas_protobuf PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/autogenerated)

target_link_libraries(foxglove_schemas_protobuf PUBLIC protobuf::libprotobuf)

set_property(TARGET foxglove_schemas_protobuf PROPERTY CXX_STANDARD 17)


# Set all the headers as public so they are installed and add the proto files since they should also be installed in the include directory
LIST(APPEND proto_headers ${all_protos})
set_target_properties(foxglove_schemas_protobuf PROPERTIES PUBLIC_HEADER "${proto_headers}" )


install(TARGETS foxglove_schemas_protobuf 
        LIBRARY DESTINATION lib 
        PUBLIC_HEADER DESTINATION include/foxglove)
