Question

1) Nous avons besoin de Makefile pour construire C ++ sur les deux z / OS USS et une plate-forme Linux. Est-il conseillé d'utiliser gnu faire sur z / OS USS afin de garder nos makefiles commun?

2) Si les Makefiles sont communs, puis quelques étapes du Makefile, seraient toujours conditionnelle à la plate-forme. Peut-on faire par étapes qui sont semblables à la compilation conditionnelle? Si oui, pouvons-nous s'il vous plaît obtenir de l'aide avec la syntaxe?

3) Notre z / OS USS Makefiles ont des scripts shell ou des groupes de commandes, comme dans l'exemple ci-dessous, avec les crochets [] présentant les commandes à l'enveloppe en tant que groupe, au lieu d'une ligne à la fois. Il semble que l'utilisation de la GNU make, nous avons dû modifier ces commandes pour devenir une ligne, ce qui est en désordre, et la boucle imbriquée était un problème. Y at-il un moyen plus facile de regrouper les commandes à l'aide 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 
 ]
Était-ce utile?

La solution

Avertissements:

  1. Je ne sais rien de z / OS USS,
  2. Je sais beaucoup de choses sur Make (et quand vous tenez un marteau, ...).

Conseil:

  • Oui, je vous recommande d'utiliser gnumake sur les deux plates-formes et de garder vos Makefile aussi commun que possible.
  • Il y a deux façons de mettre la conditionnalité dans 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
    

    Et il y a d'autres trucs plus avancés pour essayer quand vous vous ennuyez avec ces derniers.

  • Je ne suis pas sûr de ce que vous voulez dire quand vous dites que vous voulez que les commandes à traiter dans les groupes, mais je pense que vous pouvez obtenir ce que vous voulez en ajoutant, \ à chaque commande le groupe, de sorte qu'ils seront exécutés un par un dans le même sous-shell (sinon chaque commande obtient son propre sous-shell).

        
  • Autres conseils

    Si vous avez besoin de Makefile portables, par tous les moyens d'utiliser GNU make. J'ai fonctionner en USS depuis des années sans aucun problème. Si vous ne vous sentez pas à l'aise construire vous-même, vous pouvez obtenir aa copie d'ici

    Je l'ai construit plusieurs applications sur z / OS utilisant Unix System Services (USS) et C / C ++ / HLASM. Je l'ai trouvé est valent la peine à utiliser gmake plutôt que de faire. Oui, vous devez télécharger gmake et le mettre en place, mais il est beaucoup plus facile à utiliser et plus facile à faire portable. En plus de gmake, vous pouvez obtenir bash aussi bien. Il va être plus facile d'avoir des scripts shell portables entre USS et d'autres plates-formes en utilisant bash plutôt que de vous forcer à utiliser sh . Il y a probablement quelques endroits que vous pouvez obtenir gmake et bash de, mais j'ai utilisé le site Rocket: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (c'est gratuit si vous ne voulez pas du support).

    Licencié sous: CC-BY-SA avec attribution
    Non affilié à StackOverflow
    scroll top