VScode配置C++/C语言环境
#### PROJECT SETTINGS # # # #
# The name of the release executable to be created
BIN_RELEASE_NAME : = hello
# The name of the debug executable to be created
BIN_DEBUG_NAME : = $ ( BIN_RELEASE_NAME ) -g
# Compiler used
CXX ? = g + +
# Extension of source files used in the project
SRC_EXT = cpp
# Path to the source directory , relative to the makefile
SRC_PATH = .
# Space-separated pkg-config libraries used by this project
LIBS =
# General compiler flags
COMPILE_FLAGS = -std = c + + 17 -Wall -Wextra -g
# Additional release-specific flags
RCOMPILE_FLAGS = -D NDEBUG
# Additional debug-specific flags
DCOMPILE_FLAGS = -D DEBUG
# Add additional include paths
# * * * * * * * * * * add header dir here * * * * * * * * * * * * * * * * *
# -I $ ( SRC_PATH ) -I include /
INCLUDES = -I $ ( SRC_PATH )
# General linker settings
LINK_FLAGS =
# Additional release-specific linker settings
RLINK_FLAGS =
# Additional debug-specific linker settings
DLINK_FLAGS =
# Destination directory , like a jail or mounted system
DESTDIR = /
# Install path ( bin / is appended automatically )
INSTALL_PREFIX = usr / local
# # # # END PROJECT SETTINGS # # # #
# Optionally you may move the section above to a separate config . mk file , and
# uncomment the line below
# include config . mk
# Generally should not need to edit below this line
# Obtains the OS type , either 'Darwin' ( OS X ) or 'Linux'
UNAME_S: = $ ( shell uname -s )
# Function used to check variables . Use on the command line:
# make print-VARNAME
# Useful for debugging and adding features
print- % : ; @ echo $ * = $ ( $ * )
# Shell used in this makefile
# bash is used for 'echo -en'
SHELL = / bin / bash
# Clear built-in rules
. SUFFIXES:
# Programs for installation
INSTALL = install
INSTALL_PROGRAM = $ ( INSTALL )
INSTALL_DATA = $ ( INSTALL ) -m 644
# Append pkg-config specific libraries if need be
ifneq ( $ ( LIBS ) , )
COMPILE_FLAGS + = $ ( shell pkg-config --cflags $ ( LIBS ) )
LINK_FLAGS + = $ ( shell pkg-config --libs $ ( LIBS ) )
endif
# Verbose option , to output compile and link commands
export V : = true
export CMD_PREFIX : = @
ifeq ( $ ( V ) , true )
CMD_PREFIX : =
endif
# Combine compiler and linker flags
release: export CXXFLAGS : = $ ( CXXFLAGS ) $ ( COMPILE_FLAGS ) $ ( RCOMPILE_FLAGS )
release: export LDFLAGS : = $ ( LDFLAGS ) $ ( LINK_FLAGS ) $ ( RLINK_FLAGS )
debug: export CXXFLAGS : = $ ( CXXFLAGS ) $ ( COMPILE_FLAGS ) $ ( DCOMPILE_FLAGS )
debug: export LDFLAGS : = $ ( LDFLAGS ) $ ( LINK_FLAGS ) $ ( DLINK_FLAGS )
# Build and output paths
release: export BUILD_PATH : = build / release
release: export BIN_PATH : = bin / release
debug: export BUILD_PATH : = build / debug
debug: export BIN_PATH : = bin / debug
install: export BIN_PATH : = bin / release
# Find all source files in the source directory , sorted by most
# recently modified
ifeq ( $ ( UNAME_S ) , Darwin )
SOURCES = $ ( shell find $ ( SRC_PATH ) -name '*.$(SRC_EXT)' | sort -k 1 nr | cut -f2- )
else
SOURCES = $ ( shell find $ ( SRC_PATH ) -name '*.$(SRC_EXT)' -printf '%T@\t%p\n' \
| sort -k 1 nr | cut -f2- )
endif
# fallback in case the above fails
rwildcard = $ ( foreach d , $ ( wildcard $ 1 * ) , $ ( call rwildcard , $d / , $ 2 ) \
$ ( filter $ ( subst * , % , $ 2 ) , $d ) )
ifeq ( $ ( SOURCES ) , )
SOURCES : = $ ( call rwildcard , $ ( SRC_PATH ) , * . $ ( SRC_EXT ) )
endif
# Set the object file names , with the source directory stripped
# from the path , and the build path prepended in its place
OBJECTS = $ ( SOURCES:$ ( SRC_PATH ) / % . $ ( SRC_EXT ) = $ ( BUILD_PATH ) / % . o )
# Set the dependency files that will be used to add header dependencies
DEPS = $ ( OBJECTS: . o = . d )
# Macros for timing compilation
ifeq ( $ ( UNAME_S ) , Darwin )
CUR_TIME = awk 'BEGIN{srand(); print srand()}'
TIME_FILE = $ ( dir $ @ ) . $ ( notdir $ @ ) _time
START_TIME = $ ( CUR_TIME ) > $ ( TIME_FILE )
END_TIME = read st < $ ( TIME_FILE ) ; \
$ ( RM ) $ ( TIME_FILE ) ; \
st = $$ ( ( ` $ ( CUR_TIME ) ` - $$st ) ) ; \
echo $$st
else
TIME_FILE = $ ( dir $ @ ) . $ ( notdir $ @ ) _time
START_TIME = date '+%s' > $ ( TIME_FILE )
END_TIME = read st < $ ( TIME_FILE ) ; \
$ ( RM ) $ ( TIME_FILE ) ; \
st = $$ ( ( ` date '+%s' ` - $$st - 86400 ) ) ; \
echo ` date -u -d @ $$st '+%H:%M:%S' `
endif
# Version macros
# Comment / remove this section to remove versioning
USE_VERSION : = false
# If this isn ' t a git repo or the repo has no tags , git describe will return non-zero
ifeq ( $ ( shell git describe > / dev / null 2 > & 1 ; echo $$? ) , 0 )
USE_VERSION : = true
VERSION : = $ ( shell git describe --tags --long --dirty --always | \
sed 's/v\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)-\?.*-\([0-9]*\)-\(.*\)/\1 \2 \3 \4 \5/g' )
VERSION_MAJOR : = $ ( word 1 , $ ( VERSION ) )
VERSION_MINOR : = $ ( word 2 , $ ( VERSION ) )
VERSION_PATCH : = $ ( word 3 , $ ( VERSION ) )
VERSION_REVISION : = $ ( word 4 , $ ( VERSION ) )
VERSION_HASH : = $ ( word 5 , $ ( VERSION ) )
VERSION_STRING : = \
"$(VERSION_MAJOR).$(VERSION_MINOR).$(VERSION_PATCH).$(VERSION_REVISION)-$(VERSION_HASH)"
override CXXFLAGS : = $ ( CXXFLAGS ) \
-D VERSION_MAJOR = $ ( VERSION_MAJOR ) \
-D VERSION_MINOR = $ ( VERSION_MINOR ) \
-D VERSION_PATCH = $ ( VERSION_PATCH ) \
-D VERSION_REVISION = $ ( VERSION_REVISION ) \
-D VERSION_HASH = \ " $ ( VERSION_HASH ) \ "
endif
# Standard , non-optimized release build
. PHONY: release
release: dirs
ifeq ( $ ( USE_VERSION ) , true )
@ echo "Beginning release build v$(VERSION_STRING)"
else
@ echo "Beginning release build"
endif
@ $ ( START_TIME )
@ $ ( MAKE ) all --no-print-directory
@ echo -n "Total build time: "
@ $ ( END_TIME )
# Debug build for gdb debugging
. PHONY: debug
debug: dirs
ifeq ( $ ( USE_VERSION ) , true )
@ echo "Beginning debug build v$(VERSION_STRING)"
else
@ echo "Beginning debug build"
endif
@ $ ( START_TIME )
@ $ ( MAKE ) all_debug --no-print-directory
@ echo -n "Total build time: "
@ $ ( END_TIME )
# Create the directories used in the build
. PHONY: dirs
dirs:
@ echo "Creating directories"
@ mkdir -p $ ( dir $ ( OBJECTS ) )
@ mkdir -p $ ( BIN_PATH )
# Installs to the set path
. PHONY: install
install:
@ echo "Installing to $(DESTDIR)$(INSTALL_PREFIX)/bin"
@ $ ( INSTALL_PROGRAM ) $ ( BIN_PATH ) / $ ( BIN_RELEASE_NAME ) $ ( DESTDIR ) $ ( INSTALL_PREFIX ) / bin
# Uninstalls the program
. PHONY: uninstall
uninstall:
@ echo "Removing $(DESTDIR)$(INSTALL_PREFIX)/bin/$(BIN_RELEASE_NAME)"
@ $ ( RM ) $ ( DESTDIR ) $ ( INSTALL_PREFIX ) / bin / $ ( BIN_RELEASE_NAME )
# Removes all build files
. PHONY: clean
clean:
@ echo "Deleting $(BIN_RELEASE_NAME) and $(BIN_DEBUG_NAME) symlink"
@ $ ( RM ) $ ( BIN_RELEASE_NAME ) $ ( BIN_DEBUG_NAME )
@ echo "Deleting directories"
@ $ ( RM ) -r build
@ $ ( RM ) -r bin
# Main rule , checks the executable and symlinks to the output
# generate the release executable file
all: $ ( BIN_PATH ) / $ ( BIN_RELEASE_NAME )
@ echo "Making symlink: $(BIN_RELEASE_NAME) -> $<"
@ $ ( RM ) $ ( BIN_RELEASE_NAME )
@ ln -s $ ( BIN_PATH ) / $ ( BIN_RELEASE_NAME ) $ ( BIN_RELEASE_NAME )
# generate the debug executable file
all_debug: $ ( BIN_PATH ) / $ ( BIN_DEBUG_NAME )
@ echo "Making symlink: $(BIN_DEBUG_NAME) -> $<"
@ $ ( RM ) $ ( BIN_DEBUG_NAME )
@ ln -s $ ( BIN_PATH ) / $ ( BIN_DEBUG_NAME ) $ ( BIN_DEBUG_NAME )
# Link the release executable
$ ( BIN_PATH ) / $ ( BIN_RELEASE_NAME ) : $ ( OBJECTS )
@ echo "Linking: $@"
@ $ ( START_TIME )
$ ( CMD_PREFIX ) $ ( CXX ) $ ( OBJECTS ) $ ( LDFLAGS ) -o $ @
@ echo -en "\t Link time: "
@ $ ( END_TIME )
# Link the debug executable
$ ( BIN_PATH ) / $ ( BIN_DEBUG_NAME ) : $ ( OBJECTS )
@ echo "Linking: $@"
@ $ ( START_TIME )
$ ( CMD_PREFIX ) $ ( CXX ) $ ( OBJECTS ) $ ( LDFLAGS ) -o $ @
@ echo -en "\t Link time: "
@ $ ( END_TIME )
# Add dependency files , if they exist
-include $ ( DEPS )
# Source file rules
# After the first compilation they will be joined with the rules from the
# dependency files to provide header dependencies
$ ( BUILD_PATH ) / % . o: $ ( SRC_PATH ) / % . $ ( SRC_EXT )
@ echo "Compiling: $< -> $@"
@ $ ( START_TIME )
$ ( CMD_PREFIX ) $ ( CXX ) $ ( CXXFLAGS ) $ ( INCLUDES ) -MP -MMD -c $ < -o $ @
@ echo -en "\t Compile time: "
@ $ ( END_TIME )