Domanda

1) Abbiamo bisogno di Makefiles di costruire C ++ sia su z / OS USS e una piattaforma Linux. E 'consigliabile usare GNU make su z / OS USS al fine di mantenere i nostri makefiles comune?

2) Se i Makefile sono comuni, poi alcuni passi nel Makefile, sarebbero ancora subordinata alla piattaforma. Possiamo farlo con passaggi che sono simili a compilazione condizionale? Se sì, si prega possiamo ottenere aiuto con la sintassi?

3) La nostra z / OS USS Makefiles ha shell script o gruppi di comandi, come nell'esempio di seguito, con le parentesi quadre [] presentando i comandi alla shell come gruppo, piuttosto che una riga alla volta. Sembra che usando il GNU make, abbiamo dovuto modificare questi comandi per diventare una linea, che è disordinato, e il ciclo annidato era un problema. C'è un modo più semplice per raggruppare comandi utilizzando 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 
 ]
È stato utile?

Soluzione

Disclaimer:

  1. Non so niente di z / OS USS,
  2. so molto su Marca (e quando si è in possesso di un martello, ...).

Consigli:

  • Sì, mi consiglia di utilizzare gnumake su entrambe le piattaforme e mantenere i vostri Makefiles comune come possibile.
  • Ci sono un paio di modi per mettere condizionalità in un 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 ci sono altri, trucchi più avanzati da provare quando siete annoiati con questi.

  • Non sono sicuro di cosa si intende quando si dice che si desidera che i comandi da elaborare in gruppo, ma ho il sospetto si può ottenere ciò che si vuole aggiungendo: \ ad ogni comando in il gruppo, in modo che essi saranno eseguiti uno ad uno nello stesso sottoshell (altrimenti ogni comando ottiene il proprio subshell).

        
  • Altri suggerimenti

    Se avete bisogno di Makefiles portatili, con tutti i mezzi utilizzare GNU make. Ho corso sotto USS ormai da anni senza problemi. Se non si sente a proprio agio costruire da soli, è possibile ottenere aa copia da qui

    Ho costruito diverse applicazioni su z / OS che utilizzano UNIX System Services (USS) e C / C ++ / HLASM. Ho trovato è vale la pena per usare gmake piuttosto che fare. Sì, è necessario scaricare gmake e configurarlo, ma è modo più semplice da usare, e il modo più semplice per fare portatile. Oltre a gmake, si potrebbe desiderare di ottenere bash pure. E sta per essere più facile avere gli script di shell portabile tra USS e altre piattaforme usando bash piuttosto che costringere se stessi per usare sh . Probabilmente ci sono alcuni luoghi che si possono ottenere gmake e bash, ma ho usato il sito Rocket: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (è gratuito se non si desidera il supporto).

    Autorizzato sotto: CC-BY-SA insieme a attribuzione
    Non affiliato a StackOverflow
    scroll top