Pregunta

1) Necesitamos Makefiles para compilar C++ tanto en z/OS USS como en una plataforma Linux.¿Es recomendable utilizar gnu make en z/OS USS para mantener nuestros archivos Make comunes?

2) Si los Makefiles son comunes, entonces algunos pasos en los Makefiles aún serían condicionales a la plataforma.¿Podemos hacerlo mediante pasos similares a los de la compilación condicional?En caso afirmativo, ¿podemos obtener ayuda con la sintaxis?

3) Nuestros z/OS USS Makefiles tienen scripts de shell o grupos de comandos, como en el ejemplo siguiente, con los corchetes [] presentando los comandos al shell como un grupo, en lugar de una línea a la vez.Parece que al usar GNU make, tuvimos que modificar estos comandos para que se convirtieran en una línea, lo cual es complicado, y el bucle anidado fue un problema.¿Existe una manera más sencilla de agrupar comandos usando 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 
 ]
¿Fue útil?

Solución

Aviso legal:

  1. No sé nada de z / OS USS,
  2. sé mucho acerca de la realización (y cuando usted está sosteniendo un martillo, ...).

Consejo:

  • Sí, me gustaría recomendar el uso gnumake en ambas plataformas y mantener sus Makefiles la mayor uniformidad posible.
  • Hay un par de maneras de poner la condicionalidad en 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
    

    Y hay otros trucos más avanzados, que puede utilizar cuando estás aburrido de los mismos.

  • No estoy seguro de lo que quiere decir cuando dice que desea que los comandos que se procesan en grupos, pero sospecho que usted puede conseguir lo que quiere anexando; \ a cada comando en el grupo, por lo que serán ejecutadas una por una en el mismo subnivel (de lo contrario cada comando tiene su propio subnivel).

        
  • Otros consejos

    Si usted tiene una necesidad de Makefile portátiles, por todos los medios utilizar GNU make. He estado corriendo bajo USS durante años sin ningún problema. Si no se siente cómodo construcción de uno mismo, se puede obtener copia aa de aquí

    He creado varias aplicaciones en z/OS usando Unix System Services (USS) y C/C++/HLASM.he descubierto que es bien vale la pena usar gmake en lugar de make.Sí, tienes que descargar gmake y configurarlo, pero es mucho más fácil de usar y mucho más fácil de hacer portátil.Además de gmake, es posible que quieras obtener intento también.Será más fácil tener scripts de shell portátiles entre USS y otras plataformas usando bash en lugar de obligarte a usar sh.Probablemente haya algunos lugares donde puedas obtener gmake y bash, pero yo he usado el sitio de Rocket: http://www.rocketsoftware.com/product-categories/mainframe/bash-zos (es gratis si no quieres soporte).

    Licenciado bajo: CC-BY-SA con atribución
    No afiliado a StackOverflow
    scroll top