如何在Makefile中根据平台制作if语句?

3

我在使用加密钱包时遇到了一些问题,可能并不是很重要。问题是makefile中包含了用于x86架构的文件,而我有AARCH64文件,但似乎找不到解决办法...

所以我想根据平台(在这种情况下是x86)进行更改,如下:

  crypto/randomx/jit_compiler_x86.cpp 
  crypto/randomx/jit_compiler_x86.hpp 
  crypto/randomx/jit_compiler_x86_static.asm 
  crypto/randomx/jit_compiler_x86_static.hpp 
  crypto/randomx/jit_compiler_x86_static.S 

当AARCH64时,返回此内容:

  crypto/randomx/jit_compiler_a64.cpp
  crypto/randomx/jit_compiler_a64.hpp
  crypto/randomx/jit_compiler_a64_static.hpp
  crypto/randomx/jit_compiler_a64_static.S

那么有没有更优雅的方法来完成这个操作,而不是在Makefile中合并这些cpp/hpp/s文件呢?

嗯,我认为这不起作用,因为x86实现有一个额外的文件。

另一个问题是它会创建依赖关系文件,形式为*.PO或*PLO文件,它们从哪里来,是由编译器动态生成的。

最后,在Makefile的结尾处声明了任何内容:

crypto/randomx/libbitcoinconsensus_la-jit_compiler_x86.lo:  \
    crypto/randomx/$(am__dirstamp) \
    crypto/randomx/$(DEPDIR)/$(am__dirstamp)

这可能会引起一些问题,因为它里面有x86并且是一些临时的*.lo文件,我也不知道在编译过程中这些文件是在哪里引入的。

那么有没有办法解决这个问题呢?如果需要有单独的make文件,那也不是问题,只要我知道如何通过代码区分它们。我正在编译Linux,所以我想在configure.ac中有一种方法可以做到这一点,或者在autogen.sh或类似的设置环境的文件中。

提前感谢您的帮助。


1
你可以在makefile中编写代码来检测架构并将结果(x86_64aarch64)存储在一个Make变量中,然后相应地构建文件名。你需要帮助的部分是哪一部分? - Beta
最有可能两者都需要,因为这对我来说是全新的。到目前为止,代码被编写成体系结构无关或通用是更好的词,现在它必须能够区分。谢谢! - Michal Žídek
你试图一次做太多新的事情。如果你想学习Make,你必须从更简单的练习开始,如果你想快速让这个makefile工作起来,最好把它交给那些已经熟悉构建系统的人处理。 - Beta
好的,让我们来看第二部分。第一部分我已经想出来了。我已经有了Make变量。现在,如果语句,请您举个例子。 - Michal Žídek
好的,问题是什么,可以给个简单的例子吗?因为我在工作中遇到了一些困难,需要完成一些任务。如果我在手册中找到了答案,我就不会在这里问了,希望这很清楚。如果这是常见的问题,那么可能已经有多个解决方案了,但我没有找到任何相关信息。提前感谢您的帮助。 - Michal Žídek
显示剩余3条评论
1个回答

2
你提供了一组文件名,并没有说明如何使用它们,因此我假设你将它们分配给变量。
我们可以从一个简单的条件语句开始:
ifeq ($(PLATFORM),x86_64)
  do something
endif

ifeq ($(PLATFORM),aarch64)
  do something else
endif

Crudely, we could do this:

ifeq ($(PLATFORM),x86_64)
  SOURCE := crypto/randomx/jit_compiler_x86.cpp
  HEADER := crypto/randomx/jit_compiler_x86.hpp
  ASM := crypto/randomx/jit_compiler_x86_static.asm
  STATIC_HEADER := crypto/randomx/jit_compiler_x86_static.hpp
  STATIC_SOURCE := crypto/randomx/jit_compiler_x86_static.S
endif

ifeq ($(PLATFORM),x86_64)
  ...likewise for a64...
endif

那样做是可行的,但会非常冗余。我们可以改进它:
BASE := crypto/randomx/jit_compiler

ifeq ($(PLATFORM),x86_64)
  BASE := $(BASE)_x86
endif

ifeq ($(PLATFORM),aarch64)
  BASE := $(BASE)_a64
endif

SOURCE := $(BASE).cpp
HEADER := $(BASE).hpp
ASM := $(BASE)_static.asm
STATIC_HEADER := $(BASE)_static.hpp
STATIC_SOURCE := $(BASE)_static.S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接