Fenner
Compilador

Configuração

O fc.config e o <projeto>.config — plataformas, modos, ajustes por escopo, variáveis e constantes.

A linha de comando carrega apenas duas informações: a plataforma (-P<Plataforma>) e o modo (-M<Modo>). Todo o resto mora em arquivos de configuração.

terminal
fc Meu.fxp -PMSWin64 -MRelease

Os três arquivos#

O fc lê até três arquivos, nesta ordem, e o de baixo vence:

#ArquivoOndeVersionar?
1fc.configao lado do fc.exenão: são os padrões da máquina
2<projeto>.configao lado do .fxpsim
3<projeto>.config.localao lado do .fxpnão: ajustes do desenvolvedor

Para C:\App\Meu.fxp, o fc procura Meu.config e Meu.config.local em C:\App\. Sem nenhum arquivo, ele usa os padrões (a RTL em ..\rtl, relativa à pasta do fc.exe).

Formato#

Duas famílias de linha: declarações (o vocabulário do projeto) e ajustes (o que cada combinação vale). Uma linha começada por # é comentário.

Declarações#

config
Platform  MSWin64                          # plataforma aceita em -P
Platform  MSWin32
Mode      Debug                            # modo aceito em -M
Mode      Release

Default Platform  MSWin64                  # usada quando não há -P
Default Mode      Debug                    # usado quando não há -M

PlatformMode  <Nome>  <Plataforma>  <Modo> # combinação NOMEADA; "*" = todos

Mode aceita qualquer nome: Debug e Release são só a convenção, e nada impede Mode Profile ou Mode Homolog. As combinações nomeadas são o que os ajustes usam como escopo:

config
PlatformMode  MSWin64         MSWin64   *
PlatformMode  Release         *         Release
PlatformMode  MSWin64Release  MSWin64   Release

All é embutido (vale sempre, não precisa declarar). Um nome de plataforma também serve de escopo mesmo sem PlatformMode.

Ajustes#

texto
<Tipo>  <Escopo>  <Chave>  [Valor]

O escopo é obrigatório: use All para valer sempre.

TipoFormaEfeito
ConfigConfig <Escopo> <Chave> <Valor>opção do compilador (tabela abaixo)
UserVarUserVar <Escopo> <Nome> <Valor>variável usável como ($Nome)
DefineDefine <Escopo> <Símbolo>liga um símbolo condicional (como -D)
SysConstSysConst <Escopo> <Nome> <Valor>constante nomeada, que vira literal no código

Um escopo só é aplicado quando a combinação dele casa com a plataforma e o modo desta compilação. Entre os que casam, vence o mais específico (o que tem menos *):

texto
All  (0)   <   MSWin64 ou Release  (1)   <   MSWin64Release  (2)

Um escopo não declarado gera aviso: não some em silêncio.

Chaves de Config#

ChaveValorEfeito
RtlSourcediretórioonde estão os fontes da RTL (equivale a FC_RTL)
RtlBinarydiretóriocache de objeto da RTL (padrão: %LOCALAPPDATA%\fc\rtlcache)
OutputPathdiretórioonde cai a saída; também alimenta ($OutputPath)
ExeOutputcaminhocaminho completo do .exe (mais forte que OutputPath)
DllOutputcaminhocaminho completo do .dll (de uma library)
SourcePathdirs separados por ;busca extra de uses e {$include}; acumula entre escopos
OptimizationO0…O3nível de otimização (aceita O2, -O2 ou 2)
Mapon/offgera o .map do ligador
Debugon/offinformação de depuração (CodeView/PDB)
Rttion/offgera <saída>.rtti.json
AppTypeGUI/CONSOLEsubsistema do PE (padrão CONSOLE)
LinkPackage.fxdpackage que serve de runtime compartilhada
RtlPackagecaminhoo package de runtime em DLL que o projeto usa
UnlinkPackage.fxdcancela um LinkPackage vindo de um .config acima

