التحكم في ملف رأس المشروع الذي سيتضمنه Xcode
-
25-09-2019 - |
سؤال
يعتمد مشروع XCode الخاص بي على اختلافات في نفس المنتج باستخدام هدفين. الفرق بين الاثنين هو فقط على إصدار المكتبة المضمنة. بالنسبة لملفات مصدر .C ، من السهل تعيين الإصدار الصحيح إلى الهدف الصحيح باستخدام خانة الاختيار الهدف. ومع ذلك ، بما في ذلك ملف الرأس يتضمن دائمًا نفس الملف. هذا صحيح لهدف واحد ، ولكن خطأ بالنسبة للآخر.
هل هناك طريقة للتحكم في ملف الرأس الذي يتم تضمينه بواسطة كل هدف؟
إليكم التسلسل الهرمي لملف المشروع (الذي يتم نسخه في XCode):
MyProject
TheirOldLib
theirLib.h
theirLib.cpp
TheirNewLib
theirLib.h
theirLib.cpp
myCode.cpp
و mycode.cpp يفعل شيء مثل:
#include "theirLib.h"
…
somecode()
{
#if OLDVERSION
theirOldLibCall(…);
#else
theirNewLibCall(…);
#endif
}
وبالطبع ، أحدد OLDVERSION
لهدف واحد وليس للآخر.
لاحظ ال #include
يجب أن يكون كما هو موضح. كل من الفشل التالي مع ملف لم يتم العثور عليه:
#include "TheirOldLib/theirLib.h"
#include "TheirNewLib/theirLib.h"
فهل هناك طريقة لإخبار Xcode theirLib.h
لتضمين هدف لكل هدف؟
قيود:
- ملف اثنين من الرأس له نفس الاسم. بصفتي الملاذ الأخير ، يمكنني إعادة تسمية أحدهم ، لكنني أفضل تجنب ذلك لأن هذا سيؤدي إلى سحب الشعر الرئيسي على المنصات الأخرى.
- الاضطرار إلى تغيير #include
لإضافة إشارة إلى المجلد المرفق هو أيضًا شيء أفضل تجنبه ، لأنني سأحتاج إلى القيام بذلك مرتين بتوجيهات ترجمة مشروطة.
- أنا حر في تعديل مشروعي كما أرى بخلاف ذلك مناسب
شكرا على اي مساعدة.
المحلول
الجزء الرئيسي من الإجابة هو استخدام use_headermap = لا كما اقترح كريس في تعليق. التفاصيل هنا.
وصفة قصيرة (تم فحصها في Xcode 3.2.2):
أضف إعدادًا مخصصًا لـ use_headermap = لا لكل هدف معني. هنا هو كيف:
1.1. افتح لوحة معلومات الهدف على جزء "Build".
1.2. اسحب القائمة المنبثقة لأسفل في أسفل اليسار من النافذة ، حدد "إضافة إعداد محدد من قبل المستخدم".
1.3. في السطر المضافة حديثًا ، قم بتعيين العمود الأول ("الإعداد") إلىUSE_HEADERMAP
, والعمود الثاني ("القيمة") إلىNO
.أضف المسار الصحيح إلى كل هدف (إعدادات البناء الهدف "مسارات بحث الرأس"). في المثال الخاص بي سيكون:
2.1. يضيفTheirOldLib
للهدف "القديم"
2.2. يضيفTheirNewLib
لهدف "جديد"
الخطوة 1 يعطل ميزة خريطة الرأس التلقائية لـ Xcode ، حيث يمكن الوصول إلى أي ملف رأس مضمّن في المشروع مباشرة من خلال اسمه ، مهما كان مساره الفعلي. عندما يكون للرأسان نفس الاسم ، تؤدي هذه الميزة إلى غموض لا يمكن حله.
الخطوة 2 يسمح ل #include "theirLib.h"
للعمل دون تأهيل اسم ملف الرأس الفعلي.
هاتان الخطوتان معًا تفي بالقيود.
أخيراً، USE_HEADERMAP
هو ليس وثقتها Apple ، بقدر ما أستطيع أن أقول. سأملأ تقرير الأخطاء لذلك ، لأن هذا الإعداد أمر بالغ الأهمية في عدد من الحالات ، كما يكشف googling. تم الإبلاغ عن RDAR: // 7840694. أيضا على الرادار المفتوح كما http://openradar.appspot.com/radar؟id=253401
نصائح أخرى
use_headermap = no هو مبالغة لبعض المشاريع. قد يكون يكفي فقط استخدام HeaderMap_includes_flat_entries_for_target_being_built = لا. الوثائق هنا: https://developer.apple.com/library/mac/documentation/developertools/reference/xcodebuildsettingref/1-build_setting_reference/build_setting_ref.html#//apple_ref/doc/uid/tp40003931-ch3-sw159
لماذا لا يمكنك استخدام مختلف المسارات في كل هدف؟
استخدم use_headermap = no وفي "مسارات البحث عن رأس المستخدم" ، قم بتضمين دليلك المخصص أولاً ودليل المشروع بشكل متكرر: $ {project_dir}/hernewlib $ {project_dir}/**