如何选择包含某些功能的某些代码?

时间:2014-02-03 21:34:27

标签: inno-setup conditional-compilation

在Inno Setup中,我有一个主要脚本是“核心系统”,这意味着我们的软件完全需要安装/运行所需的一切。另外,我正在为每个主要功能编写脚本文件,这些功能可能会也可能不会编译到安装程序中。在主脚本文件的顶部,我包含其他脚本文件...

#include "AdditionalOption.iss"
#include "AnotherOption.iss"

编译此主脚本时,编辑人员可以选择是否在安装程序中编译这些特定选项(由于各种原因而备用文件大小)。

当主脚本中的特定代码依赖于其中一个附加脚本中的某些内容时,会出现问题。例如......

procedure InitializeWizard();
begin
  //Creates custom wizard page only if "AdditionalOption.iss" is compiled
  CreatePageForAdditionalOption; 
  //Creates custom wizard page only if "AnotherOption.iss" is compiled
  CreatePageForAnotherOption; 
end;

InitializeWizard只能定义一次,但我需要有条件地调用代码,具体取决于是否包含其他脚本。这些过程驻留在相应的脚本文件中,因此如果用户排除了其他脚本文件,它们当然不存在。

在Delphi中,我可以使用这样的条件:

{$DEFINE ADD_OPT}
{$DEFINE ANO_OPT}

procedure InitializeWizard();
begin
  {$IFDEF ADD_OPT}
  CreatePageForAdditionalOption;
  {$ENDIF}
  {$IFDEF ANO_OPT}
  CreatePageForAnotherOption;
  {$ENDIF}
end;

当然这不是Delphi。我怎么能在Inno Setup中做这样的事情?

2 个答案:

答案 0 :(得分:5)

Inno Setup有一个预处理器,可让您使用#ifdef#else#endif,您可以通过iscc.exe /D命令行设置PARAM(一个或多个)。您可以定义多个#ifdef并通过多个/D设置它们。

; Command line param => /DADD_OPT
#ifdef ADD_OPT
  ...
#else
  ...
#endif

我用它们来覆盖默认值:

; Command line param => /DENVIRONMENT=Prod
#ifdef ENVIRONMENT
  #define Environment ENVIRONMENT
#else
  #define Environment "Beta"
#endif

答案 1 :(得分:2)

稍微挖掘一下,我想出来了。就像我上面的例子......

{$DEFINE ADD_OPT}
{$DEFINE ANO_OPT}

procedure InitializeWizard();
begin
  {$IFDEF ADD_OPT}
  CreatePageForAdditionalOption;
  {$ENDIF}
  {$IFDEF ANO_OPT}
  CreatePageForAnotherOption;
  {$ENDIF}
end;

它可以在Inno Setup中复制,就像这样......

#define Public ADD_OPT
#define Public ANO_OPT

procedure InitializeWizard();
begin
  #ifdef ADD_OPT
  CreatePageForAdditionalOption;
  #endif
  #ifdef ANO_OPT
  CreatePageForAnotherOption;
  #endif
end;
相关问题