architecture - cmake - 创建架构感知 makefile

标签 architecture makefile cmake output

我已经编写了一个(不是这样的)小型 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 in different directories for cross-compilationCMAKE output directory depending on generator architecture ,但我不希望架构依赖于生成器。我希望它依赖于编译机器。

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

那么,基本上,是否可以告诉 cmake 使 makefile 架构感知? 谢谢

最佳答案

这摘自以下电子邮件主题:Determine-32-vs-64-bit-cpu

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

并给出了以下警告

However, remember that on Mac OS X this is almost always the wrong thing to do when you're building universal binaries. So, if your software is supposed to work on Mac, you will need to take special precautions.

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

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

编辑

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

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

关于architecture - cmake - 创建架构感知 makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16796629/

相关文章:

makefile - 树外内核模块 : Multiple module, 单个 Makefile,相同的源文件,不同的构建选项

c++ - 体系结构 x86_64 的 undefined symbol ,链接器命令失败

visual-studio - 在 CMake 中设置 MSVC 运行时

makefile - 如何使用 cmake 链接 jemalloc 共享库

c++ - 使用 CMake 静态链接到项目外部的库

javascript - 如何自动提取Javascript程序的软件架构?

java - Spring boot Jpa api调用时绑定(bind)数据源

c++ - CMake: "make depend"的用途是什么?

java - 将数据与用户分开的最佳做法是什么

architecture - CMake多架构编译