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

时间:2012-03-02 12:21:16

标签: ruby makefile ruby-c-extension

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

我无法解决的问题是控制makefile和所有其他生成文件的放置位置。

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

您可以在规则之前在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 $@

(这是一个粗略的例子 - 如果你有很多文件要处理,可能会有更优雅的解决方案。)

答案 1 :(得分:1)

我查看了mkfm.rb的来源,发现如果您更改了当前目录,则Makefile是当前目录。

Dir.chdir( OUTPUT_PATH )
create_makefile( EXTENSION_NAME, SOURCE_PATH )

OUTPUT_PATH中创建了makefile。如您所见,我必须向SOURCE_PATH提供create_makefile来说明Makefile与源文件不在同一位置的面孔。