Gnu Make и z / OS USS make - PullRequest
       26

Gnu Make и z / OS USS make

2 голосов
/ 08 октября 2009

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

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

3) Наши файлы Makefile 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 ]

3 голосов
/ 25 ноября 2009

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

3 голосов
/ 08 октября 2009

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

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

Совет:

Да, я бы рекомендовал использовать GNUMake на обеих платформах и сохранять ваши Makefile как можно более распространенными. Есть несколько способов поместить условия в 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

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

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

Я создал несколько приложений в 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 (это бесплатно, если вам не нужна поддержка).

...