2

1) 我们需要 Makefiles 在 z/OS USS 和 Linux 平台上构建 C++。是否建议在 z/OS USS 上使用 gnu make 以保持我们的 makefile 通用?

2) 如果 Makefiles 是通用的,那么 Makefiles 中的一些步骤,仍然会以平台为条件。我们可以通过类似于条件编译的步骤来做到这一点吗?如果是的话,我们能否获得语法方面的帮助?

3) 我们的 z/OS USS Makefile 具有 shell 脚本或命令组,如下例所示,方括号 [] 将命令作为一组呈现给 shell,而不是一次一行。看来使用GNU make,我们不得不将这些命令修改成一行,这样很乱,而且嵌套循环是个问题。有没有更简单的方法来使用 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 
 ]
4

3 回答 3

3

如果您需要可移植的 Makefile,请务必使用 GNU make。我多年来一直在 USS 下运行它,没有任何问题。如果您对自己构建它感到不自在,可以从这里获得一份副本

于 2009-11-25T15:52:35.930 回答
3

免责声明:

  1. 我对 z/OS USS 一无所知,
  2. 我对 Make 了解很多(当你拿着锤子时,......)。

建议:

  • 是的,我建议在两个平台上都使用 GNUMake,并尽可能保持 Makefile 的通用性。
  • 有几种方法可以在 Makefile 中添加条件。

    # 通常首先定义一个变量。
    SYSTEM = $(shell unname)
    
    # 然后可以有条件地定义其他变量
    
    某些文件 = $(SYSTEM)_file
    
    ifeq ($(SYSTEM), Linux)
    # 做一些 Linux 的事情,定义变量等等。
    别的
    # 做一些 z/OS USS 的事情。
    万一
    
    # 在命令块中,如果条件不以制表符开头,
    # 这是一个 Make 语句并遵循 Make 语法。
    事物:
    ifeq($(系统),Linux)
        外壳命令做某事
    万一
    
    # 如果条件 DOES 跟随选项卡,Make 扩展变量并通过
    # 整个事情都交给 shell,所以语法就是 shell 需要的。
    其他:
        if($(SYSTEM)==ZOS) do_x ; 否则 do_y ; 结束
    

    当你对这些感到厌烦时,还有其他更高级的技巧可以尝试。

  • 当您说希望分组处理命令时,我不确定您的意思是什么,但是我怀疑您可以通过将 ;\ 附加到组中的每个命令来获得所需的内容,以便它们将由一个在同一个子shell中(否则每个命令都有自己的子shell)。

  • 于 2009-10-08T14:32:21.770 回答
    1

    我已经使用 Unix 系统服务 (USS) 和 C/C++/HLASM 在 z/OS 上构建了几个应用程序。我发现使用 gmake 而不是 make是非常值得的。是的,您必须下载 gmake 并进行设置,但它更易于使用,并且更易于移植。除了 gmake,您可能还想获得bash。使用 bash 在 USS 和其他平台之间拥有可移植的 shell 脚本会更容易,而不是强迫自己使用sh。可能有几个地方可以获取 gmake 和 bash,但我使用的是 Rocket 网站:http ://www.rocketsoftware.com/product-categories/mainframe/bash-zos (如果你不这样做,它是免费的想要支持)。

    于 2018-06-05T21:44:21.713 回答