我希望有一个这样的make命令,但我可以传递许多参数,结果文件的名称是第一个的名称。
它必须使用.c接受名称,并从可执行文件名的源文件名中删除.c。
# My custom make command
mk() {
echo "gcc -ggdb -std=c99 -Wall -Werror ${1}.c -o $1";
gcc -ggdb -std=c99 -Wall -Werror ${1}.c -o $1 ;
}
这样的事可能吗?
mk() {
echo "gcc -ggdb -std=c99 -Wall -Werror ${@} -o $1";
output=$1
set -- "${@/%/.c}"
gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output;
}
您可以编写一个Makefile
,它允许您使用单个规则创建多个目标。
实际上,从<FOO>
构建<FOO>.c
是make
具有预定义规则的东西,因此您可以创建一个Makefile
CC = gcc
CFLAGS = -ggdb -std=c99 -Wall -Werror
然后运行make bar
。
只要有一个名为bar.c
的文件,make
就会为你构建它。
要回答您的具体问题,bash有一种方法可以删除后缀模式(例如.c
):
mk() {
SOURCE="$1"
DEST="${1%.c}"
echo "gcc -ggdb -std=c99 -Wall -Werror ${SOURCE}.c -o $DEST";
gcc -ggdb -std=c99 -Wall -Werror "${SOURCE}.c" -o "$DEST" ;
}
无论如何你应该学会正确使用make,但是你也不能学习bash。
使用makefile
- 可能像Honza Remeš在他们的answer中建议的那样,或者像这样的更复杂的一个,这与我在处理Stack Overflow问题时使用的内容密切相关。它允许我以极大的粒度配置使用哪些编译选项。这对你来说可能有点过头了--Honza的版本是一个很好的起点 - 但是你可能最终会变得挑剔,这样才有益。
CC = gcc
DFLAGS = #-DHAVE_CONFIG_H
GFLAGS = -g
IFLAG1 = #-I${INCDIR}
IFLAG2 = #-I${HOME}/inc
IFLAGS = #${IFLAG1} ${IFLAG2}
OFLAGS = -O3
SFLAGS = -std=c11 # -pedantic
UFLAGS = # Set on command line
WFLAG1 = -Wall
WFLAG2 = -Wextra
WFLAG3 = -Werror
WFLAG4 = -Wmissing-prototypes
WFLAG5 = -Wstrict-prototypes
WFLAG6 = #-Wold-style-declaration # Strict GCC only (not clang, it would seem).
WFLAG7 = #-Wold-style-definition # Part of -Wextra in GCC 7.1.0
WFLAGS = ${WFLAG1} ${WFLAG2} ${WFLAG3} ${WFLAG4} ${WFLAG5} ${WFLAG6} ${WFLAG7}
LDFLAG1 = #-L${LIBDIR}
LDFLAG2 = #-L${HOME}/lib/64
LDFLAGS = ${LDFLAG1} ${LDFLAG2}
LDLIB1 = #-l${SOQBASE}
LDLIB2 = #-l${CS50BASE}
LDLIBS = ${LDLIB1} ${LDLIB2}
CFLAGS = ${OFLAGS} ${GFLAGS} ${DFLAGS} ${IFLAGS} ${SFLAGS} ${WFLAGS} ${TFLAGS} ${UFLAGS}
DEBRIS = core a.out *~ *.o
RM_FR = rm -fr
RM_F = rm -f
default:
@echo "You must specify a target to build"
#all:
# ...rules for what to do for 'make all'
# Provides target 'clean' to do sensible cleaning.
# Relies on user to set macro PROGRAMS (plural) for removing programs.
# OUTFILES can be set per makefile to hold output file names that should
# be cleaned. OUTDIRS can be set per makefile to hold output directory
# names that should be cleaned.
# .dSYM directories are an artefact of building single-file programs on
# .Mac OS X (or using dsymutil).
.DEFAULT:
@echo "No commands specified for building $@"
clean:
${RM_F} *.o *.a ${DEBRIS} ${OUTFILES}
${RM_F} ${PROGRAMS}
${RM_FR} *.dSYM ${OUTDIRS}
特别是UFLAGS
选项是我用于'用户标志'的选项 - 我想要添加到特定编译中。我可以用:
make UFLAGS="-Wshadow -Wpointer-arith" newprog53
将额外的警告选项-Wshadow -Wpointer-arith
添加到编译器命令行。
您可以在三个文件中找到此makefile的完整版本:
makefile
etc/soq-head.mk
etc/soq-tail.mk
在我的GitHub上的SOQ(Stack Overflow Questions)存储库中。
mk() {
output="${1%.c}"
echo "gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output";
gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output;
}