【问题标题】:cmake - create architecture aware makefilecmake - 创建架构感知生成文件
【发布时间】:2013-05-28 16:04:42
【问题描述】:

我已经编写了一个(并非如此)小型 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 架构感知? 谢谢

【问题讨论】:

标签: architecture makefile cmake output


【解决方案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

【讨论】:

  • 能够正确猜测 32 到 64 位之间。但是手臂呢?它只会落入 32 位部分并惨遭失败。我的目的是根据架构分离构建文件,而不仅仅是指针大小。我发布的 makefile sn-p 就是这样做的。我可以尝试在 cmake 脚本中“注入”makefile 的 sn-p,以便将其包含在 makefile 的创建中。有可能吗?
  • @RhiakathFlanders 嗯...我没想到。不幸的是,据我所知,您无法通过您的 CMakeLists.txt “注入” Makefile 片段。查看这个答案以获得一种相当迂回的方法:stackoverflow.com/a/12024211/1399279
  • 可爱的小耶稣!那家伙在cmake中写了圣经只是为了检测架构!但这仍然不是我想要的......他能够检测到 cmake 中的体系结构,但我想在 makefile 中进行(在编译时)。我想cmake是不可能的。 Cmake 需要事先知道它将输出放置在哪里以及我想要什么,以便 makefile 决定它将放置它的位置。所以我可以通过 sshfs 共享代码并使用“make”,而不必重新创建 makefile。所以我需要 cmake 将拱检测注入到 makefile 中。
  • 是的,这在 CMake 中是不可能的。原因是 CMake 应该能够创建 any 构建系统,因此如果您可以将代码直接注入 Makefile 它将破坏所有其他不使用 Make 语法的构建系统。您可以尝试其他方法,例如 sconswaf,它们允许您在一个文件中编写配置和构建系统。祝你好运。
猜你喜欢
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 2011-07-31
  • 2011-06-25
  • 2015-03-26
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
相关资源
最近更新 更多