File: cpp_bindgen_generate.cmake

package info (click to toggle)
gridtools 2.0.0-3
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 21,728 kB
  • sloc: cpp: 45,263; python: 9,383; javascript: 8,445; ansic: 2,564; sh: 509; f90: 370; makefile: 216
file content (44 lines) | stat: -rw-r--r-- 2,179 bytes parent folder | download | duplicates (4)
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
41
42
43
44
function(check_and_update target_file new_file)
    execute_process(
        COMMAND ${CMAKE_COMMAND} -E compare_files ${target_file} ${new_file}
        RESULT_VARIABLE compare_result
        )

    if(${compare_result} EQUAL 0)
        message(STATUS "${target_file} is up-to-date")
    else()
        message(WARNING "${target_file} was generated! "
            "If you ship the generated bindings with your sources, don't forget to ship this updated file (and its variants). "
            "Otherwise, this warning can be ignored.")

        get_filename_component(target_path ${target_file} PATH)
        file(COPY ${new_file} DESTINATION ${target_path})
    endif()
    file(REMOVE ${new_file})
endfunction()

# Generate bindings and compare against existing ones
message(STATUS "Generating bindings for library ${FORTRAN_MODULE_NAME}")

set(generator_dir ${CMAKE_CURRENT_BINARY_DIR}/CMakeFiles/generated_bindings)
file(MAKE_DIRECTORY ${generator_dir})
get_filename_component(filename_BINDINGS_C_DECL_FILENAME ${BINDINGS_C_DECL_FILENAME} NAME)
set(new_BINDINGS_C_DECL_FILENAME ${generator_dir}/${filename_BINDINGS_C_DECL_FILENAME})
get_filename_component(filename_BINDINGS_FORTRAN_DECL_FILENAME ${BINDINGS_FORTRAN_DECL_FILENAME} NAME)
set(new_BINDINGS_FORTRAN_DECL_FILENAME ${generator_dir}/${filename_BINDINGS_FORTRAN_DECL_FILENAME})

# run generator
execute_process(COMMAND ${GENERATOR} ${new_BINDINGS_C_DECL_FILENAME} ${new_BINDINGS_FORTRAN_DECL_FILENAME} ${FORTRAN_MODULE_NAME}
    RESULT_VARIABLE generate_result
    OUTPUT_VARIABLE generate_out
    ERROR_VARIABLE generate_out
    )

if(${generate_result} STREQUAL "0")
    # only update the bindings if they changed (file not touched -> no rebuild is triggered)
    check_and_update(${BINDINGS_C_DECL_FILENAME} ${new_BINDINGS_C_DECL_FILENAME})
    check_and_update(${BINDINGS_FORTRAN_DECL_FILENAME} ${new_BINDINGS_FORTRAN_DECL_FILENAME})
else()
    message(FATAL_ERROR "GENERATING BINDINGS FAILED. Possibly you cross-compiled the bindings generator for a target "
        " which cannot be executed on this host. Consider using the cross-compilation option.\n Exit code: ${generate_result}\n${generate_out}")
endif()