3

我编写了一个(不是那么)小的 bash 脚本来生成我的通用 makefile。这些 makefile 在开始时检测主机架构,并在以 arch 作为名称的文件夹中创建所有对象和输出。

它是这样的:

uname_m = $(shell uname -m)
DETECTED_ARCHITECTURE=$(uname_m)
ifeq ($(ARCH), x86_64)
    CFLAGS += -m64
    LDFLAGS += -m64
endif
ifeq ($(ARCH), x86)
    CFLAGS += -m32
    LDFLAGS += -m32
endif
OUTPUT_DIR = $(DETECTED_ARCHITECTURE)/
OBJ_PREFIX_DIR = $(OUTPUT_DIR)objs/

因此,例如,如果我在我的工作电脑上为我的代码运行 make,它会将所有内容输出到一个名为 i686 的文件夹,在家里输出到一个文件夹 x86_64,在我的树莓上输出到 armv6l。此外,如果我执行 ARCH=i686 make 之类的操作,它会正确覆盖检测到的架构,以便设置正确的编译器选项和输出目录。最终输出进入 OUTPUT_DIR,所有生成的 .o 文件进入 OUTPUT_DIR/objs。

我正在尝试用 cmake 做类似的事情。我已经根据生成器架构查看了不同目录中的 CMake add_custom_command/_target 进行交叉编译CMAKE 输出目录,但我不希望架构依赖于生成器。我希望它依赖于编译机。

例如,我在我的电脑上编码,然后编译它。如果一切顺利,我 ssh 到我的树莓派,通过 sshfs 将代码文件夹从我的电脑安装到树莓派,然后在那里编译。由于所有内容都转到不同的文件夹( armv6l 与 x86_64 ),因此没有冲突,我不必重新生成 makefile、清理或其他任何东西。

那么,基本上,是否有可能告诉 cmake 让 makefile 架构感知?谢谢

4

1 回答 1

1

这取自以下电子邮件线程:Determine-32-vs-64-bit-cpu

if(CMAKE_SIZEOF_VOID_P EQUAL 8) 
    set(arch_64 TRUE) 
else() 
    set(arch_64 FALSE) 
endif() 

并给出了以下警告

但是,请记住,在 Mac OS X 上,当您构建通用二进制文件时,这几乎总是错误的做法。因此,如果您的软件应该在 Mac 上运行,您将需要采取特殊的预防措施。

我已经成功地使用了这种方法。

如果您不担心 Mac,这应该适合您。如果您担心 Mac,则需要检查您是否在 Mac 上并使用“胖”二进制标志而不是 64 对 32 标志。

编辑

这里给出了更好的答案:https ://stackoverflow.com/a/12024211/1399279 。

具体来说,在这里查看他的 CMake 实现:https ://github.com/petroules/solar-cmake/blob/master/TargetArch.cmake

于 2013-05-29T04:57:26.717 回答