【问题标题】:Using conditionals in a z/OS makefile在 z/OS makefile 中使用条件
【发布时间】:2020-07-25 05:27:34
【问题描述】:

我已成功使用z/OS make 构建我的应用程序。我现在已经在我的项目中指出,我从应用程序的调试版本转移到“发布”版本,也就是非调试版本,因此我的编译选项和链接选项发生了变化。

我一直在尝试在我的 makefile 中使用条件来表示我不必更改文件中的多行即可在两种构建模式之间切换,但我找不到 ANY 示例z/OS make 中的条件语句,以及手册中关于它们的少量文档不足以真正发现如何使其工作。我希望这里有人设法让它们工作(不是双关语)并且可以启发我。

这是我想要的(来自 makefile 的 sn-p):-

BuildType=DEBUG

.IF ($(BuildType)==DEBUG)
CompOpts= -c -W"c,debug,LP64,sscomm,dll" -D_DEBUG
.ELSE
CompOpts= -c -s -W"c,LP64,sscomm,compress,dll"
.END

请注意,我了解设置BuildType 的方法有很多种。为了简单起见,这个 sn-p 将其设置为内联。手头的问题是.IF 语句的语法。我无法使.IF 语句起作用。这就是我希望获得帮助或工作示例的内容。

我已经设法让我只需要编辑文件中的一个字符即可在两种模式之间切换的情况下工作,但这绝不是理想的。注: ANYTHING 未设置为 makefile 中的任何值。

# In the .IF clause below, if you have != it will run the DEBUG build
# and if you have == it will run the RELEASE build
.IF ($(ANYTHING)==$(NULL))
CompOpts= -c -W"c,debug,LP64,sscomm,dll" -D_DEBUG
.ELSE
CompOpts= -c -s -W"c,LP64,sscomm,compress,dll"
.END

【问题讨论】:

  • 符合POSIX的make从命令行、环境变量MAKEFLAGS和直接从环境中绘制宏定义,除了从makefile的内容(这是优先顺序,从大到小)。我不确定 z/OS make 的功能,但如果它接受来自任何替代的、更高优先级的源的宏定义,那么您可以使用它在构建时覆盖您的 BuildType 宏的值,完全不改变makefile。
  • 您对 z/OS Make 有信心吗? Rocket Software 移植的 Make 更加灵活
  • @JohnBollinger - 从你的回答我想我的问题可能不够清楚。问题不是 BuildType 的设置,而是.IF 语句的语法。我将更新问题文本以澄清。
  • @meat - 鉴于它适用于我用过的所有其他东西,我宁愿只找到在 z/OS make 中成功使用条件的人,而不是从另一个 make 重新开始。此外,对于将来可能需要它的任何其他人来说,“使用其他品牌”并不能真正回答手头的问题。
  • 我可能完全错了,因为我对 z/OS 的制作一无所知,除了我在文档的 条件表达式 部分中读到的内容,但可能是这样吗条件中的表达式不应括在括号中(与 GNU make 不同)?如果我是对的,您正在比较字符串 (DEBUGDEBUG)...

标签: makefile mainframe zos


【解决方案1】:

以下语法应该适用于 z/OS make:

.IF $(BuildType) == DEBUG
CompOpts= -c -W"c,debug,LP64,sscomm,dll" -D_DEBUG
.ELSE
CompOpts= -c -s -W"c,LP64,sscomm,compress,dll"
.END

当你调用 make 文件时:

make -DBuildType=DEBUG

它将选择编译器选项的调试版本,否则将选择生产版本。

【讨论】:

  • 就是这样 - 额外的括号让我感到沮丧!非常感谢。
猜你喜欢
  • 2021-06-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
相关资源
最近更新 更多