Вопрос

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

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

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 
 ]
Это было полезно?

Решение

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

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

Совет:

  • Да, я бы рекомендовал использовать GNUmake на обеих платформах и использовать ваши Make-файлы как можно более распространенными.
  • Есть несколько способов ввести условности в 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 make.Я запускаю его под управлением USS уже много лет без каких-либо проблем.Если вам неудобно создавать его самостоятельно, вы можете получить копию отсюда

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top