From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from EUR05-DB8-obe.outbound.protection.outlook.com (EUR05-DB8-obe.outbound.protection.outlook.com [40.107.20.77]) by mx.groups.io with SMTP id smtpd.web12.30459.1591624869694785909 for ; Mon, 08 Jun 2020 07:01:10 -0700 Authentication-Results: mx.groups.io; dkim=pass header.i=@armh.onmicrosoft.com header.s=selector2-armh-onmicrosoft-com header.b=lz8uPHNT; spf=pass (domain: arm.com, ip: 40.107.20.77, mailfrom: pierre.gondois@arm.com) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=22aKpwwZi+5Wgs6Qyx0Cgp0KKRbLYIFLJmdY555ISc8=; b=lz8uPHNTIpy3fepdOjR3BJ06oItQTAi2Ay4deNnvqK86W+E6GgX7RF5aj8RhzFVxKoUlF7II3tvmrc2mftgRVgkkDaww0N0hpwYitHOcNj/JjcImDypKrpdmpjk4rCSKD30Xl2oo1DuylMSBcs2nOMcmcUa1yqHAuL0lJimjKUg= Received: from AM0PR04CA0043.eurprd04.prod.outlook.com (2603:10a6:208:1::20) by DB7PR08MB3516.eurprd08.prod.outlook.com (2603:10a6:10:4f::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.22; Mon, 8 Jun 2020 14:01:05 +0000 Received: from AM5EUR03FT028.eop-EUR03.prod.protection.outlook.com (2603:10a6:208:1:cafe::ac) by AM0PR04CA0043.outlook.office365.com (2603:10a6:208:1::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.18 via Frontend Transport; Mon, 8 Jun 2020 14:01:05 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; edk2.groups.io; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;edk2.groups.io; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT028.mail.protection.outlook.com (10.152.16.118) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.18 via Frontend Transport; Mon, 8 Jun 2020 14:01:05 +0000 Received: ("Tessian outbound 8bb15bb571b3:v59"); Mon, 08 Jun 2020 14:01:04 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: a4de6f2748db665f X-CR-MTA-TID: 64aa7808 Received: from 5837f9d57c11.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id ADB7A0DE-7250-43A2-9259-990DEFC4C168.1; Mon, 08 Jun 2020 14:00:59 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 5837f9d57c11.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 08 Jun 2020 14:00:59 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gckjtmYVjAYXsT4h8fXOKJGshnJ+M+mNflfO8b9iav3UnQ2I6pt2ndq65V01yr9wnsf78jZc8Qv4rf4ACMtsvhCm4np1qq4YV+RA+r39mnsf8e9VSzRDLItkAkVkeIFLrbF8uGF9mKwdMHNHzYLI9vAHIrAD1AcLfIfs2TZ+HM0WjxIAJQf+a1evvXE7z4oI2atPKKk9rQ7m8sTqrn97/SzwmvY5uVyLIUK1gSZNRO56tjkg9jQcvJ4J+FT/Vo/zLLh+seLPZgMzVcz93V/8zUiFIQ2fZ/B4spOf0w4T2w2QPbeyWN7FBDK+lrLOr21Tn+lM5iFhoJAznLR97wmcUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=22aKpwwZi+5Wgs6Qyx0Cgp0KKRbLYIFLJmdY555ISc8=; b=Pk8KKxgb/FfcamXppFlGixUL/RwQEnx2v1fZNckxuMrIZseb//JAuuDp3ixJCnKZRHSkcLwlUomhiq93mhg9tK42mOOjemvFTF6zLwTG0a53MwKEgeyxXjTzywAykPTB5Nk8hvVzfiyGEpgK17ER2a6mldQJ+4Zpp/kbrUjdvsuUMHHLnzac42gNMSP9+WlLkBC8GrL5y6ZFfMbxMNCRveV4mMDRunzcZZxf7nmzpKZ2RFAPe2NRVD9ljoN3pWs2mAW0JYD61a8kXDqkYzeydb2nX0demVSVlCc8V/mI6/uLVMZRGqRDh11d2eDNZ8no4CxTGDsR3OeIk+xltXUAZA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=22aKpwwZi+5Wgs6Qyx0Cgp0KKRbLYIFLJmdY555ISc8=; b=lz8uPHNTIpy3fepdOjR3BJ06oItQTAi2Ay4deNnvqK86W+E6GgX7RF5aj8RhzFVxKoUlF7II3tvmrc2mftgRVgkkDaww0N0hpwYitHOcNj/JjcImDypKrpdmpjk4rCSKD30Xl2oo1DuylMSBcs2nOMcmcUa1yqHAuL0lJimjKUg= Received: from DB7PR08MB3113.eurprd08.prod.outlook.com (2603:10a6:5:20::21) by DB7PR08MB3260.eurprd08.prod.outlook.com (2603:10a6:5:21::23) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3066.22; Mon, 8 Jun 2020 14:00:57 +0000 Received: from DB7PR08MB3113.eurprd08.prod.outlook.com ([fe80::4178:71bd:a2a4:78bf]) by DB7PR08MB3113.eurprd08.prod.outlook.com ([fe80::4178:71bd:a2a4:78bf%7]) with mapi id 15.20.3066.023; Mon, 8 Jun 2020 14:00:57 +0000 From: "PierreGondois" To: "Feng, Bob C" , "devel@edk2.groups.io" CC: "Gao, Liming" , Sami Mujawar , Tomas Pilar , nd Subject: Re: [edk2-devel] [PATCH v1 1/3] BaseTools: Generate multiple rules when multiple output files Thread-Topic: [edk2-devel] [PATCH v1 1/3] BaseTools: Generate multiple rules when multiple output files Thread-Index: AQHWLR5DvrgOttPYDUayOoMOpRHh2qjFRBEAgAAUpFCACYdYEA== Date: Mon, 8 Jun 2020 14:00:57 +0000 Message-ID: References: <20200518141120.66132-1-pierre.gondois@arm.com> <20200518141120.66132-2-pierre.gondois@arm.com> In-Reply-To: Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: Authentication-Results-Original: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=arm.com; x-originating-ip: [217.140.99.251] x-ms-publictraffictype: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 68948380-6fc2-47b8-e0cb-08d80bb462c9 x-ms-traffictypediagnostic: DB7PR08MB3260:|DB7PR08MB3516: x-ms-exchange-transport-forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true nodisclaimer: true x-ms-oob-tlc-oobclassifiers: OLM:10000;OLM:10000; x-forefront-prvs: 042857DBB5 X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: 4uopDY7iC4Kp1PAGc19EGz1UM/ejUwNYwUgsHtveFmRjZR+JFdFFhKonSswq1tlpiNJrqrXzrw3xE/RgTLTQKt7FrvCTPTJ+VPnVnt4AcmpUUSW92GdNs+6jY0SRKiyUmvE/HPsHYhU0G2W34I+/eoqVCA78liE65+myN+SB5u499ArKPr32FIkcd0+/hE7RKktBr/am0yU8paNxAPXxWKf00j2uLGFvyyL0qwIn9XC159OVK/79/PV+mse3oNBPxldh9e1St04ufBNDziTeBAm7SAbauttp+vLdBfwFAo18sV8qsFxyXeKG22nffe7yrRueXenOHAGpjDim2kYI0/o02+PFFEw1IyeW4u40BnRcDT88U5oUkB8XeOjZ4bHoWInqybQx6296T8xKDUJkaA== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DB7PR08MB3113.eurprd08.prod.outlook.com;PTR:;CAT:NONE;SFTY:;SFS:(4636009)(366004)(136003)(396003)(39860400002)(346002)(376002)(9686003)(6506007)(8936002)(26005)(53546011)(2906002)(8676002)(71200400001)(55016002)(186003)(316002)(5660300002)(54906003)(4326008)(52536014)(110136005)(478600001)(966005)(76116006)(83380400001)(86362001)(66476007)(66556008)(64756008)(66446008)(66946007)(7696005)(33656002);DIR:OUT;SFP:1101; x-ms-exchange-antispam-messagedata: mwlZYonmeEQVTDGHVWcInhJQ/rAt0D/RtyBJzHcsqzCylumNR5c3nvWNqtIlKmS6vp0PwslBphDcDZRpyWtMCvSbXpTnE/ZUQIBs/3qlgANQTnPZHWXyMMRBb4hrCo4jVyyheDuG0O2FlnjNzkJTG13Y8TokRp/WpmYh6seP6KO/2kBHrOTv3XDU9A8IxtnRLlHThEHArv7M3pg3FlK1XW+TpUegaCguw1LllUVaJ+ttMEwIyxAM3tAuMug+l29ovweoOuYQ4zG5tYvjIWVgsnTue5mG2b48XGiNxHdsfgymmL3eHUXPC7NRzTD5G1p83SXwCJ3MJhtL9kxeH1cwq9u+EFMD16msFaSPoCVDbCpI1Tn36xRzpwLvC5TSmWGJofWslKDai5Kcq7Zx/O/oQ6waHahYFjszhBbgZi1Hu40DxHTf2Z59bohXOeHIjZvMF6iON2f0f03oAdgp3gvJrvh+AYLY/mpEEkE6XPztJ8UOrloCvxHQUvOfz8z4KwPH MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3260 Original-Authentication-Results: intel.com; dkim=none (message not signed) header.d=none;intel.com; dmarc=none action=none header.from=arm.com; Return-Path: Pierre.Gondois@arm.com X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT028.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123;CTRY:IE;LANG:en;SCL:1;SRV:;IPV:CAL;SFV:NSPM;H:64aa7808-outbound-1.mta.getcheckrecipient.com;PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com;CAT:NONE;SFTY:;SFS:(4636009)(39860400002)(136003)(346002)(396003)(376002)(46966005)(336012)(478600001)(8676002)(966005)(33656002)(8936002)(70206006)(7696005)(186003)(70586007)(82310400002)(54906003)(4326008)(36906005)(82740400003)(5660300002)(316002)(47076004)(52536014)(55016002)(9686003)(26005)(356005)(6506007)(83380400001)(81166007)(86362001)(2906002)(110136005)(53546011);DIR:OUT;SFP:1101; X-MS-Office365-Filtering-Correlation-Id-Prvs: 7e0691a8-ccc2-4395-db88-08d80bb45e2d X-Forefront-PRVS: 042857DBB5 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: zDSrWNFBmFoVp+lAyWHeVLZ+2fNdxIx9f1BpQo0TicXC0jik/F8Qdj893GjNjG5403z+Oh0ugDzzogHEoVJ9xImveHZdJFD3UfBS/H5y6Fc0Dn/QFJCrOMAGm3XrgDwmfnLx01F+iI0jMC9TmpsJFNbv1CHvx8NEaFwZkdpD7y/i7MPF2J2aAmCEz+s/ih2Cw/q1uwT+DY2ptqXnnIMk1j6Fa/VUHioEFcax15L2wjcWaiPC8sSQZqkFn2z511IonN/8QmB1IKCFkquJ1oJg6YA25vYwWB0vTH1pyfsN3qGiHKj0rCcsKr+NTyebzI6b34Gbwp57RWW4JPdhqK6IFz5UI2r9ITo/sd5GQ0Jd2ovk4rXBmljVyH99BhuKr8gCxIEsrrpU+V90lXvGIG1pmyFnQfc51mQjYxXfLR2l/IFvtu4FbvSsdx+JowQplu/UvA8tJFpucTXxTuNZaNKeverEECwE6i1g1Gg5Mfg4Q2Y= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jun 2020 14:01:05.1072 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 68948380-6fc2-47b8-e0cb-08d80bb462c9 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d;Ip=[63.35.35.123];Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3516 Content-Language: en-US Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Hello Bob, Should I modify the patch ? Regards, Pierre -----Original Message----- From: Pierre Gondois=20 Sent: Tuesday, June 2, 2020 2:04 PM To: Feng, Bob C ; devel@edk2.groups.io Cc: Gao, Liming ; Sami Mujawar ; Tomas Pilar ; nd Subject: RE: [edk2-devel] [PATCH v1 1/3] BaseTools: Generate multiple rule= s when multiple output files Hello Bob, Thank you for your answer, I put my comments as [Pierre], Regards, Pierre -----Original Message----- From: Feng, Bob C Sent: 02 June 2020 12:16 To: devel@edk2.groups.io; Pierre Gondois Cc: Gao, Liming ; Sami Mujawar ; Tomas Pilar ; nd Subject: RE: [edk2-devel] [PATCH v1 1/3] BaseTools: Generate multiple rule= s when multiple output files My comments are inline marked as [Bob]. Thanks, Bob -----Original Message----- From: devel@edk2.groups.io On Behalf Of PierreGondo= is Sent: Monday, May 18, 2020 10:11 PM To: devel@edk2.groups.io Cc: Pierre Gondois ; Feng, Bob C ; Gao, Liming ; Sami.Mujawar@arm.com; Tomas.Pila= r@arm.com; nd@arm.com Subject: [edk2-devel] [PATCH v1 1/3] BaseTools: Generate multiple rules wh= en multiple output files From: Pierre Gondois BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3D2425 This patch modifies the Makefile generation not to stop adding Makfile rul= es when the first final target is found. E.g.: If the following rules are described in build_rule.txt: -[Rule1]: .X files generate .Y and .Z files; -[Rule2]: .Z files generate .Z1 files. Currently, if a File1.X file was part of the sources of a module, only [Ru= le1] would be generated in the Makefile. Indeed, there are no rules to apply to .Y files: .Y files are a final targ= et. However, there is still [Rule2] to apply to .Z files. [Bob] I think currently a rule's output file will be added back to source = file list, and in the later loop, that output file will be handled by anoth= er rule. Doesn't that algorithm handle your case above? [Pierre] The rule's output file was effectively added to the list of source files, = and a rule was searched for this output file. However, the loop stopped wh= en the first final target was found. By final target I mean "a file that is= n't the input of a rule". For the asl/aml/amli case, this meant that: -(first loop iteration: treating the ASL file) The rule for ASL files was= found and applied to the input ASL file. The AML and ".amli" files were ad= ded to the list of source files to look for a rule to apply to them. The lo= op continues. -(second loop iteration: treating the AML file) There is no rule for AML = files. This means that the AML file is a final target. The loop ends withou= t having applied the rule on the ".amli" file. This is why all the "break" instructions of the loop have been replaced wi= th "continue". This prevents the loop from exiting without having treated a= ll the files in the "SourceList". This patch also adds a dependency between the first ouput file of a rule a= nd the other output files. For instance, with the same example as above, File1.Y and File1.Z are gene= rated by the following rule: File1.Y: File1.X and the new dependency is: File1.Z: File1.Y This is necessary to keep a dependency order during the execution of the M= akefile. Indeed, .Y and .Z files are generated by the execution of a common= set of commands, and without this rule, there is no explicit dependency re= lation between them. [Bob] If there are 3 output files, for example:=20 A B C Will the dependency relationship be B: A C: B [Pierre] Currently, the dependency relation that would be created is: B: A C: A This can be changed to the dependency you described. Signed-off-by: Pierre Gondois --- The changes can be seen at: https://github.com/PierreARM/edk2/tree/803_Com= pile_AML_bytecode_array_into_OBJ_file_v1 Notes: v1: - Generate multiple rules when multiple output files are specified in the build_rule.txt file. [Pierre] BaseTools/Source/Python/AutoGen/GenMake.py | 6 +++ BaseTools/Source/Python/AutoGen/ModuleAutoGen.py | 40 ++++++++++---------= - 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/BaseTools/Source/Python/AutoGen/GenMake.py b/BaseTools/Source= /Python/AutoGen/GenMake.py index bbb3c29446f53fa7f2cb61a216a5b119f72c3fbc..0314d0ea34d99a014379e8d30c= 46ac0f0a7068ce 100755 --- a/BaseTools/Source/Python/AutoGen/GenMake.py +++ b/BaseTools/Source/Python/AutoGen/GenMake.py @@ -1054,6 +1054,12 @@ cleanlib: TargetDict =3D {"target": self.PlaceMacro(T.Target.Pa= th, self.Macros), "cmd": "\n\t".join(T.Commands),"deps": Deps} self.BuildTargetList.append(self._BUILD_TARGET_TEMPLA= TE.Replace(TargetDict)) =20 + # Add a Makefile rule for targets generating multiple= files. + # The main output is a prerequisite for the other out= put files. + for i in T.Outputs[1:]: + AnnexeTargetDict =3D {"target":=20 + self.PlaceMacro(i.Path, self.Macros), "cmd": "", "deps":=20 + self.PlaceMacro(T.Target.Path, self.Macros)} + + self.BuildTargetList.append(self._BUILD_TARGET_TEMPLATE.Replace(Annexe + TargetDict)) + def ParserCCodeFile(self, T, Type, CmdSumDict, CmdTargetDict, CmdCppD= ict, DependencyDict): if not CmdSumDict: for item in self._AutoGenObject.Targets[Type]: diff --git a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py b/BaseTools/= Source/Python/AutoGen/ModuleAutoGen.py index aad591de65f086043d55aeea5661f59c53792e7c..82facdb2774c56833718317f44= 14e0c1861de47f 100755 --- a/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py +++ b/BaseTools/Source/Python/AutoGen/ModuleAutoGen.py @@ -860,7 +860,8 @@ class ModuleAutoGen(AutoGen): SubDirectory =3D os.path.join(self.OutputDir, File.SubDir) if not os.path.exists(SubDirectory): CreateDirectory(SubDirectory) - LastTarget =3D None + TargetList =3D set() + FinalTargetName =3D set() RuleChain =3D set() SourceList =3D [File] Index =3D 0 @@ -872,7 +873,7 @@ class ModuleAutoGen(AutoGen): while Index < len(SourceList): Source =3D SourceList[Index] Index =3D Index + 1 - + FileType =3D TAB_UNKNOWN_FILE if Source !=3D File: CreateDirectory(Source.Dir) =20 @@ -881,34 +882,27 @@ class ModuleAutoGen(AutoGen): if not self.IsLibrary: continue RuleObject =3D self.BuildRules[TAB_DEFAULT_BINARY_FILE] - elif FileType in self.BuildRules: - RuleObject =3D self.BuildRules[FileType] elif Source.Ext in self.BuildRules: RuleObject =3D self.BuildRules[Source.Ext] else: - # stop at no more rules - if LastTarget: - self._FinalBuildTargetList.add(LastTarget) - break - + # No more rule to apply: Source is a final target. + FinalTargetName.add(Source) + continue FileType =3D RuleObject.SourceFileType self._FileTypes[FileType].add(Source) =20 # stop at STATIC_LIBRARY for library if self.IsLibrary and FileType =3D=3D TAB_STATIC_LIBRARY: - if LastTarget: - self._FinalBuildTargetList.add(LastTarget) - break + FinalTargetName.add(Source) + continue =20 Target =3D RuleObject.Apply(Source, self.BuildRuleOrder) if not Target: - if LastTarget: - self._FinalBuildTargetList.add(LastTarget) - break - elif not Target.Outputs: - # Only do build for target with outputs - self._FinalBuildTargetList.add(Target) + # No Target: Source is a final target. + FinalTargetName.add(Source) + continue =20 + TargetList.add(Target) self._BuildTargets[FileType].add(Target) =20 if not Source.IsBinary and Source =3D=3D File: @@ -916,12 +910,16 @@ class ModuleAutoGen(AutoGen): =20 # to avoid cyclic rule if FileType in RuleChain: - break + EdkLogger.error("build", ERROR_STATEMENT, "Cyclic=20 + dependency detected while generating rule for %s" % str(Source)) =20 RuleChain.add(FileType) SourceList.extend(Target.Outputs) - LastTarget =3D Target - FileType =3D TAB_UNKNOWN_FILE + + # For each final target, retrieve the TargetDescBlock instance. + for FTargetName in FinalTargetName: + for Target in TargetList: + if FTargetName =3D=3D Target.Target: + self._FinalBuildTargetList.add(Target) =20 @cached_property def Targets(self): -- 'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'