Frage

1) Wir haben einen Bedarf für Makefiles C ++ zu bauen sowohl auf z / OS USS und eine Linux-Plattform. Ist es ratsam, auf z / OS USS machen zu verwenden, um Gnu unsere Makefiles gemeinsam zu halten?

2) Wenn die Makefiles gemeinsam sind, dann einige Schritte in den Makefiles, würde diese noch bedingt sein, um die Plattform. Können wir, dass durch die Schritte tun, die bedingte Kompilierung ähnlich sind? Wenn ja, können wir bitte die Hilfe bei der Syntax bekommen?

3) Unsere z / OS USS Makefiles haben Shell-Skripten oder Gruppen von Befehlen, wie im Beispiel unten, mit den eckigen Klammern [] als Gruppe die Befehle an die Shell präsentiert, eher als eine Zeile zu einem Zeitpunkt. Es scheint, dass das GNU make verwenden wir diese Befehle zu ändern, hatten eine Zeile zu werden, was unordentlich ist, und die verschachtelte Schleife war ein Problem. Gibt es einen einfacheren Weg, um Gruppenbefehle mit 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 
 ]
War es hilfreich?

Lösung

Haftungsausschluss:

  1. Ich weiß nichts über z / OS USS,
  2. Ich weiß viel über Make (und wenn Sie mit einem Hammer, ...).

Hinweis:

  • Ja, ich würde mit gnumake auf beiden Plattformen empfehlen und Ihre Makefiles so häufig wie möglich zu halten.
  • Es gibt ein paar Möglichkeiten, Konditionalität in einem Makefile zu setzen.

    # 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
    

    Und es gibt andere, fortschrittlichere Tricks zu versuchen, wenn Sie mit diesen langweilig ist.

  • Ich bin mir nicht sicher, was Sie meinen, wenn Sie sagen, dass Sie die Befehle wollen in Gruppen bearbeitet werden, aber ich vermute, Sie bekommen, was Sie wollen durch Anhängen; \ auf jeden Befehl in die Gruppe, so dass sie einen nach dem anderen in der gleichen Subshell ausgeführt wird (sonst jeder Befehl erhält eine eigene Subshell).

        
  • Andere Tipps

    Wenn Sie eine Notwendigkeit für portable Makefiles haben, mit allen Mitteln verwendet GNU make. Ich habe es unter USS läuft seit Jahren ohne Probleme. Wenn Sie es selbst nicht wohl Gebäude fühlen, können Sie aa Kopie von hier

    habe ich mehrere Anwendungen auf z / OS mit Unix System Services (USS) und C / C ++ / HLASM gebaut. Ich habe festgestellt, es ist lohnt sich eher verwenden gmake als machen. Ja, Sie haben zum Download gmake und richtete ihn auf, aber es ist viel einfacher zu bedienen und so leichter zu tragbar machen. Neben gmake, können Sie bash als auch zu bekommen. Es wird leichter sein, tragbare Shell-Skripten zwischen USS und anderen Plattformen haben bash verwenden, anstatt sich zwingen zu verwenden sh . Es gibt wahrscheinlich ein paar Orte, die Sie gmake und bash von bekommen, aber ich habe die Rakete Website verwendet: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (es ist kostenlos, wenn Sie nicht Unterstützung wollen).

    Lizenziert unter: CC-BY-SA mit Zuschreibung
    Nicht verbunden mit StackOverflow
    scroll top