如何将发布目标添加到 Makefile?
How to add release target to Makefile?
我有以下 Makefile,我想将其配置为默认生成调试版本,并通过指定相应的目标来发布版本。
我现在要解决的问题如下,-项目包含单元测试,我希望它们包含在默认构建中,但不包括在发布中,所以我将发布目标添加到 Makefile:
FC = ifort
FFLAGS = -c -free -module modules -g3 -warn all -warn nounused
LDFLAGS = -save-temps -dynamiclib
INTERFACES = src/Foundation.f units/UFoundation.f units/Asserts.f units/Report.f
EXCLUDES = $(patsubst %, ! -path './%', $(INTERFACES))
SOURCES = $(INTERFACES) \
$(shell find . -name '*.f' $(EXCLUDES) | sed 's/^\.\///' | sort)
OBJECTS = $(patsubst %.f, out/%.o, $(SOURCES))
EXECUTABLE = UFoundation
all: $(SOURCES) $(EXECUTABLE)
release: SOURCES := $(filter-out units/%.f, $(SOURCES))
release: OBJECTS := $(filter-out units/%.o, $(OBJECTS))
release: EXECUTABLE := 'Foundation.dlyb'
release: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
@echo 'Linking to $@...'
@$(FC) $(LDFLAGS) $(OBJECTS) -o out/$@
out/%.o: %.f
@echo 'Compiling $@...'
@mkdir -p modules
@mkdir -p $(dir $@)
@$(FC) $(FFLAGS) -c $< -o $@
clean:
@echo "Cleaning..."
@rm -rf modules out $(EXECUTABLE)
不幸的是,它没有帮助 - 'make' 和 'make release' 的结果相同(默认情况下 make release 编译单元测试文件)。我已经看过类似的问题,例如 How can I configure my makefile for debug and release builds?,但没有成功解决问题。
调试和发布目标使用不同的宏(例如 NDEBUG
)和不同的优化级别构建。您通常不希望混合调试和发布目标文件,因此需要将它们编译到不同的目录中。
我经常以这种方式为不同的构建模式使用不同的顶级构建目录:
BUILD := debug
BUILD_DIR := build/${BUILD}
编译器这样标记:
cppflags.debug :=
cppflags.release := -DNDEBUG
cppflags := ${cppflags.${BUILD}} ${CPPFLAGS}
cxxflags.debug := -Og
cxxflags.release := -O3 -march=native
cxxflags := -g -pthread ${cxxflags.${BUILD}} ${CXXFLAGS}
然后将您的对象构建到 BUILD_DIR
。
当您将它作为 make BUILD=release
调用时,它会覆盖 BUILD := debug
在 makefile 中所做的分配。
我有以下 Makefile,我想将其配置为默认生成调试版本,并通过指定相应的目标来发布版本。
我现在要解决的问题如下,-项目包含单元测试,我希望它们包含在默认构建中,但不包括在发布中,所以我将发布目标添加到 Makefile:
FC = ifort
FFLAGS = -c -free -module modules -g3 -warn all -warn nounused
LDFLAGS = -save-temps -dynamiclib
INTERFACES = src/Foundation.f units/UFoundation.f units/Asserts.f units/Report.f
EXCLUDES = $(patsubst %, ! -path './%', $(INTERFACES))
SOURCES = $(INTERFACES) \
$(shell find . -name '*.f' $(EXCLUDES) | sed 's/^\.\///' | sort)
OBJECTS = $(patsubst %.f, out/%.o, $(SOURCES))
EXECUTABLE = UFoundation
all: $(SOURCES) $(EXECUTABLE)
release: SOURCES := $(filter-out units/%.f, $(SOURCES))
release: OBJECTS := $(filter-out units/%.o, $(OBJECTS))
release: EXECUTABLE := 'Foundation.dlyb'
release: $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
@echo 'Linking to $@...'
@$(FC) $(LDFLAGS) $(OBJECTS) -o out/$@
out/%.o: %.f
@echo 'Compiling $@...'
@mkdir -p modules
@mkdir -p $(dir $@)
@$(FC) $(FFLAGS) -c $< -o $@
clean:
@echo "Cleaning..."
@rm -rf modules out $(EXECUTABLE)
不幸的是,它没有帮助 - 'make' 和 'make release' 的结果相同(默认情况下 make release 编译单元测试文件)。我已经看过类似的问题,例如 How can I configure my makefile for debug and release builds?,但没有成功解决问题。
调试和发布目标使用不同的宏(例如 NDEBUG
)和不同的优化级别构建。您通常不希望混合调试和发布目标文件,因此需要将它们编译到不同的目录中。
我经常以这种方式为不同的构建模式使用不同的顶级构建目录:
BUILD := debug
BUILD_DIR := build/${BUILD}
编译器这样标记:
cppflags.debug :=
cppflags.release := -DNDEBUG
cppflags := ${cppflags.${BUILD}} ${CPPFLAGS}
cxxflags.debug := -Og
cxxflags.release := -O3 -march=native
cxxflags := -g -pthread ${cxxflags.${BUILD}} ${CXXFLAGS}
然后将您的对象构建到 BUILD_DIR
。
当您将它作为 make BUILD=release
调用时,它会覆盖 BUILD := debug
在 makefile 中所做的分配。