aboutsummaryrefslogtreecommitdiff
path: root/cmake/fiddle.cmake
blob: 6830ce551cd0c01c27109439dca5752822ad1199 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
find_program(FIDDLEC "fiddlec")

if (FIDDLEC)
  message (STATUS "Found fiddlec at ${FIDDLEC}")
else()
  message (FATAL_ERROR "Could not find fiddlec. Please download and build it at git@git.josher.dev:fiddle.git")
endif()

function(add_fiddle_source header_out fdl_file)
  get_filename_component(dir_path ${fdl_file} DIRECTORY)
  get_filename_component(file_name_without_extension ${fdl_file} NAME_WE)
  set(path_without_extension "${dir_path}/${file_name_without_extension}")
  
  # Define the output path based on the input `.fdl` file's name
  set(output_header "${CMAKE_BINARY_DIR}/generated/${path_without_extension}.h")
  get_filename_component(output_dir ${output_header} DIRECTORY)
  
  # Define the custom command to generate the header
  add_custom_command(
      OUTPUT ${output_header}
      DEPENDS ${fdl_file}
      COMMENT "Fiddle compile ${fdl_file} -> ${output_header}"
      COMMAND ${CMAKE_COMMAND} -E make_directory "${output_dir}"
      COMMAND ${FIDDLEC} -Lc -h ${output_header} -I ${CMAKE_SOURCE_DIR}/fdl/ --intf-dir ${CMAKE_BINARY_DIR}/fdli/ ${CMAKE_SOURCE_DIR}/${fdl_file}
  )
  
  # Make the output header file available as a source file for the target
  set_source_files_properties(${output_header} PROPERTIES GENERATED TRUE)
  set(${header_out} ${output_header} PARENT_SCOPE)
endfunction()

function(fiddle_sources headers_out files)
  set(headers)
  foreach (fdl_file ${files})
    file(RELATIVE_PATH rel_path "${CMAKE_SOURCE_DIR}" "${fdl_file}")
    add_fiddle_source(header_out ${rel_path})
    list(APPEND headers "${header_out}")
  endforeach()
  set(${headers_out} "${headers}" PARENT_SCOPE)
endfunction()