سؤال

1) نحن بحاجة إلى Makefiles لبناء C++ على كل من z/OS USS ومنصة Linux.هل يُنصح باستخدام gnu make على z/OS USS للحفاظ على ملفات makefiles الخاصة بنا مشتركة؟

2) إذا كانت ملفات Makefiles شائعة، فستظل بعض الخطوات في Makefiles مشروطة بالمنصة.هل يمكننا فعل ذلك بخطوات مشابهة للتجميع الشرطي؟إذا كانت الإجابة بنعم، هل يمكننا الحصول على مساعدة في بناء الجملة؟

3) تحتوي ملفات z/OS USS Makefiles الخاصة بنا على نصوص برمجية أو مجموعات من الأوامر، كما هو موضح في المثال أدناه، مع الأقواس المربعة [] التي تقدم الأوامر إلى الصدفة كمجموعة، بدلاً من سطر واحد في كل مرة.يبدو أنه باستخدام GNU make، كان علينا تعديل هذه الأوامر لتصبح سطرًا واحدًا، وهو أمر فوضوي، وكانت الحلقة المتداخلة مشكلة.هل هناك طريقة أسهل لتجميع الأوامر باستخدام gmake؟

  [ 
  dirs=$(targets) 
  rc=0 
  for dir in $$dirs 
  do 
    cd $$dir/src 
    make -r 
    rc=$$? 
    if [ $$rc != 0 ]; then 
      echo "build failed for directory:" $$dir: 
      break; 
    fi 
    cd ../..
   done 
   echo "return code from make = " $$rc 
 ]
هل كانت مفيدة؟

المحلول

إخلاء المسؤولية:

  1. لا أعرف شيئًا عن z/OS USS،
  2. أعرف الكثير عن الصنع (وعندما تحمل مطرقة،...).

نصيحة:

  • نعم، أوصي باستخدام GNUmake على كلا النظامين الأساسيين والحفاظ على ملفات Makefiles الخاصة بك شائعة قدر الإمكان.
  • هناك طريقتان لوضع الشرط في ملف Makefile.

    # Usually one defines a variable first.
    SYSTEM = $(shell uname)
    
    # Then one can define other variables conditionally
    
    SOMEFILE = $(SYSTEM)_file
    
    ifeq ($(SYSTEM), Linux)
    # Do some Linux things, define variables, whatever.
    else
    # Do some z/OS USS things.
    endif
    
    # In a block of commands, if the conditional DOESN'T start with a tab,
    # it's a Make statement and follows Make syntax.
    thing:
    ifeq($(SYSTEM), Linux)
        shell-command-do-something
    endif
    
    # If the conditional DOES follow a tab, Make expands the variables and passes
    # the whole thing to the shell, so the syntax is whatever the shell requires.
    otherthing:
        if($(SYSTEM)==ZOS) do_x ; otherwise do_y ; finish
    

    وهناك حيل أخرى أكثر تقدمًا يمكنك تجربتها عندما تشعر بالملل منها.

  • لست متأكدًا مما تقصده عندما تقول أنك تريد معالجة الأوامر في مجموعات، ولكن أظن أنه يمكنك الحصول على ما تريده عن طريق إلحاق ;\ بكل أمر في المجموعة، بحيث يتم تنفيذهم واحدًا تلو الآخر واحد في نفس القشرة الفرعية (وإلا فإن كل أمر سيحصل على قذيفة فرعية خاصة به).

  • نصائح أخرى

    إذا كان لديك حاجة للمحمول Makefiles، وبكل الوسائل استخدام GNU جعل. لقد تم تشغيله تحت USS لسنوات حتى الآن دون أي مشاكل. إذا كنت لا تشعر بالراحة بناء ذلك بنفسك، يمكنك الحصول على نسخة أأ <لأ href = "http://www-03.ibm.com/servers/eserver/zseries/zos/unix/bpxa1ty1.html#gmake" يختلط = "noreferrer نوفولو"> من هنا

    ولقد بنيت العديد من التطبيقات على ض / OS باستخدام يونكس خدمات النظام (USS) وC / C ++ / HLASM. لقد وجدت أنه على جيدا يستحق كل هذا العناء لاستخدام gmake بدلا من جعل. نعم، لديك لتحميل gmake وإعداده، ولكن انها وسيلة أسهل في الاستخدام، وأسهل طريقة لجعل المحمولة. بالإضافة إلى gmake، قد ترغب في الحصول على باش كذلك. فإنه سيكون من الأسهل أن يكون مخطوطات قذيفة المحمولة بين USS ومنصات أخرى باستخدام باش بدلا من إجبار نفسك على استخدام <م> ش . ربما يكون هناك عدد قليل من الأماكن التي يمكنك الحصول عليها gmake وباش من، ولكن لقد استعملت الموقع الصواريخ: <لأ href = "http://www.rocketsoftware.com/product-categories/mainframe/bash-zos" يختلط = "noreferrer نوفولو"> http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (وأنه مجاني إذا كنت لا تريد الدعم).

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