Pergunta

1) Precisamos de Makefiles para construir C++ no z/OS USS e em uma plataforma Linux.É aconselhável usar o gnu make no z/OS USS para manter nossos makefiles comuns?

2) Se os Makefiles forem comuns, então algumas etapas nos Makefiles ainda seriam condicionais à plataforma.Podemos fazer isso seguindo etapas semelhantes à compilação condicional?Se sim, podemos obter ajuda com a sintaxe?

3) Nossos Makefiles USS do z/OS possuem scripts de shell ou grupos de comandos, como no exemplo abaixo, com colchetes [] apresentando os comandos para o shell como um grupo, em vez de uma linha por vez.Parece que usando o make GNU, tivemos que modificar esses comandos para se tornarem uma linha, o que é confuso, e o loop aninhado era um problema.Existe uma maneira mais fácil de agrupar comandos usando o 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 
 ]
Foi útil?

Solução

Isenções de responsabilidade:

  1. Não sei nada sobre z/OS USS,
  2. Conheço muito sobre Make (e quando você está segurando um martelo,...).

Conselho:

  • Sim, eu recomendo usar o GNUMake em ambas as plataformas e manter seus Makefiles o mais comuns possível.
  • Existem algumas maneiras de colocar condicionalidade em um 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
    

    E há outros truques mais avançados que você pode tentar quando estiver entediado com eles.

  • Não tenho certeza do que você quer dizer quando diz que deseja que os comandos sejam processados ​​em grupos, mas suspeito que você pode conseguir o que deseja anexando ;\ a cada comando no grupo, para que eles sejam executados um por um no mesmo subshell (caso contrário, cada comando terá seu próprio subshell).

  • Outras dicas

    Se você precisar de falhas portáteis, use o GNU Make. Estou executando -o sob o USS há anos, sem problemas. Se você não se sentir confortável construindo você mesmo, pode obter uma cópia de AA daqui

    Eu criei várias aplicações no z/OS usando o Unix System Services (USS) e C/C ++/HLASM. Eu descobri que é Vale a pena para usar o gmake em vez de fazer. Sim, você precisa baixar o Gmake e configurá -lo, mas é muito mais fácil de usar e muito mais fácil de tornar portátil. Além de Gmake, você pode querer obter Bash também. Vai ser mais fácil ter scripts de shell portáteis entre o USS e outras plataformas usando o Bash, em vez de forçar -se a usar sh. Provavelmente, existem alguns lugares em que você pode obter, mas eu usei o site do foguete: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (É gratuito se você não quiser suporte).

    Licenciado em: CC-BY-SA com atribuição
    Não afiliado a StackOverflow
    scroll top