【问题标题】:Using makefile arguments without foo=使用不带 foo= 的 makefile 参数
【发布时间】:2016-10-28 04:53:47
【问题描述】:

我有一个用于编译单个文件的 makefile。当我需要传递参数时,我使用 target=targetFile。

脚本接受参数,查找与参数具有相同值的文件(在同一目录中)并编译它。

我用它来编译来自 uhunt 和 uva 的问题,它们使用单​​个 c++ 文件。所以我不需要多个源文件的多个makefile。多个源文件的单个 makefile 是我制作 makefile 的原因。

这是我目前的代码

OBJS = $(target).o
CC = g++
CFLAGS = -Wall -g -std=c++11
INCLUDE = -I./$(target)

#default command to run
all : Main-$(target) clean run

#compile and build
Main-$(target) : $(OBJS)
    $(CC) $(CFLAGS) $^ -o $@
%.o : %.cpp
    $(CC) -c $(CFLAGS) $<

#remove object and any other garbage files.
clean:
    rm -rf -d $(target).o *~ *% *# .#*

#remove the compiled file
clean-all:
    $(clean) rm Main-$(target)

#run the compiled file
run:
    ./Main-$(target)

我用来编译的命令是, make target=sourceFile

另外我不包括文件扩展名,我的所有源文件扩展名都是 cpp

我最终想要的是: make sourceFile

顺便说一句,为了使用命令 clean 和 clean-all,我使用

make target=sourceFile clean

make target=sourceFile clean-all

如果我可以使用,我会更喜欢:

make sourceFile clean

make sourceFile clean-all

【问题讨论】:

  • 也许将通用部分移动到您可以包含的模板中,并拥有一个仅提供您想要的特定目标的狭窄主 makefile。

标签: c++ makefile


【解决方案1】:

您可以使用通用的 Makefile 变量 MAKECMDGOALS,其中包含传递给 make 的所有目标。

请试试这个变种

CC = g++
CFLAGS = -Wall -g
MAKECMDGOALS := $(filter-out clean, $(MAKECMDGOALS))

.PHONY: $(MAKECMDGOALS)
$(MAKECMDGOALS):
        $(CC) $(CFLAGS) $@.c -o Main-$@

clean:
        rm -f *.o

这里是线条

$(MAKECMDGOALS):
        $(CC) $(CFLAGS) $@.c -o Main-$@

将为MAKECMDGOALS 中的每个单词生成单独的构建目标。

注意,我们需要这个 Makefile 来知道 'clean' 是删除东西的目标,而不是尝试构建 Main-clean。这就是我们使用过滤功能从MAKECMDGOALS 中删除clean 的原因。

所以如果我们运行make a b clean,构建系统将自动生成用于构建Main-aMain-b的目标,然后使用已经编写好的clean目标

【讨论】:

  • 我只是稍微修改了代码。原始代码正在为正在编译的文件创建一个文件夹。这是修改后的代码Github Gist
【解决方案2】:

免责声明——这是对 Make 的非标准使用,因此会打开各种极端情况,所以我不推荐它。这更适合调用 make 的 shell 脚本。话虽这么说……这是一个有趣的问题。

你不能做make xxx clean,而不是让它尝试构建xxx(除非你用递归make做了一些非常讨厌的事情,但我不会去那里)。不过,您可以执行make clean-xxx 之类的操作,如下所示:

%:Main-%

Main-%:%.cpp
    $(CC) $(CFLAGS) $< -o Main-$@

clean-%:
    rm Main-$*

请注意,%-clean 的词干较短,因此如果 make 目标以 clean- 开头,则优先于 %

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2019-05-27
    • 2015-08-27
    相关资源
    最近更新 更多