From 2c7f681c58d31ccf7d4ed15482cfc5473b7a0a8b Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Tue, 5 Jul 2016 08:42:05 +0200 Subject: [PATCH] Allow to customize the DUB build commands... close #63 --- src/ce_dubproject.pas | 145 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 144 insertions(+), 1 deletion(-) diff --git a/src/ce_dubproject.pas b/src/ce_dubproject.pas index f89b051a..8b67fe6d 100644 --- a/src/ce_dubproject.pas +++ b/src/ce_dubproject.pas @@ -7,10 +7,51 @@ interface uses Classes, SysUtils, xfpjson, xjsonparser, xjsonscanner, process, strutils, LazFileUtils, RegExpr, - ce_common, ce_interfaces, ce_observer, ce_dialogs, ce_processes; + ce_common, ce_interfaces, ce_observer, ce_dialogs, ce_processes, + ce_writableComponent; type + TDubLinkMode = (dlmSeparate, dlmAllAtOnce, dlmSingleFile); + + (** + * Stores the build options, always applied when a project is build + *) + TCEDubBuildOptionsBase = class(TWritableLfmTextComponent) + strict private + fParallel: boolean; + fForceRebuild: boolean; + fLinkMode: TDubLinkMode; + fCombined: boolean; + fOther: string; + procedure setLinkMode(value: TDubLinkMode); + published + property parallel: boolean read fParallel write fParallel; + property forceRebuild: boolean read fForceRebuild write fForceRebuild; + property linkMode: TDubLinkMode read fLinkMode write setLinkMode; + property combined: boolean read fCombined write fCombined; + property other: string read fOther write fOther; + public + procedure assign(source: TPersistent); override; + procedure getOpts(options: TStrings); + end; + + (** + * Make the build options editable + *) + TCEDubBuildOptions = class(TCEDubBuildOptionsBase, ICEEditableOptions) + strict private + fBackup: TCEDubBuildOptionsBase; + function optionedWantCategory(): string; + function optionedWantEditorKind: TOptionEditorKind; + function optionedWantContainer: TPersistent; + procedure optionedEvent(anEvent: TOptionEditorEvent); + function optionedOptionsModified: boolean; + public + constructor create(aOwner: TComponent); override; + destructor destroy; override; + end; + TCEDubProject = class(TComponent, ICECommonProject) private fInGroup: boolean; @@ -106,14 +147,111 @@ var implementation +var + dubBuildOptions: TCEDubBuildOptions; + const + optFname = 'dubbuild.txt'; + DubBuiltTypeName: array[TDubBuildType] of string = ('plain', 'debug', 'release', 'unittest', 'docs', 'ddox', 'profile', 'cov', 'unittest-cov' ); DubDefaultConfigName = '(default config)'; +{$REGION Options ---------------------------------------------------------------} +procedure TCEDubBuildOptionsBase.setLinkMode(value: TDubLinkMode); +begin + if fLinkMode = value then + exit; + if not (value in [low(TDubLinkMode)..high(TDubLinkMode)]) then + value := low(TDubLinkMode); + fLinkMode:=value; +end; + +procedure TCEDubBuildOptionsBase.assign(source: TPersistent); +var + opts: TCEDubBuildOptionsBase; +begin + if source is TCEDubBuildOptionsBase then + begin + opts := TCEDubBuildOptionsBase(source); + parallel:=opts.parallel; + forceRebuild:=opts.forceRebuild; + combined:=opts.combined; + linkMode:=opts.linkMode; + other:=opts.other; + end + else inherited; +end; + +procedure TCEDubBuildOptionsBase.getOpts(options: TStrings); +begin + if parallel then + options.Add('--parallel'); + if forceRebuild then + options.Add('--force'); + if combined then + options.Add('--combined'); + case linkMode of + dlmAllAtOnce: options.Add('--build-mode=allAtOnce'); + dlmSingleFile: options.Add('--build-mode=singleFile'); + end; + if other.isNotEmpty then + CommandToList(other, options); +end; + +constructor TCEDubBuildOptions.create(aOwner: TComponent); +var + fname: string; +begin + inherited; + fBackup := TCEDubBuildOptionsBase.Create(nil); + EntitiesConnector.addObserver(self); + fname := getCoeditDocPath + optFname; + if fname.fileExists then + loadFromFile(fname); +end; + +destructor TCEDubBuildOptions.destroy; +begin + saveToFile(getCoeditDocPath + optFname); + EntitiesConnector.removeObserver(self); + fBackup.free; + inherited; +end; + +function TCEDubBuildOptions.optionedWantCategory(): string; +begin + exit('DUB build'); +end; + +function TCEDubBuildOptions.optionedWantEditorKind: TOptionEditorKind; +begin + exit(oekGeneric); +end; + +function TCEDubBuildOptions.optionedWantContainer: TPersistent; +begin + exit(self); + fBackup.assign(self); +end; + +procedure TCEDubBuildOptions.optionedEvent(anEvent: TOptionEditorEvent); +begin + case anEvent of + oeeAccept: fBackup.assign(self); + oeeCancel: self.assign(fBackup); + oeeSelectCat:fBackup.assign(self); + end; +end; + +function TCEDubBuildOptions.optionedOptionsModified: boolean; +begin + exit(false); +end; +{$ENDREGION} {$REGION Standard Comp/Obj -----------------------------------------------------} constructor TCEDubProject.create(aOwner: TComponent); @@ -295,6 +433,7 @@ begin if (fConfigs.Count <> 1) and (fConfigs[0] <> DubDefaultConfigName) then str.Add('--config=' + fConfigs[fConfigIx]); str.Add('--compiler=' + DubCompilerFilename); + dubBuildOptions.getOpts(str); result := str.Text; finally str.Free; @@ -465,6 +604,7 @@ begin if (fConfigs.Count <> 1) and (fConfigs[0] <> DubDefaultConfigName) then fDubProc.Parameters.Add('--config=' + fConfigs[fConfigIx]); fDubProc.Parameters.Add('--compiler=' + DubCompilerFilename); + dubBuildOptions.getOpts(fDubProc.Parameters); if run and runArgs.isNotEmpty then fDubProc.Parameters.Add('--' + runArgs); fDubProc.Execute; @@ -982,5 +1122,8 @@ end; initialization setDubCompiler(dmd); + dubBuildOptions:= TCEDubBuildOptions.create(nil); +finalization + dubBuildOptions.free; end.