我想要一个这样的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;
}
答案 0 :(得分:5)
您可以编写一个Makefile
,它允许您使用一条规则创建多个目标。
实际上,从<FOO>
构建<FOO>.c
的过程make
有一个预定义的规则,因此您可以使用以下方式创建Makefile
CC = gcc
CFLAGS = -ggdb -std=c99 -Wall -Werror
然后运行make bar
。
只要有一个名为bar.c
的文件,make
就会为您构建。
答案 1 :(得分:0)
要回答您的特定问题,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的原因。
答案 2 :(得分:0)
使用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(堆栈溢出问题)存储库中。
答案 3 :(得分:0)
mk() {
output="${1%.c}"
echo "gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output";
gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output;
}