سؤال
أدركت أن سؤالي السابق كان مرتبكا قليلا بشأن القواعد والتبعية. يقوم ملف .pro التالي بإنشاء MICFFILE يعمل بشكل صحيح إذا كان الملفات المصدر الموجودة في الدليل الموجودة في الوقت الذي يعمل فيه Qmake.
idl.target = generated/qmtest.h
idl.commands = code_generator
idl.config = no_link
idl.depends = $$SOURCES $$HEADERS $$FORMS
TEMPLATE = app
INCLUDEPATH += generated
SOURCES += generated/*.cpp
PRE_TARGETDEPS += generated/qmtest.h
QMAKE_EXTRA_UNIX_TARGETS += idl
ولكن عندما يدير Qmake، فإنها فقط توليد MICFILE، و Pre_Targetdeps & Qmake_extra_unix_targets لا تساعدني. كيف يمكنني الحصول على Qmake لإنشاء Makefile مما سيضيف محتويات المصادر التي تم إنشاؤها / إلى أخرى؟
المحلول
قد تحتاج إلى القيام بذلك في مرورين.
في ملف Qmake الخاص بك، أضف السطر التالي:
include( generated/generated.pri )
ثم، في نهاية البرنامج النصي Code_Generator الخاص بك، أضف المصادر إلى ملف Good.Pri (باستخدام Bash للمثال، ولكن الفكرة هي نفسها تقريبا لجميع اللغات):
rm generated/generated.pri
for file in $( ls generated/*.cpp ); do
echo "SOURCES += ${file}" >> generated/generated.pri
done
في المرة الأولى التي تقوم فيها بتشغيل ملف Qmake، ولدت / تم إنشاؤها. من المفترض أن تكون فارغة. عند تشغيل جعل، سيقوم بملء ملف Good.Pri. في المرة الثانية، ستقوم بإعادة إنشاء ملف صنع (كمصدر) تم تغيير ملف .pri)، ثم ترجمة مرة أخرى. قد تكون قادرا على الكمان مع أوامر أخرى من شأنها أن تفعل المرحلة الثانية لك.
نصائح أخرى
كان لدي نفس المشكلة الآن فقط، ولكن بالنسبة ل USECASE أبسط من ملف واحد تم إنشاؤه فقط. لذلك، وجدت طريقة أبسط بكثير لتحقيق ذلك باستخدام Generated_Sources بدلا من المصادر:
dummyfile.target = dummy.cpp dommilfile.comMands = touch $$ dummyfile.target Qmake_extra_targets + = dummyfile generated_sources + = dommilfile.target
ربما يمكن للمرء أن يدفع ذلك إلى حلقة Qmake وإنشاء الأهداف المناسبة لملفات متعددة أيضا.
لقد حضرت حلا وأعتقد أنه قوي وعامة، يعتمد على qmake
توليد mainsfile جنو.
قل لدينا كل ما اضافية SOURCES
و HEADERS
المهام في ملف اسمه Makefile.pri
, ، والتي يتم إنشاؤها عن طريق تنفيذ البرنامج النصي generate_Makefile.pri.sh
وهذا يولد أيضا المصادر و / أو رؤوس المذكورة في Makefile.pri
.
نريد هذا الملف تلقائيا ومولد بشكل موثوق بواسطة نظام الإنشاء نفسه، حتى يتم تضمينه في .pro
ملف، بحيث qmake
يمكن أن تأخذ في الاعتبار محتواها وتوليد Makefile مع التبعيات الصحيحة.
هذا هو ثم ما علينا أن نضع لدينا .pro
ملف.
Makefile_pri.target = Makefile.pri
Makefile_pri.commands = generate_Makefile.pri.sh
Makefile_pri.depends = FORCE
Makefile.target = $$MAKEFILE
Makefile.depends = Makefile_pri
include($$Makefile_pri.target)
QMAKE_EXTRA_TARGETS = Makefile Makefile_pri
من هنا:
- إذا لم يكن هناك
Makefile.pri
, ، ثم يتم إنشاؤها؛ - إذا
Makefile.pri
يتم إنشاؤها أو تحديثها، ثمqmake
يعمل مرة أخرى ويأخذ في الاعتبار محتواها، مما تجددMakefile
كما قال هذا هل يعتمد على qmake
توليد Makefile GNU، ولكن نفس النهج الذي أؤمن أنه يمكن تكييفه للعمل أيضا مع أنظمة البناء المستهدفة الأخرى.