连接变量时目标特定变量定义不起作用
Target specific variable definition not working when concatenating variables
我希望我的 Makefile 表现不同,这取决于我是在自己的机器上编译还是在 docker 容器中编译。这是生成文件:
OR_TOOLS_DIR := /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959
docker: OR_TOOLS_DIR := /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
OR_TOOLS_LIB_DIR := $(OR_TOOLS_DIR)/lib
OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
OR_TOOLS_FLAGS := -L$(OR_TOOLS_LIB_DIR) -lglog -lprotobuf -lgflags -lCbc -lCbcSolver -lClp -lClpSolver -lCoinUtils -lOsiCbc -lOsiClp -lCgl -lortools
HTSLIBFLAGS = /software/htslib/1.8/lssc0-linux/lib/libhts.a -lz -llzma -lbz2 -lcurl -lcrypto
docker: HTSLIBFLAGS = -lz -llzma -lbz2 -lcurl -lcrypto -lhts
CXX = g++
LDFLAGS = -lm -lpthread $(HTSLIBFLAGS) $(OR_TOOLS_FLAGS)
CXXFLAGS = -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I $(OR_TOOLS_INC_DIR)
HPP = $(wildcard *.hpp)
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
all: main
debug: CXXFLAGS += -DDEBUG -g
debug: main
docker: main
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
main: $(OBJ) $(HPP)
$(CXX) $(CXXFLAGS) -o $@ $(OBJ) $(LDFLAGS)
clean:
rm *.o
.PHONY: clean
这是在 运行 make docker
:
时使用的命令
g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959
而我期待的是:
g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
我认为我连接不同变量的事实可能与此有关,但我不确定。我错过了什么?
Make 有 two flavors of variable: 简单 扩展变量,递归 扩展变量。
这里:
OR_TOOLS_DIR := /share/...
...
OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
请注意,此 makefile 使用 :=
为 OR_TOOLS_INC_DIR
赋值,因此它是一个 simply 扩展变量。它的值现在是 /share/.../include
.
稍后,在执行规则时,您将新的 (target-specific) 值分配给 OR_TOOLS_DIR
。但是那只鸟飞走了; OR_TOOLS_INC_DIR
的值为 /share/.../include
,它不再与 OR_TOOLS_DIR
.
有任何联系
你需要的是一个变量,其值为$(OR_TOOLS_DIR)/include
,这样你以后可以改变$(OR_TOOLS_DIR)
,从而改变扩展变量的结果。你可以用 recursive 展开。只需删除冒号:
OR_TOOLS_INC_DIR = $(OR_TOOLS_DIR)/include
我希望我的 Makefile 表现不同,这取决于我是在自己的机器上编译还是在 docker 容器中编译。这是生成文件:
OR_TOOLS_DIR := /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959
docker: OR_TOOLS_DIR := /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
OR_TOOLS_LIB_DIR := $(OR_TOOLS_DIR)/lib
OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
OR_TOOLS_FLAGS := -L$(OR_TOOLS_LIB_DIR) -lglog -lprotobuf -lgflags -lCbc -lCbcSolver -lClp -lClpSolver -lCoinUtils -lOsiCbc -lOsiClp -lCgl -lortools
HTSLIBFLAGS = /software/htslib/1.8/lssc0-linux/lib/libhts.a -lz -llzma -lbz2 -lcurl -lcrypto
docker: HTSLIBFLAGS = -lz -llzma -lbz2 -lcurl -lcrypto -lhts
CXX = g++
LDFLAGS = -lm -lpthread $(HTSLIBFLAGS) $(OR_TOOLS_FLAGS)
CXXFLAGS = -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I $(OR_TOOLS_INC_DIR)
HPP = $(wildcard *.hpp)
SRC = $(wildcard *.cpp)
OBJ = $(SRC:.cpp=.o)
all: main
debug: CXXFLAGS += -DDEBUG -g
debug: main
docker: main
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $< -o $@
main: $(OBJ) $(HPP)
$(CXX) $(CXXFLAGS) -o $@ $(OBJ) $(LDFLAGS)
clean:
rm *.o
.PHONY: clean
这是在 运行 make docker
:
g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /share/me/binaries/or-tools_Ubuntu-16.04-64bit_v7.8.7959
而我期待的是:
g++ -std=c++11 -O3 -funroll-loops -fopenmp -I htslib -I /lib/or-tools_Ubuntu-16.04-64bit_v7.8.7959
我认为我连接不同变量的事实可能与此有关,但我不确定。我错过了什么?
Make 有 two flavors of variable: 简单 扩展变量,递归 扩展变量。
这里:
OR_TOOLS_DIR := /share/...
...
OR_TOOLS_INC_DIR := $(OR_TOOLS_DIR)/include
请注意,此 makefile 使用 :=
为 OR_TOOLS_INC_DIR
赋值,因此它是一个 simply 扩展变量。它的值现在是 /share/.../include
.
稍后,在执行规则时,您将新的 (target-specific) 值分配给 OR_TOOLS_DIR
。但是那只鸟飞走了; OR_TOOLS_INC_DIR
的值为 /share/.../include
,它不再与 OR_TOOLS_DIR
.
你需要的是一个变量,其值为$(OR_TOOLS_DIR)/include
,这样你以后可以改变$(OR_TOOLS_DIR)
,从而改变扩展变量的结果。你可以用 recursive 展开。只需删除冒号:
OR_TOOLS_INC_DIR = $(OR_TOOLS_DIR)/include