Сценарий:
Рассмотрим исходный каталог с несколькими ".cpp" файлами, которые создают статическую библиотеку, рассматривают файлы: XYZ.cpp & ABC.cpp (используется в соответствии с описанным ниже условием), а также PQR.cpp, JKL.cpp и т.д. выставляется библиотека name отсутствует.a
Здесь p (- переменная среды), значение которой совпадает с q, тогда out.a должен быть создан с использованием XYZ.cpp else, он должен быть создан с использованием ABC.cpp
Пример: т.е. что-то вроде этого
ifeq($p, q)
SRC = XYZ.cpp
else
SRC = ABC.cpp
endif
SRC += PQR.cpp \
JKL.cpp \
MNO.cpp
Как я могу сделать то же самое оптимистично в Makefile?
Заранее благодарю за любую помощь...
Это почти точно. Вам просто нужно пространство после ifeq
(и некоторые круглые скобки вокруг p
, если вы хотите использовать имя переменной длиннее одной буквы):
ifeq ($(p), q)
SRC = XYZ.cpp
else
SRC = ABC.cpp
endif
SRC += PQR.cpp \
JKL.cpp \
MNO.cpp
Хотя бета-ответ вполне корректен, вы можете альтернативно рассмотреть построенные имена переменных. По моему мнению, они приводят к более чистым и понятным файлам. Например:
# if p is not set, default to "default"
p ?= default
q_SRC = XYZ.cpp
default_SRC = ABC.cpp
SRC = $($(p)_SRC) PQR.cpp JKL.cpp MNO.cpp
и т.д. Особенно, если у вас много альтернатив, это может быть намного понятнее (опять же, ИМО).
make p=xyz
, где конструкция if ... else ...
по крайней мере все равно назначит какой-то тип по умолчанию, даже если он не правильный .. ,
ifeq ($($(p)_SRC),)
чтобы увидеть, установлено ли значение; если нет, то вы знаете, что было установлено что-то поддельное. Вы можете использовать либо значение по умолчанию, либо $(error ...)
.