Gnu Make и z/OS USS make

1) Нам нужны Makefiles для сборки C++ как на z/OS USS, так и на платформе Linux. Желательно ли использовать gnu make в z/OS USS, чтобы наши сборочные файлы были распространены?

2) Если файлы Makefile являются общими, то некоторые шаги в файлах Makefile все равно будут относиться к платформе. Можем ли мы сделать это с помощью шагов, похожих на условную компиляцию? Если да, можем ли мы получить помощь с синтаксисом?

3) Наши Make-файлы z/OS USS имеют сценарии оболочки или группы команд, как в примере ниже, с квадратными скобками [], представляющими команды для оболочки в виде группы, а не по одной строке за раз. Кажется, что с помощью 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 
 ]

3 ответа

Решение

Отказ от ответственности:

  1. Я ничего не знаю о z/OS USS,
  2. Я много знаю о Маке (и когда ты держишь молоток, ...).

Совет:

  • Да, я бы порекомендовал использовать GNUMake на обеих платформах и сохранять ваши Makefiles как можно более распространенными.
  • Есть несколько способов поместить условия в Makefile.

    # Обычно сначала определяют переменную.
    SYSTEM = $(shell uname)
    
    # Тогда можно определить другие переменные условно
    
    SOMEFILE = $(SYSTEM)_file
    
    ifeq ($(SYSTEM), Linux)
    # Делайте некоторые вещи в Linux, определяйте переменные, что угодно.
    еще
    # Делайте некоторые вещи из z / OS USS.
    ENDIF
    
    # В блоке команд, если условное НЕ начинается с вкладки,
    # это оператор Make и следует синтаксису Make.
    вещь:
    ifeq($(SYSTEM), Linux)
        оболочки командной сделай что-то
    ENDIF
    
    # Если условный элемент следует за вкладкой, Make расширяет переменные и передает
    # все это относится к оболочке, поэтому синтаксис - это то, что требуется оболочке.
    Другая вещь:
        if($(SYSTEM)==ZOS) do_x; в противном случае do_y; Конец
    

    И есть другие, более продвинутые трюки, чтобы попробовать, когда вам это надоело.

  • Я не уверен, что вы имеете в виду, когда говорите, что хотите, чтобы команды обрабатывались в группах, но я подозреваю, что вы можете получить то, что хотите, добавив;\ к каждой команде в группе, чтобы они выполнялись по одной один в той же подоболочке (иначе каждая команда получает свою собственную подоболочку).

  • Если вам нужны переносимые файлы Makefile, обязательно используйте GNU make. Я запускаю его под USS уже много лет без проблем. Если вам неудобно создавать его самостоятельно, вы можете получить копию здесь.

    Я создал несколько приложений для z/OS, используя Unix System Services (USS) и C/C++/HLASM. Я обнаружил, что стоит использовать gmake, а не make. Да, вам нужно скачать gmake и настроить его, но это намного проще в использовании и намного проще в переносимости. В дополнение к gmake, вы можете также получить bash. Будет проще иметь переносимые сценарии оболочки между USS и другими платформами, использующими bash, чем заставлять себя использовать sh. Вероятно, есть несколько мест, где вы можете получить gmake и bash, но я использовал сайт Rocket: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (это бесплатно, если вы этого не сделаете хочу поддержки).

    Другие вопросы по тегам