如何使用命令行编译Delphi 7项目组文件(.bpg)?

3

我将许多项目分组到了一个项目组中。所有信息都在project.bpg文件中。现在,我想要自动构建它们。

如何使用命令行构建所有项目?

我仍在使用Delphi 7。


我们使用一个脚本来循环遍历groupproj的条目,并为每个遇到的项目启动命令行编译器。我没有将其作为答案,因为我拥有的脚本是针对groupproj的,而您正在使用bpg。如果您感兴趣,我会尝试找到bpg版本。不能保证,因为我需要在6年以上的发布版本中进行搜索。 - Marjan Venema
3个回答

7
我从未亲自尝试过,但这篇德语文章描述了您可以使用make -f ProjectGroup.bpg,因为*.bpg本质上是makefile。请参考此处的德语文章。

1
以下是使用Delphi自带Make命令的指令:"c:\Arquivos de programas\Borland\Delphi7\Bin\make.exe" -B -fproject-group.bpg。不幸的是,它是无用的,因为make不使用每个文件内部的相对路径。我今天发现了这个线程:http://www.rhinocerus.net/forum/lang-pascal-delphi-misc/134632-build-project-group-command-line.html。 - neves
抱歉。读到那样的东西让我很高兴我们现在使用D2007,这样我们就可以使用MSBuild了。有了它,从命令行构建就变得非常容易。也许你可以升级到D2007?或者看看FinalBuilder。它似乎可以处理bpg文件(http://www.finalbuilder.com/forum.aspx?aft=9491)。 - Uli Gerhardt

1

你也可以从命令行或批处理文件中运行Delphi,将.bpg文件名作为参数传递。

编辑:示例(适用于D2007,但可调整为D7):

=== rebuild.cmd(摘录)===

@echo off
set DelphiPath=C:\Program Files\CodeGear\RAD Studio\5.0\bin
set DelphiExe=bds.exe
set LibPath=V:\Library
set LibBpg=Library.groupproj
set LibErr=Library.err
set RegSubkey=BDSClean

:buildlib
echo Rebuilding %LibBpg%...
if exist "%LibPath%\%LibErr%" del /q "%LibPath%\%LibErr%"
"%DelphiPath%\%DelphiExe%" -pDelphi -r%RegSubkey% -b "%LibPath%\%LibBpg%"
if %errorlevel% == 0 goto buildlibok

1
你能发一个例子吗?我之前尝试过询问,但没能成功。 - neves
你说的 Delphi 是指集成开发环境吗?我还没有能够像 @neves 问的那样将 bpg 传递给命令行编译器... - Marjan Venema
2
真的用IDE开发这个东西是个好主意吗?你肯定想要用命令行编译器dcc32。 - David Heffernan
@David:我认为这应该由用户自行决定;这只是一种可能性。 - Ondrej Kelle
我应该指出 -r 开关,它指定了一个备用的注册表键。这可以清除所有设计包(空的“已知包”子键),从而防止重新构建通常安装在 IDE 中的软件包时可能发生的冲突。它还可以使 IDE 启动更快。 - Ondrej Kelle

0

正如我在对Ulrich Gerhardt的回答中所说的评论,如果您的项目位于子目录中,则make project_group.bpg是无用的。Make不会使用相对路径,项目将无法正确编译。

我已经编写了一个Python脚本来编译每个子目录中的所有DPR文件。这才是我真正想做的事情,但我会将上面的答案标记。虽然它对我没有起作用,但确实回答了我的问题。

这是我的compile_all.py脚本。我相信它可能会帮助某些人:

# -*- coding: utf-8 -*-

import os.path
import subprocess
import sys

#put this file in your root dir
BASE_PATH = os.path.dirname(os.path.realpath(__file__)) 
os.chdir(BASE_PATH)

os.environ['PATH'] += "C:\\Program Files\\Borland\\Delphi7\\Bin" #your delphi compiler path
DELPHI = "DCC32.exe"  
DELPHI_PARAMS = ['-B', '-Q', '-$D+', '-$L+']


for root, dirs, files in os.walk(BASE_PATH):
    projects = [project for project in files if project.lower().endswith('.dpr')]
    if ('FastMM' in root ): #put here projects you don't want to compile
        continue
    os.chdir(os.path.join(BASE_PATH, root))
    for project in projects:
        print
        print '*** Compiling:', os.path.join(root, project)
        result = subprocess.call([DELPHI] + DELPHI_PARAMS + [project])
        if result != 0:
            print 'Failed for', project, result
            sys.exit(result)

这种方法的另一个优点是您不需要将新项目添加到bpg文件中。如果它在子目录中,它将被编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接