自定义make命令用于学习

问题描述 投票:0回答:4

我希望有一个这样的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;
}
c bash
4个回答
5
投票

您可以编写一个Makefile,它允许您使用单个规则创建多个目标。

实际上,从<FOO>构建<FOO>.cmake具有预定义规则的东西,因此您可以创建一个Makefile

CC = gcc
CFLAGS = -ggdb -std=c99 -Wall -Werror

然后运行make bar

只要有一个名为bar.c的文件,make就会为你构建它。


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。


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(Stack Overflow Questions)存储库中。


0
投票
mk() {
    output="${1%.c}"
    echo "gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output";
    gcc -ggdb -std=c99 -Wall -Werror ${@} -o $output;
}
© www.soinside.com 2019 - 2024. All rights reserved.