1

感谢 'Beta' 我的解决方案:

RLS_DIRECTORY = $(shell svnversion -cn | sed 's/:/-/')
SVN_VERSION   = $(shell svnversion -cn | sed -r 's/.+://')
RELEASE_NOTES = $(RLS_DIRECTORY:=/release-notes-$(SVN_VERSION:=.txt))

-include svn-version.mk

SVN_OLD_VERSION ?= 0

.PHONY = all zip release

release: $(RELEASE_NOTES)

$(RLS_DIRECTORY):
    mkdir -p $@

$(RELEASE_NOTES): $(RLS_DIRECTORY)
    @echo 'Creating release notes ($@)'
    @svn log -r $(SVN_OLD_VERSION):HEAD -v > $@ \
      && echo "SVN_OLD_VERSION ?= `svnversion -c | sed -r 's/.+://'`" \
       > svn-version.mk

简而言之,当我要求make这样做时(# make release)创建一个特定于版本的目录,然后自上次调用目标以来将日志数据转储到特定于版本的日志文件中。持久性数据(SVN_OLD_VERSION)存储在 svn-version.mk 中,有条件地包含在内。


原帖:

在我的项目 'make' 文件(例如this)中的其他特定于 subversion 的目标中,我有一些目标,我试图添加这些目标,以便从上次调用 'release' 目标时创建日志文件。至今:

SVN_VERSION ?= 0
-include svn-version.mk

RLS_DIR = `svnversion -cn | sed 's/://'`

.PHONY = $(RLS_DIR) notes release

notes: $(RLS_DIR)\notes.txt
release: notes

svn-version.mk:
    @echo 'Generating $@'
    @echo "SVN_VERSION ?= `svnversion -c | sed -r 's/.+://'`" > $@

$(RLS_DIR):
    mkdir $@

$(RLS_DIR)\notes.txt: $(RLS_DIR)
    svn log -r $(SVN_VERSION):HEAD > $@

但我试图弄清楚两件事:

*1。如何根据svnversion输出创建目录?以上给了我一个错误“***目标模式不包含'%'。停止。” svnversion 产生“nnnn:mmmm”,我想创建一个目录“nnnn-mmmm”。)*

2.我怎样才能让包含文件“svn-version.mk”只在执行'release'目标时重建?

4

1 回答 1

2

你的问题并不完全清楚——而且我对颠覆不熟悉——但我可以做出有根据的猜测:

  1. 使用“shell”而不是反引号来设置 RLS_DIR:
    RLS_DIR = $(shell svnversion -cn | sed 's/:/-/')
    
  2. 这是一种奇怪的安排事情的方式。除非您出于其他目的需要 svn-version.mk,否则我建议您这样做:
    发布:SVN_VERSION ?= $(shell svnversion -c | sed -r 's/.+://')
    

编辑:
我仍然不完全清楚你想用 svn-version.mk 做什么,但 svn-version.mk 可以是“发布”的先决条件。如果 svn-version.mk 依赖于 log.txt 那么 log.txt 可以是它的先决条件,否则你将很难阻止 svn-version.mk 每次都被重新制作(你可能根本不应该包含它)。

于 2009-09-28T16:10:59.773 回答