makefile中的硬链接

时间:2014-11-08 04:02:25

标签: c makefile

我很难弄清楚如何创建两个指向我的目标程序的硬链接。我的目标程序是foo,我想为foo创建两个硬链接,一个名为baz,另一个名为bar。目前我的makefile看起来像这样:

CC = gcc
CFLAGS = -g -std=c99 -pedantic -Wall
HOME = /my/home/dir
SOURCES = main.c bar.c baz.c datastructure.c ${HOME}/addNodes.c
OBJECTS = $(SOURCES:.c=.o)
TARGET = foo
LN_F = ln -f

$(TARGET): $(OBJECTS)
    ${CC} ${CFLAGS} -o $@ $^

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

bar: ${TARGET}
    ${LN_F} ${TARGET} bar

baz: ${TARGET}
    ${LN_F} ${TARGET} baz

问题是我现在必须通过输入"ln -s foo bar""ln -s foo baz"

手动创建foo的硬链接

2 个答案:

答案 0 :(得分:3)

如果你使用符号链接:

TARGET = foo
AUX1   = bar
AUX2   = baz
LN_S   = ln -s -f

all: ${TARGET} ${AUX1} ${AUX2}

${TARGET}: $(OBJECTS)                                                           
    ${CC} ${CFLAGS} -o $@ $^                                                    

${AUX1}: ${TARGET}
    ${LN_S} ${TARGET} ${AUX1}

${AUX2}: ${TARGET}
    ${LN_S} ${TARGET} ${AUX2}

如果您使用硬链接,则会使用ln -f(不包含-s)。请注意,一段时间(很久很久以前)-f不支持ln(在那些日子里,-s也不支持 - 我正在谈论很久以前),像这些链接规则这样的规则会在运行rm -f命令之前使用ln删除链接。

您还可以使用通用宏$@$?编写链接行(这些是可靠的POSIX支持的宏):

${AUX2}: ${TARGET}
    ${LN_S} $? $@

这很有效,因为${AUX2}只有一个先决条件;如果有多个先决条件,$?将不起作用 - 请小心。

答案 1 :(得分:0)

您的帖子和评论中没有任何内容可以解释为什么需要硬链接。所以我将继续我的前任的路线,试图向您展示如何使用软链接。

在makefile中创建目标符号链接的正确方法如下:

TARGET := foo
LINK := bar

$(LINK): Makefile | $(TARGET)
    ln -sf $| $@

依赖项必须是仅订单的,因为您不依赖于目标的更改,您只关心它是否存在,因此您没有挂起链接,这是一件坏事。

-f选项是支持GNU Make -B选项所必需的。