#  W A R N I N G
#  -------------
#
# This file is not part of the Qt API.  It exists purely as an
# implementation detail.  It may change from version to version
# without notice, or even be removed.
#
# We mean it.
#

qtPrepareTool(QMAKE_TRACEGEN, tracegen)

isEmpty(TRACEGEN_DIR): TRACEGEN_DIR = .

PROVIDER_NAME = qt$$lower($$MODULE)
INCLUDEPATH += $$absolute_path($$TRACEGEN_DIR, $$OUT_PWD)
HEADER_PATH = $$OUT_PWD/$$TRACEGEN_DIR/$${PROVIDER_NAME}_tracepoints_p$${first(QMAKE_EXT_H)}

if(qtConfig(lttng)|qtConfig(etw)) {
    SOURCE_PATH = $$OUT_PWD/$$TRACEGEN_DIR/$${PROVIDER_NAME}_tracepoints$${first(QMAKE_EXT_CPP)}

    isEmpty(BUILDS)|build_pass {
        impl_file_contents = \
            "$${LITERAL_HASH}define TRACEPOINT_CREATE_PROBES" \
            "$${LITERAL_HASH}define TRACEPOINT_DEFINE" \
            "$${LITERAL_HASH}include \"$${HEADER_PATH}\""

        write_file($$SOURCE_PATH, impl_file_contents)|error()
    }

    GENERATED_SOURCES += $$SOURCE_PATH

    tracegen.input = TRACEPOINT_PROVIDER
    tracegen.output = $$HEADER_PATH
    tracegen.variable_out = HEADERS
    tracegen.depends += $$QMAKE_TRACEGEN_EXE
    tracegen.CONFIG = target_predeps

    qtConfig(lttng) {
        tracegen.commands = $$QMAKE_TRACEGEN lttng ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
        QMAKE_USE_PRIVATE += lttng-ust
    } else {
        tracegen.commands = $$QMAKE_TRACEGEN etw ${QMAKE_FILE_IN} ${QMAKE_FILE_OUT}
    }

    QMAKE_EXTRA_COMPILERS += tracegen

    DEFINES += Q_TRACEPOINT
} else {
    isEmpty(BUILDS)|build_pass {
        header_file_contents = "$${LITERAL_HASH}include <private/qtrace_p.h>"
        write_file($$HEADER_PATH, header_file_contents)|error()
    }
}
