# Message Utilities Library TEMPLATE = lib TARGET = MsgUtils CONFIG += shared c++20 moc QT += core network serialbus QMAKE_CXXFLAGS += -Wall -Werror -Wextra DESTDIR = $$PWD/lib include(codegen.pri) LEAHI_MSG_CONF = $$PWD/../../data/LeahiUnhandled.conf GEN_INCLUDE_DIR = $$PWD/include GEN_SRC_DIR = $$PWD/src GEN_DATA_DIR = $$OUT_PWD/data # ============================================================================= # Code generation # ============================================================================= # 1. Message Definitions # qmake extra-compilers map one input -> one declared output, so this drives off # the .conf and declares the primary output; the other three get rules below. msgdefs.name = leahi_msgdefs msgdefs.input = LEAHI_MSG_CONF msgdefs.output = $$GEN_INCLUDE_DIR/LeahiMsgDefs.h msgdefs.variable_out = HEADERS msgdefs.commands = \ $$shell_quote($$PROJECT_PYTHON) \ $$MSGUTILS_SCRIPTS_DIR/GenerateMsgDefsCpp.py \ --namespace leahi \ --header_dir $$GEN_INCLUDE_DIR \ --source_dir $$GEN_SRC_DIR \ --proto \ ${QMAKE_FILE_IN} \ Leahi msgdefs.depends = \ $$MSGUTILS_SCRIPTS_DIR/msgutils/MsgData.py \ $$MSGUTILS_SCRIPTS_DIR/msgutils/MsgCpp.py \ $$MSGUTILS_SCRIPTS_DIR/GenerateMsgDefsCpp.py \ $$MSGUTILS_SCRIPTS_DIR/msgutils/templates/MsgDefs_h.jinja \ $$MSGUTILS_SCRIPTS_DIR/msgutils/templates/MsgDefs_cpp.jinja \ $$MSGUTILS_SCRIPTS_DIR/msgutils/templates/MsgProtoUtils_h.jinja \ $$MSGUTILS_SCRIPTS_DIR/msgutils/templates/MsgProtoUtils_cpp.jinja msgdefs.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += msgdefs # 2. Protobuf Definitions (.proto) proto.name = leahi_proto proto.input = LEAHI_MSG_CONF proto.output = $$GEN_DATA_DIR/LeahiMsgDefs.proto proto.commands = \ $$shell_quote($$PROJECT_PYTHON) \ $$MSGUTILS_SCRIPTS_DIR/GenerateProtobuf.py \ --namespace leahi \ --output_dir $$GEN_DATA_DIR \ ${QMAKE_FILE_IN} \ LeahiMsgDefs.proto proto.depends = \ $$MSGUTILS_SCRIPTS_DIR/msgutils/MsgData.py \ $$MSGUTILS_SCRIPTS_DIR/msgutils/MsgProtobuf.py \ $$MSGUTILS_SCRIPTS_DIR/GenerateProtobuf.py \ $$MSGUTILS_SCRIPTS_DIR/msgutils/templates/MsgDefs_proto.jinja proto.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += proto # 3. Protobuf C++ (.proto -> .pb.h/.pb.cc) protoc_cpp.name = leahi_protoc protoc_cpp.input = LEAHI_MSG_CONF protoc_cpp.output = $$GEN_SRC_DIR/LeahiMsgDefs.pb.cc protoc_cpp.variable_out = SOURCES protoc_cpp.commands = \ $$PROTOC \ --proto_path $$GEN_DATA_DIR \ --cpp_out $$OUT_PWD \ $$GEN_DATA_DIR/LeahiMsgDefs.proto && \ $$QMAKE_COPY $$OUT_PWD/LeahiMsgDefs.pb.h $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h && \ $$QMAKE_COPY $$OUT_PWD/LeahiMsgDefs.pb.cc $$GEN_SRC_DIR/LeahiMsgDefs.pb.cc && \ $$QMAKE_DEL_FILE $$OUT_PWD/LeahiMsgDefs.pb.h $$OUT_PWD/LeahiMsgDefs.pb.cc protoc_cpp.depends = $$GEN_DATA_DIR/LeahiMsgDefs.proto protoc_cpp.CONFIG += no_link target_predeps QMAKE_EXTRA_COMPILERS += protoc_cpp # 4. additional generated file dependencies # Each generator above emits several files but can only declare one as output. # Give the rest of the generated files their own rules, so anything depending # on them resolves. pb_header.target = $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h pb_header.depends = $$GEN_SRC_DIR/LeahiMsgDefs.pb.cc QMAKE_EXTRA_TARGETS += pb_header msgdefs_secondary.target = $$GEN_SRC_DIR/LeahiMsgDefs.cpp msgdefs_secondary.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.h QMAKE_EXTRA_TARGETS += msgdefs_secondary protoutils_h.target = $$GEN_INCLUDE_DIR/LeahiMsgProtoUtils.h protoutils_h.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.h QMAKE_EXTRA_TARGETS += protoutils_h protoutils_cpp.target = $$GEN_SRC_DIR/LeahiMsgProtoUtils.cpp protoutils_cpp.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.h QMAKE_EXTRA_TARGETS += protoutils_cpp # ============================================================================= # Generated headers and sources # ============================================================================= GENERATED_INCLUDES = \ $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h \ $$GEN_INCLUDE_DIR/LeahiMsgProtoUtils.h GENERATED_SRCS = \ $$GEN_SRC_DIR/LeahiMsgDefs.cpp \ $$GEN_SRC_DIR/LeahiMsgProtoUtils.cpp HEADERS += $$GENERATED_INCLUDES SOURCES += $$GENERATED_SRCS # Create the dependencies between the object files and generated files so generated files # are made before trying to compile them into objects. protoutils_obj.target = LeahiMsgProtoUtils.o protoutils_obj.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h QMAKE_EXTRA_TARGETS += protoutils_obj msgdefs_obj.target = LeahiMsgDefs.o msgdefs_obj.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.h QMAKE_EXTRA_TARGETS += msgdefs_obj pb_obj.target = LeahiMsgDefs.pb.o pb_obj.depends = $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h QMAKE_EXTRA_TARGETS += pb_obj INCLUDEPATH += $$PWD/include LIBS += -lprotobuf # Comms library INCLUDEPATH += $$PWD/../Comms/include LIBS += -L$$PWD/../Comms/lib -lComms # ============================================================================= # Install / export # ============================================================================= # `make install` stages the library and the usage .pri into $$PREFIX, so another # project can include them using the following: # include($$PREFIX/lib/MsgUtils/MsgUtils.pri) # # Override PREFIX during build time using: # qmake PREFIX= ... isEmpty(PREFIX): PREFIX = $$PWD/../../install target.path = $$PREFIX/lib INSTALLS += target export_pri.path = $$PREFIX/lib/MsgUtils export_pri.files = $$PWD/MsgUtils.pri INSTALLS += export_pri QMAKE_CLEAN += \ $$GEN_INCLUDE_DIR/LeahiMsgDefs.h \ $$GEN_INCLUDE_DIR/LeahiMsgDefs.pb.h \ $$GEN_INCLUDE_DIR/LeahiMsgProtoUtils.h \ $$GEN_SRC_DIR/LeahiMsgDefs.cpp \ $$GEN_SRC_DIR/LeahiMsgDefs.pb.cc \ $$GEN_SRC_DIR/LeahiMsgProtoUtils.cpp \ $$GEN_DATA_DIR/LeahiMsgDefs.proto