فصل الكائنات والمصدر باستخدام ملف تعريفي

StackOverflow https://stackoverflow.com/questions/1015836

  •  06-07-2019
  •  | 
  •  

سؤال

لقد كنت أواجه مشاكل في جعل ملفات التعريف الخاصة بي تعمل بالطريقة التي أريدها.أولاً، أود أن أقول إن هذا من صنع POSIX، كما في http://www.opengroup.org/onlinepubs/009695399/utilities/make.html أحتاج إلى نظام البناء الخاص بي للعمل مع كل من BSDs وGNU (Linux).

ما أريده هو ملف تعريف صيانة صفر.أريده فقط تجميع جميع ملفات .c و.asm في src/ ووضع ملفات الكائنات في objs/ ثم ربط كل شيء في objs/ بملف ثنائي.

يمكنني فعل الكثير، لكن لا يمكنني الفصل بين ملفات المصدر وملفات obj.

أنا على ما يرام إذا كان هذا يتطلب القليل من البرمجة النصية المضمنة لـ Shell (باستخدام POSIX المحدد /bin/sh) ، لكن لا يمكنني تشغيل التبعيات بشكل صحيح.أريده أن يقوم ببناء ملف الكائن فقط إذا كان الملف المصدر أحدث.

الأقرب عندي هو هذا:

${C_OBJS}: ${HDRS} ${*:objs/%=src/%}.c
    ${CC} ${CFLAGS} -c ${*:objs/%=src/%}.c -o $*.o

تتضمن هذه المشكلة أنه لا يزال يتعين علي تحديد C_OBJS=objs/foo.o وما شابه، كما أنها بالكاد ليست POSIX وبالتالي يتم تجميعها باستخدام BSD make ولكن ليس GNU make.

هل كانت مفيدة؟

المحلول

إصدار POSIX من make لا يدعم بشكل صريح أسماء الملفات التي تحتوي على خطوط مائلة، ولا يوفر شرطًا لفصل الملفات المصدر في دليل مختلف عن ملفات الكائنات.وكما لاحظ @caskey، فهو لا يدعم أي تدوين باستخدام '%'، على الرغم من أنها تشير إلى وجود مثل هذه القواعد وتوصي بحجزها لاستخدامها كأحرف أولية.

وبالتالي، ربما لا يمكنك فعل ما تريد باستخدام POSIX القياسي make.

من الناحية العملية، يمكنك في كثير من الأحيان القيام بما تسعى إليه باستخدام تطبيقات محددة make, ، ولكن النتيجة makefile لديه قابلية محدودة.

فكر في استخدام أنظمة إنشاء ملفات تعريفية من نوع ما - cmake أو الأدوات التلقائية (autoconf, libtool, automake, ، إلخ).أو أحد التعديلات العديدة للمفاهيم الأساسية لـ make:

  • السكونز
  • نملة
  • كيك
  • يطبخ
  • حمالات الصدر
  • ...وعشرات من الأشياء التي نسيتها أو لم أسمع عنها...

نصائح أخرى

وPOSIX جعل لا يدعم بنيات مثل؟

  objs/%.o : src/%.c
    ${CC} ${CFLAGS} -c $< -o $@

ونسيت علامة الاستفهام في النهاية، أمل أن يجعل تعليقي أكثر وضوحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top