Как сделать оператор if в Makefile на основе платформы? - PullRequest
0 голосов
/ 20 июня 2020

У меня проблемы с криптовалютным кошельком, что, вероятно, не имеет большого значения. Проблема в том, что make-файл содержит файлы, которые используются для архитектуры 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

Итак, есть ли способ сделать это более элегантно а затем объедините эти файлы cpp / hpp / s вместе *, только в Makefile?

* Ну, я не думаю, что это сработает, потому что в реализации 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.a c есть способ сделать это или в автогене. sh или тому подобное, которое существует для настройки среды.

Спасибо заранее за помощью.

1 Ответ

0 голосов
/ 21 июня 2020

Вы дали список имен файлов и не указали, как вы их используете, поэтому я предполагаю, что вы назначаете их переменным.

Мы можем начать с простого условного :

ifeq ($(PLATFORM),x86_64)
  do something
endif

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

Грубо говоря, мы могли бы сделать это:

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
...