Makefile: передача разных значений переменной одной цели на основе аргументов из foreach - PullRequest
0 голосов
/ 03 мая 2018

Чего я хочу достичь: У меня есть 3 или более тестов, которые должны быть скомпилированы с отдельным флагом [т.е. первый тест должен быть с -ewp, а остальные должны быть -c] компилятором ptxas через ту же цель.

например. В приведенном ниже вызове div_sc, т.е. $ 1 - это имя исполняемого файла, которое зависит от $ 2 (div_sc div_sc1 div_sc). $ 2 может иметь несколько имен тестов с пробелом $ (вызов ADD_PTXTEST_EWP, div_sc, div_sc div_sc1 div_sc2)

Что я сделал: Я попробовал следующий подход, но только последнее значение переменной EWP_SC_SETTER берется, и foreach терпит неудачу после первого сканирования $ 2

Makefile1:
ADD_PTXTEST_EWP = $(eval $(call _ADD_PTXTEST_EWP,$(strip $1),$(strip $2)))

Запуск foreach для каждого элемента в $ 2.Если первый элемент в $ 2 равен $ 1, тогда я устанавливаю переменную EWP_SC_SETTER = -ewp else EWP_SC_SETTER = -c для цели $ (1). $ (ARCHREV) .cubin, которая определена в Makefile 2

define _ADD_PTXTEST_EWP
$(foreach ptx, $(2), $(if $(filter $1,$(ptx)), $(1).$(ARCHREV).cubin: 
EWP_SC_SETTER = -ewp $(1).$(ARCHREV).cubin: 
$(ptx).$(ARCHREV).$(RELOC_CUBIN_EXTN)$(NEWLINE), $(1).$(ARCHREV).cubin: 
EWP_SC_SETTER = -c $(1).$(ARCHREV).cubin: 
$(ptx).$(ARCHREV).$(RELOC_CUBIN_EXTIN)$(NEWLINE)))
endef

Выше один не помог, поэтому попробовал другой подход. К сожалению, это также не работает

define _ADD_PTXTEST_EWP
PTXTESTS += $(1)
$(info 1 is $(1))
$(foreach ptx, $(2), $(eval $(call _ADD_PTXTEST_EWP_IMP,$(ptx))))
endef



define _ADD_PTXTEST_EWP_IMP
$(info ptx is $(ptx))
ifeq ($(ptx),div_sc)
$(1).$(ARCHREV).cubin: EWP_SC_SETTER := -ewp
$(info in ptx)
else
$(1).$(ARCHREV).cubin: EWP_SC_SETTER := -c
$(info out ptx)
endif
$(1).$(ARCHREV).cubin: $(ptx).$(ARCHREV).$(RELOC_CUBIN_EXTN)$(NEWLINE)
endef

Этот make-файл имеет определение target%. $ (ARCHREV) .cubin

Makefile 2:
%.$(ARCHREV).reloc.cubin: %.$(ARCHREV).ptx
$(call TOOLS_HEADER_DUMP_LOG,PTXAS,cubin)
$(EXE_PREFIX) $(PTXAS) $(call FILE_PTXAS_FLAGS,$*) $(call MAXREG,$*) -arch=sm_$(ARCHREV) **$(EWP_SC_SETTER)** $(G_FLAG) $(patsubst %.reloc.cubin, %.ptx, $@) -o $@ $(call IGNORE_COMPILE_ERR,$*) $(call TOOLS_DUMP_REDIRECT2,2,cubin) $(call PERFTIME_DUMP_REDIRECT, $*.perf.txt)

%.$(ARCHREV).cubin: %.$(ARCHREV)$(RELOC_CUBIN_EXTN) 
$(call TOOLS_HEADER_DUMP_LOG,NVLINK,cubin)
$(EXE_PREFIX) $(NVLINK) $(NVLINK_FLAGS) $(call CNPLIBRARY) $(call FILE_NVLINKFLAGS,$*) $(call MAXREG,$*) -arch=sm_$(ARCHREV) $^ -o $@ $(call IGNORE_LINK_ERR,$*) $(call TOOLS_DUMP_REDIRECT,2,cubin)

Любая помощь приветствуется

1 Ответ

0 голосов
/ 05 мая 2018

Кажется, это простая проблема, заключенная в несколько слоев ненужного усложнения. Возможно, нам придется повторить несколько раз, чтобы найти ответ. Рассмотрим этот make-файл:

ifeq ($(ptx), div_sc)
 EWP_SC_SETTER = -ewp
else
 EWP_SC_SETTER = -c
endif

cubin:
    @echo using $(EWP_SC_SETTER)

Вы хотите сделать что-то большее, но не знаете как. Что это?

РЕДАКТИРОВАТЬ: вторая попытка

Как насчет этого?

TESTS := alpha beta gamma
TEST_EWP := $(word 1, $(TESTS))

FLAG:=-cj

all-tests: $(TESTS)

$(TEST_EWP): FLAG:=-ewp

$(TESTS):
    @echo running test with $(FLAG)
...