Linux 使用“生成”仅复制已更改的文件

Linux 使用“生成”仅复制已更改的文件,linux,ubuntu,makefile,Linux,Ubuntu,Makefile,我有一个包含大量头(.h)文件的文件夹,要安装我们的库,我需要将这些文件复制到系统文件夹中。但是,我只想复制已更改的文件。我如何使用make和cp来实现这一点,而不必使用任何其他工具,如rsync?您可以使用如下结构: /path/to/system/header.h: /path/to/local/header.h cp $^ $@ 如果本地版本较新,则将本地标头复制到系统标头。 如果你有GNU make,比如Ubuntu,你可以创建一些奇特的函数,就像这样。 它将更新的头

我有一个包含大量头(.h)文件的文件夹,要安装我们的库,我需要将这些文件复制到系统文件夹中。但是,我只想复制已更改的文件。我如何使用make和cp来实现这一点,而不必使用任何其他工具,如rsync?

您可以使用如下结构:

/path/to/system/header.h: /path/to/local/header.h
         cp $^ $@
如果本地版本较新,则将本地标头复制到系统标头。 如果你有GNU make,比如Ubuntu,你可以创建一些奇特的函数,就像这样。 它将更新的头文件从目录SRCDIR复制到DSTDIR。通过运行
makeall
进行尝试。它应该只复制较新的文件,在第二次运行时不执行任何操作

.DEFAULT_GOAL = all

SRCDIR  = local
DSTDIR  = system
HEADERS = $(shell cd $(SRCDIR); ls *.h)

# Define function; $(1) is the header file name.
define copyheader =
$(DSTDIR)/$(1): $(SRCDIR)/$(1)
    cp $$^ $$@
endef

# Use function to create recipes for each header file.
$(foreach file,$(HEADERS),$(eval $(call copyheader,$(file))))

# Depend on all destination headers.
all: $(addprefix $(DSTDIR)/,$(HEADERS))

但是您如何将其推广到文件夹中的任何.h头文件(无需为每个头文件编写make条目)@CarlosGranados这在很大程度上取决于
make
实现。有了GNU,一切都变得轻而易举。您使用的是什么操作系统和版本?这是ubuntu,不确定是哪个版本,我怎么能找到它?@CarlosGranados ubuntu有GNU make(运行
make--version
)。请参阅我编辑的答案。您正在使用哪些操作系统?哪个
制定
实施?GNU make有一些特性使其更容易实现。