From 2350071ba86568b0932a2c35121d73cf78f31b12 Mon Sep 17 00:00:00 2001 From: Daniele Teti Date: Wed, 3 Aug 2022 20:15:50 +0200 Subject: [PATCH] Moved Python build system from doit to invoke --- .vscode/launch.json | 16 + .vscode/settings.json | 3 + README.md | 13 + requirements.txt | 11 + .../RESTAppenderMobileSample.dproj | 17 +- tasks.py | 317 ++++++++++++++++++ unittests/UnitTests.dproj | 31 +- 7 files changed, 389 insertions(+), 19 deletions(-) create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 requirements.txt create mode 100644 tasks.py diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..01e6519 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Python File", + "type": "python", + "request": "launch", + "module": "invoke", + "args": ["build"], + "justMyCode": true + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..de288e1 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.formatting.provider": "black" +} \ No newline at end of file diff --git a/README.md b/README.md index a7d98eb..10b46f8 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,19 @@ LoggerPro is compatibile with - Delphi XE2 +## What's new in 1.4.0 + +- Improved VCL and FMX visual appenders +- Appenders can be added and removed programmatically +- Added packages for latest versions of Delphi +- Improved algorithm used to handle slow consumers +- Added [DMSContainer's EventStreams](http://dmscontainer.bittimeprofessionals.com/) Appender +- Added very basic console appender that assumes is running from console in order to provide simple Linux console logging +- FIX [Issue 50](https://github.com/danieleteti/loggerpro/issues/50) +- New filtering log file appender that allows to pick individual tags to be written into a file. +- FIX [Issue 57](https://github.com/danieleteti/loggerpro/issues/57) +- FIX [Issue 60](https://github.com/danieleteti/loggerpro/issues/60) + ## What's new in 1.3.2 - Added support for Android API level 26 in mobile demo diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5dd3565 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +appdirs==1.4.3 +attrs==19.3.0 +black==19.10b0 +click==7.1.1 +colorama==0.4.1 +invoke==1.4.1 +pathspec==0.7.0 +pyinvoke==1.0.4 +regex==2020.4.4 +toml==0.10.0 +typed-ast==1.4.1 diff --git a/samples/110_rest_appender_mobile/RESTAppenderMobileSample.dproj b/samples/110_rest_appender_mobile/RESTAppenderMobileSample.dproj index ecab1c7..369364e 100644 --- a/samples/110_rest_appender_mobile/RESTAppenderMobileSample.dproj +++ b/samples/110_rest_appender_mobile/RESTAppenderMobileSample.dproj @@ -23,11 +23,6 @@ Base true - - true - Base - true - true Base @@ -122,7 +117,7 @@ $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png - android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar + annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png @@ -150,15 +145,6 @@ android-support-v4.dex.jar;cloud-messaging.dex.jar;fmx.dex.jar;google-analytics-v2.dex.jar;google-play-billing.dex.jar;google-play-licensing.dex.jar;google-play-services-ads-7.0.0.dex.jar;google-play-services-analytics-7.0.0.dex.jar;google-play-services-base-7.0.0.dex.jar;google-play-services-identity-7.0.0.dex.jar;google-play-services-maps-7.0.0.dex.jar;google-play-services-panorama-7.0.0.dex.jar;google-play-services-plus-7.0.0.dex.jar;google-play-services-wallet-7.0.0.dex.jar $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png - - true - Base - true - Debug - true - true - DBXSqliteDriver;fmxase;DBXInterBaseDriver;tethering;FireDACMSSQLDriver;bindcompfmx;DBXOracleDriver;inetdb;emsedge;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;dsnap;DataSnapCommon;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;IndyIPCommon;bindcompdbx;IndyIPServer;IndySystem;fmxFireDAC;emshosting;FireDACPgDriver;FireDACASADriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;FireDACDSDriver;rtl;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;bindcomp;DBXInformixDriver;IndyIPClient;dbxcds;FireDACODBCDriver;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;DataSnapServerMidas;$(DCC_UsePackage);$(DCC_UsePackage);$(DCC_UsePackage) - DBXSqliteDriver;fmxase;DBXDb2Driver;DBXInterBaseDriver;OverbyteIcsD102Run;vclactnband;vclFireDAC;tethering;svnui;FireDACADSDriver;rtcSDK;DBXMSSQLDriver;DatasnapConnectorsFreePascal;FireDACMSSQLDriver;vcltouch;PythonVCL_D;vcldb;bindcompfmx;svn;DBXOracleDriver;inetdb;MQTTComponents;VirtualTreesDR;RaizeComponentsVcl;emsedge;RaizeComponentsVclDb;fmx;fmxdae;FireDACDBXDriver;dbexpress;IndyCore;vclx;Python_D;dsnap;DataSnapCommon;Package1;DataSnapConnectors;VCLRESTComponents;JclDeveloperTools;vclie;bindengine;DBXMySQLDriver;FireDACOracleDriver;FireDACMySQLDriver;DBXFirebirdDriver;FireDACCommonODBC;DataSnapClient;rtcSDK_DBA;IndyIPCommon;bindcompdbx;vcl;IndyIPServer;DBXSybaseASEDriver;IndySystem;FireDACDb2Driver;dsnapcon;DMVC_IDE_Expert_D102Tokyo;FireDACMSAccDriver;fmxFireDAC;FireDACInfxDriver;vclimg;Jcl;emshosting;FireDACPgDriver;FireDACASADriver;DBXOdbcDriver;FireDACTDataDriver;DbxCommonDriver;DataSnapServer;xmlrtl;DataSnapNativeClient;fmxobj;vclwinx;FireDACDSDriver;rtl;RFindUnit;DbxClientDriver;DBXSybaseASADriver;CustomIPTransport;vcldsnap;SynEditDR;bindcomp;appanalytics;DBXInformixDriver;IndyIPClient;bindcompvcl;dbxcds;VclSmp;adortl;FireDACODBCDriver;JclVcl;DataSnapIndy10ServerTransport;dsnapxml;DataSnapProviderClient;dbrtl;IndyProtocols;inetdbxpress;FireDACMongoDBDriver;JclContainers;DataSnapServerMidas;$(DCC_UsePackage) Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) @@ -1584,7 +1570,6 @@ True True - True True True diff --git a/tasks.py b/tasks.py new file mode 100644 index 0000000..9195dd8 --- /dev/null +++ b/tasks.py @@ -0,0 +1,317 @@ +from invoke import task, context, Exit +import os +import subprocess +from colorama import * +import glob +from shutil import copy2, rmtree, copytree +from datetime import datetime +import pathlib +from typing import * + +from pathlib import Path + +init() + +DEFAULT_DELPHI_VERSION = "11.1" + +g_releases_path = "releases" +g_output = "bin" +g_output_folder = "" # defined at runtime +g_version = "DEV" + +projects = [ + # ("samples\\01_global_logger\\global_logger.dproj", "Win32"), + # ("samples\\02_file_appender\\file_appender.dproj", "Win32"), + # ("samples\\03_console_appender\\console_appender.dproj", "Win32"), + # ( + # "samples\\04_outputdebugstring_appender\\outputdebugstring_appender.dproj", + # "Win32", + # ), + # ("samples\\05_vcl_appenders\\vcl_appenders.dproj", "Win32"), + # ("samples\\08_email_appender\\email_appender.dproj", "Win32"), + # ("samples\\10_multiple_appenders\\multiple_appenders.dproj", "Win32"), + # ( + # "samples\\15_appenders_with_different_log_levels\\multi_appenders_different_loglevels.dproj", + # "Win32", + # ), + # ("samples\\20_multiple_loggers\\multiple_loggers.dproj", "Win32"), + # ("samples\\50_custom_appender\\custom_appender.dproj", "Win32"), + # ("samples\\60_logging_inside_dll\\MainProgram.dproj", "Win32"), + # ("samples\\60_logging_inside_dll\\mydll.dproj", "Win32"), + # ("samples\\70_isapi_sample\\loggerproisapisample.dproj", "Win32"), + # ("samples\\90_remote_logging_with_redis\\REDISAppenderSample.dproj", "Win32"), + # ( + # "samples\\90_remote_logging_with_redis\\redis_logs_viewer\\REDISLogsViewer.dproj", + # "Win32", + # ), + # ("samples\\100_udp_syslog\\udp_syslog.dproj", "Win32"), + # ("samples\\110_rest_appender\RESTAppenderSample.dproj", "Win32"), + # ("samples\\110_rest_appender_mobile\RESTAppenderMobileSample.dproj", "Android"), + # ( + # "samples\\120_elastic_search_appender\\ElasticSearchAppenderSample.dproj", + # "Win32", + # ), + ("samples\\rest_logs_collector\RESTLogsCollector.dproj", "Win32"), +] + + +def get_delphi_projects_to_build(delphi_version=DEFAULT_DELPHI_VERSION): + global projects + return projects + + +def build_delphi_project( + ctx: context.Context, + project_filename, + config="DEBUG", + delphi_version=DEFAULT_DELPHI_VERSION, +): + delphi_versions = { + "10": {"path": "17.0", "desc": "Delphi 10 Seattle"}, + "10.1": {"path": "18.0", "desc": "Delphi 10.1 Berlin"}, + "10.2": {"path": "19.0", "desc": "Delphi 10.2 Tokyo"}, + "10.3": {"path": "20.0", "desc": "Delphi 10.3 Rio"}, + "10.4": {"path": "21.0", "desc": "Delphi 10.4 Sydney"}, + "11": {"path": "22.0", "desc": "Delphi 11 Alexandria"}, + "11.1": {"path": "22.0", "desc": "Delphi 11.1 Alexandria"}, + } + + assert delphi_version in delphi_versions, ( + "Invalid Delphi version: " + delphi_version + ) + print("[" + delphi_versions[delphi_version]["desc"] + "] ", end="") + version_path = delphi_versions[delphi_version]["path"] + + rsvars_path = ( + f"C:\\Program Files (x86)\\Embarcadero\\Studio\\{version_path}\\bin\\rsvars.bat" + ) + if not os.path.isfile(rsvars_path): + rsvars_path = f"D:\\Program Files (x86)\\Embarcadero\\Studio\\{version_path}\\bin\\rsvars.bat" + if not os.path.isfile(rsvars_path): + raise Exception("Cannot find rsvars.bat") + cmdline = ( + '"' + + rsvars_path + + '"' + + " & msbuild /t:Build /p:Config=" + + config + + f' /p:Platform={project_filename[1]} "' + + project_filename[0] + + '"' + ) + print("\n" + "".join(cmdline)) + r = ctx.run(cmdline, hide=True, warn=True) + if r.failed: + print(r.stdout) + print(r.stderr) + raise Exit("Build failed for " + delphi_versions[delphi_version]["desc"]) + + +def zip_samples(version): + global g_output_folder + cmdline = ( + "7z a " + + g_output_folder + + f"\\..\\{version}_samples.zip -r -i@7ziplistfile.txt" + ) + return subprocess.call(cmdline, shell=True) == 0 + + +def create_zip(ctx, version): + global g_output_folder + print("CREATING ZIP") + archive_name = version + ".zip" + switches = "" + files_name = "*" + cmdline = f"..\\7z.exe a {switches} {archive_name} *" + print("cmdline:" + cmdline) + print("g_output_folder: " + g_output_folder) + with ctx.cd(g_output_folder): + ctx.run(cmdline, shell=True) + + +def copy_sources(): + global g_output_folder + os.makedirs(g_output_folder + "\\sources", exist_ok=True) + os.makedirs(g_output_folder + "\\packages", exist_ok=True) + os.makedirs(g_output_folder + "\\tools", exist_ok=True) + # copying main sources + print("Copying LoggerPro Sources...") + src = glob.glob("*.pas") + glob.glob("*.inc") + glob.glob("*.md") + for file in src: + print("Copying " + file + " to " + g_output_folder + "\\sources") + copy2(file, g_output_folder + "\\sources\\") + + +def copy_libs(ctx): + global g_output_folder + + # swagdoc + print("Copying libraries: SwagDoc...") + curr_folder = g_output_folder + "\\lib\\swagdoc" + os.makedirs(curr_folder, exist_ok=True) + if not ctx.run(rf"xcopy lib\swagdoc\*.* {curr_folder}\*.* /E /Y /R /V /F"): + raise Exception("Cannot copy SwagDoc") + + # loggerpro + print("Copying libraries: LoggerPro...") + curr_folder = g_output_folder + "\\lib\\loggerpro" + os.makedirs(curr_folder, exist_ok=True) + if not ctx.run(rf"xcopy lib\loggerpro\*.* {curr_folder}\*.* /E /Y /R /V /F"): + raise Exception("Cannot copy loggerpro") + + # dmustache + print("Copying libraries: dmustache...") + curr_folder = g_output_folder + "\\lib\\dmustache" + os.makedirs(curr_folder, exist_ok=True) + if not ctx.run(rf"xcopy lib\dmustache\*.* {curr_folder}\*.* /E /Y /R /V /F"): + raise Exception("Cannot copy dmustache") + + +def printkv(key, value): + print(Fore.RESET + key + ": " + Fore.GREEN + value.rjust(60) + Fore.RESET) + + +def init_build(version): + """Required by all tasks""" + global g_version + global g_output_folder + global g_releases_path + g_version = version + g_output_folder = g_releases_path + "\\" + g_version + print() + print(Fore.RESET + Fore.RED + "*" * 80) + print(Fore.RESET + Fore.RED + " BUILD VERSION: " + g_version + Fore.RESET) + print(Fore.RESET + Fore.RED + " OUTPUT PATH : " + g_output_folder + Fore.RESET) + print(Fore.RESET + Fore.RED + "*" * 80) + + rmtree(g_output_folder, True) + os.makedirs(g_output_folder, exist_ok=True) + f = open(g_output_folder + "\\version.txt", "w") + f.write("VERSION " + g_version + "\n") + f.write("BUILD DATETIME " + datetime.now().isoformat() + "\n") + f.close() + copy2("README.md", g_output_folder) + copy2("License.txt", g_output_folder) + + +def build_delphi_project_list( + ctx, projects, config="DEBUG", delphi_version=DEFAULT_DELPHI_VERSION +): + ret = True + for delphi_project in projects: + msg = f"Building: {os.path.basename(delphi_project[0])} ({config})" + print(Fore.RESET + msg.ljust(90, "."), end="") + try: + build_delphi_project(ctx, delphi_project, "DEBUG", delphi_version) + print(Fore.GREEN + "OK" + Fore.RESET) + except Exception as e: + ret = False + print(Fore.RED + "\n\nBUILD ERROR") + print(Fore.RESET) + print(e) + raise + + # if res.ok: + # print(Fore.GREEN + "OK" + Fore.RESET) + # else: + # ret = False + # print(Fore.RED + "\n\nBUILD ERROR") + # print(Fore.RESET + res.stdout) + # print("\n") + + return ret + + +@task +def clean(ctx, folder=None): + global g_output_folder + import os + import glob + + if folder is None: + folder = g_output_folder + print(f"Cleaning folder {folder}") + output = pathlib.Path(folder) + to_delete = [] + to_delete += glob.glob(folder + r"\**\*.exe", recursive=True) + to_delete += glob.glob(folder + r"\**\*.dcu", recursive=True) + to_delete += glob.glob(folder + r"\**\*.stat", recursive=True) + to_delete += glob.glob(folder + r"\**\*.res", recursive=True) + to_delete += glob.glob(folder + r"\**\*.map", recursive=True) + to_delete += glob.glob(folder + r"\**\*.~*", recursive=True) + to_delete += glob.glob(folder + r"\**\*.rsm", recursive=True) + to_delete += glob.glob(folder + r"\**\*.drc", recursive=True) + to_delete += glob.glob(folder + r"\**\*.log", recursive=True) + to_delete += glob.glob(folder + r"\**\*.local", recursive=True) + to_delete += glob.glob(folder + r"\**\*.gitignore", recursive=True) + to_delete += glob.glob(folder + r"\**\*.gitattributes", recursive=True) + + for f in to_delete: + print(f"Deleting {f}") + os.remove(f) + + rmtree(folder + r"\lib\loggerpro\Win32", True) + rmtree(folder + r"\lib\loggerpro\packages\d100\__history", True) + rmtree(folder + r"\lib\loggerpro\packages\d100\Win32\Debug", True) + rmtree(folder + r"\lib\loggerpro\packages\d101\__history", True) + rmtree(folder + r"\lib\loggerpro\packages\d101\Win32\Debug", True) + rmtree(folder + r"\lib\loggerpro\packages\d102\__history", True) + rmtree(folder + r"\lib\loggerpro\packages\d102\Win32\Debug", True) + rmtree(folder + r"\lib\loggerpro\packages\d103\__history", True) + rmtree(folder + r"\lib\loggerpro\packages\d103\Win32\Debug", True) + rmtree(folder + r"\lib\loggerpro\packages\d104\__history", True) + rmtree(folder + r"\lib\loggerpro\packages\d104\Win32\Debug", True) + rmtree(folder + r"\lib\dmustache\.git", True) + rmtree(folder + r"\lib\swagdoc\lib", True) + rmtree(folder + r"\lib\swagdoc\deploy", True) + rmtree(folder + r"\lib\swagdoc\demos", True) + + +@task() +def tests(ctx, delphi_version=DEFAULT_DELPHI_VERSION): + """Builds and execute the unit tests""" + import os + + apppath = os.path.dirname(os.path.realpath(__file__)) + res = True + testclient = r"unittests\UnitTests.dproj" + + print("\nBuilding Unit Tests") + build_delphi_project( + ctx, (testclient, "Win32"), config="CI", delphi_version=delphi_version + ) + + import subprocess + + print("\nExecuting tests...") + r = subprocess.run([r"unittests\Win32\CI\UnitTests.exe"]) + if r.returncode != 0: + return Exit("Compilation failed: \n" + str(r.stdout)) + if r.returncode > 0: + print(r) + print("Unit Tests Failed") + return Exit("Unit tests failed") + + +@task(post=[tests]) +def build(ctx, version="DEBUG", delphi_version=DEFAULT_DELPHI_VERSION): + """Builds LoggerPro""" + init_build(version) + delphi_projects = get_delphi_projects_to_build(delphi_version) + ret = build_delphi_project_list(ctx, delphi_projects, version, delphi_version) + if not ret: + raise Exit("Build failed") + + +@task(pre=[tests, build]) +def release( + ctx, version="DEBUG", delphi_version=DEFAULT_DELPHI_VERSION, skip_build=False +): + """Builds all the projects, executes unit/integration tests and create release""" + print(Fore.RESET) + copy_sources() + # copy_libs(ctx) + clean(ctx) + # zip_samples(version) + create_zip(ctx, version) diff --git a/unittests/UnitTests.dproj b/unittests/UnitTests.dproj index 828a1f9..721239d 100644 --- a/unittests/UnitTests.dproj +++ b/unittests/UnitTests.dproj @@ -4,7 +4,7 @@ 19.4 UnitTests.dpr True - PLAINDUNITX + CI Win32 1 Console @@ -45,6 +45,17 @@ true true + + true + Base + true + + + true + Cfg_3 + true + true + CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 1040 @@ -97,6 +108,16 @@ 1033 + + true + true + true + false + CI;$(DCC_Define) + 0 + 1033 + none + MainSource @@ -120,6 +141,10 @@ Cfg_2 Base + + Cfg_3 + Base + Delphi.Personality.12 @@ -130,10 +155,10 @@ UnitTests.dpr - Embarcadero C++Builder Office 2000 Servers Package - Embarcadero C++Builder Office XP Servers Package Microsoft Office 2000 Sample Automation Server Wrapper Components Microsoft Office XP Sample Automation Server Wrapper Components + Embarcadero C++Builder Office 2000 Servers Package + Embarcadero C++Builder Office XP Servers Package