如何在makefile中实现csplit?

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

如何具体地将A&B实现到下面的makefile中。 : 本项目的程序员选择将部分代码打包在一个名为chomp.adt的 "模块 "中,从中可以生成相关的文件cookie.h和cookie.cpp文件。制作该程序所需的步骤是。

A. 运行命令

    csplit chomp.adt "/Split Here/"

并将生成的文件xx00复制到cookie.h中。

B. 运行命令

csplit chomp.adt "/Split Here/"

并将得到的文件xx01复制到cookie.cpp中。

C. 编译cookie.cpp,生成cookie.o。

D. 编译mainProg.cpp,生成mainProg.o。

E. 将这两个.o文件连接起来,生成一个名为playChomp的可执行程序。

我怎样才能写出一个能执行所有这些步骤的makefile?我知道如何实现C-E,我相信,主要是A和B,我很困惑如何制定规则。当我尝试的时候,我把A和B写成了--。

cookie.h: csplit chomp.adt
         cp xx00 cookie.h
cookie.cpp: csplit chomp.adt
         cp xx01 cookie.cpp

我收到了 "没有cookie.cpp所需要的目标csplit规则 "的错误。

unix makefile makefile-errors
1个回答
3
投票

一个简单的makefile规则有如下语法。

<target> : <prerequisites>
        <recipe>

其中target是要建立的输出文件 prerequisites是用来建立target的输入文件 recipe是把输入文件变成输出文件的过程

命令 csplit ... 属于 配方. 它不应该被列为先决条件。

所以你的规则应该是这样的。

cookie.h: chomp.adt
        csplit $< "/Split Here/"
        cp xx00 $@

cookie.cpp: chomp.adt
        csplit $< "/Split Here/"
        cp xx01 $@

你可以阅读关于 $<$@ 这里。https:/www.gnu.orgsoftwaremakemanualhtml_nodeAutomatic-Variables.html严格来说,并不是必须使用它们。

然而,上述规则并不理想,因为你在不需要的时候运行了两次csplit命令。 如果你尝试在启用了并行构建的情况下运行make (make -jN)可能会失败,因为两者会同时运行并覆盖输出文件。

如何做得更好取决于你使用的GNU make版本。 如果你有GNU make 4.3,你可以使用。

cookie.h cookie.cpp &: chomp.adt
        csplit $< "/Split Here/"
        cp xx00 cookie.h
        cp xx01 cookie.cpp

这是一个分组目标,你可以在这里阅读。https:/www.gnu.orgsoftwaremakemanualhtml_nodeMultiple-Targets.html#index-grouped-targets

如果你有一个旧的版本,你可以玩一个小把戏,目标和先决条件都以相同的前缀开始(字母 c); 它看起来像这样。

%ookie.h %ookie.cpp : %homp.adt
        csplit $< "/Split Here/"
        cp xx00 cookie.h
        cp xx01 cookie.cpp

这是一个模式规则,你可以在这里阅读。https:/www.gnu.orgsoftwaremakemanualhtml_nodePattern-Intro.html

© www.soinside.com 2019 - 2024. All rights reserved.