on/off aceita on, true, sim, yes, 1, e a chave sozinha, sem valor, também liga (Config Debug Map).

Variáveis ($Nome)#

Expandidas dentro dos valores. Embutidas:

VariávelValor
($FcPath)diretório do fc.exe (sem barra final)
($ProjectPath)diretório do projeto (sem barra final)
($ProjectName)nome-base do projeto (sem extensão)
($Platform)plataforma efetiva (MSWin64/MSWin32/Linux64)
($Mode)modo efetivo (Debug, Release, …)
($PlatformMode)os dois concatenados (MSWin64Release)
($OutputName)= ($ProjectName); um UserVar OutputName sobrepõe
($OutputPath)= ($ProjectPath); Config OutputPath ou UserVar sobrepõem

($PlatformMode) é o que dá saídas separadas sem repetir regra:

config
Config  All  OutputPath  ($ProjectPath)\Output\($PlatformMode)\

→ Output\MSWin64Debug\Meu.exe e Output\MSWin64Release\Meu.exe.

UserVars são resolvidas antes dos Config, e podem referenciar as embutidas e outras já definidas. Um nome desconhecido fica literal, o que ajuda a depurar.

SysConst: constantes nomeadas#

Cada uso do nome no código vira o literal no lugar, resolvido em tempo de compilação. O nome é case-sensitive (como todo identificador) e sombreia um símbolo homônimo.

  • entre apóstrofos → texto: SysConst All AppName 'MeuApp v2'
  • só dígitos (sinal opcional) → inteiro: SysConst All BuildNum 1234
  • qualquer outra coisa → texto
Fenner
WriteLn('versão ', AppName, ' build ', IntToUStr(BuildNum));   // BuildNum é Int64 de verdade

Exemplo completo#

config
# fc.config -- ao lado do fc.exe

Platform MSWin64
Platform MSWin32
Mode     Debug
Mode     Release

Default Platform MSWin64
Default Mode     Debug

PlatformMode  MSWin64         MSWin64   *
PlatformMode  MSWin32         MSWin32   *
PlatformMode  Debug           *         Debug
PlatformMode  Release         *         Release
PlatformMode  MSWin64Debug    MSWin64   Debug
PlatformMode  MSWin64Release  MSWin64   Release

Config  All      RtlSource     ($FcPath)\..\rtl
Config  All      OutputPath    ($ProjectPath)\Output\($PlatformMode)\

Config  Debug    Optimization  O0
Config  Debug    Debug         on
Config  Debug    Map           on
Config  Release  Optimization  O2

Define  Debug    DEBUG
Define  Release  RELEASE
config
# Meu.config -- do projeto, versionado
Config  All      RtlPackage    ($FcPath)\..\Packages\Fenner.BedRock
Config  MSWin32  Optimization  O1
Define  MSWin32  CPU32
config
# Meu.config.local -- NÃO versionar
Config  All  RtlSource  D:\rtl-de-teste

Precedência#

texto
.config.local   >   <projeto>.config   >   fc.config

e, dentro de cada arquivo, o escopo mais específico vence. Da linha de comando vêm só -P, -M, -D<símbolo> e -o (saída explícita).

O que o RAD escreve#

Um projeto criado pelo RAD já nasce com um .config assim, com os modos Debug, Release e Fast:

config
Platform MSWin64
Default Platform MSWin64

Mode Debug
Mode Release
Mode Fast
Default Mode Fast

PlatformMode  All      *        *
PlatformMode  MSWin64  MSWin64  *
PlatformMode  Debug    *        Debug
PlatformMode  Release  *        Release
PlatformMode  Fast     *        Fast

Config  All      RtlSource     C:\Fenner\Common\BedRock\rtl
Config  All      SourcePath    ($ProjectPath)\src
Config  All      AppType       GUI
Config  All      OutputPath    ($ProjectPath)\bin

Config  Debug    Optimization  O0
Config  Debug    Debug         on
Config  Release  Optimization  O2
Config  Fast     Optimization  O0