ruby - 如何根据操作系统控制 extconf.rb 生成的输出?

标签 ruby makefile ruby-c-extension

我正在编写 Ruby C 扩展。我将在 Windows 和 OSX 下编译它。

我一直无法解决的是控制 makefile 和所有其余生成文件的放置位置。

我的 extconf.rb 文件有根据操作系统准备 makefile 的条件语句 - 所以我对它们都使用一个。

我希望当我在 OSX 下编译时,它全部放置在 osx 文件夹中,并类似于 Windows 下的 win 文件夹中,以便将它们全部分开。

现在所有文件都生成在与我的源代码相同的文件夹中。

(我对 C 语言和编译应用程序非常陌生。如果我错过了一些明显的东西,我很抱歉。)

我可以编写一个批处理来随后移动文件,但我发现如果可以在生成期间完成它会更干净。

最佳答案

您可以在 makefile 中的规则之前放置一个条件。类似于:

OS := $(shell uname)
ifeq ($(OS),Darwin)
FOLDER := /some_path/osx_folder
else
FOLDER := /some_other_path/win_folder
endif

编辑:
FOLDER 只是一个变量;它稍后将在 makefile 中使用,如下所示:

$(FOLDER)/main: $(FOLDER)/main.o $(FOLDER)/foo.o
    blah blah link $^ together to build $@

$(FOLDER)/%.o: $(SOURCE_DIRECTORY)/%.c
    blah blah compile $< to build $@

(这是一个粗略的示例 - 如果您有大量文件需要处理,则可以使用更优雅的解决方案。)

关于ruby - 如何根据操作系统控制 extconf.rb 生成的输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9533190/

相关文章:

ruby - "TypeError: can' t 将字符串转换为整数”当尝试在 watir-webdriver/selenium-webdriver 脚本中按住 CTRL+单击或 SHIFT+单击时

ruby - 为 nginx 在 passenger 上部署了多个 Ruby on Rails 应用程序

c - 如何收集大型 Makefile 项目的所有依赖项?

ruby c 扩展内部结构

c++ - 如何从 g++ COLLECT_LTO_WRAPPER 获取信息到 make 生成的 .so 文件中?

ios - 尝试使用 selenium 网格启动 appium 驱动程序失败

ruby - 将管道字符 “|” 替换为行空格

为 openvz VM 编译内核模块?

haskell - 如何使用 Cabal 构建一个简单的项目?

c - 参数错误: string contains null byte when use StringValueCStr