rework CLI support in gbuild

I took a couple of "shortcuts" in the original approach which I thought
harmless, but which proved otherwise later. This revised approach is
more like I had wanted to do it but had been too lazy to really do :-)

The differences from user's POV are:
* several classes were renamed
  - CliLibrary -> CliAssembly
  - CliNativeLibrary -> CliLibrary
* CliLibrary is now based on LinkTarget, so there is no need for an
  intermediate Library for it

I also added a comment to all functions and an explanation of purpose to
most classes.

Change-Id: If3d1be3016d84c21a35093fc370c0bcf7995d1bd
diff --git a/cli_ure/CliLibrary_cli_basetypes.mk b/cli_ure/CliAssembly_cli_basetypes.mk
similarity index 63%
rename from cli_ure/CliLibrary_cli_basetypes.mk
rename to cli_ure/CliAssembly_cli_basetypes.mk
index 2d7b9373..9337870d 100644
--- a/cli_ure/CliLibrary_cli_basetypes.mk
+++ b/cli_ure/CliAssembly_cli_basetypes.mk
@@ -9,15 +9,15 @@
 
 include $(SRCDIR)/cli_ure/version/version.txt
 
-$(eval $(call gb_CliLibrary_CliLibrary,cli_basetypes))
+$(eval $(call gb_CliAssembly_CliAssembly,cli_basetypes))
 
-$(eval $(call gb_CliLibrary_set_configfile,cli_basetypes,cli_ure/source/basetypes/cli_basetypes_config))
+$(eval $(call gb_CliAssembly_set_configfile,cli_basetypes,cli_ure/source/basetypes/cli_basetypes_config))
 
-$(eval $(call gb_CliLibrary_set_keyfile,cli_basetypes,$(SRCDIR)/cli_ure/source/cliuno.snk))
+$(eval $(call gb_CliAssembly_set_keyfile,cli_basetypes,$(SRCDIR)/cli_ure/source/cliuno.snk))
 
-$(eval $(call gb_CliLibrary_set_policy,cli_basetypes,$(CLI_BASETYPES_POLICY_ASSEMBLY),$(CLI_BASETYPES_POLICY_VERSION)))
+$(eval $(call gb_CliAssembly_set_policy,cli_basetypes,$(CLI_BASETYPES_POLICY_ASSEMBLY),$(CLI_BASETYPES_POLICY_VERSION)))
 
-$(eval $(call gb_CliLibrary_add_csfiles,cli_basetypes,\
+$(eval $(call gb_CliAssembly_add_csfiles,cli_basetypes,\
     cli_ure/source/basetypes/uno/Any \
     cli_ure/source/basetypes/uno/BoundAttribute \
     cli_ure/source/basetypes/uno/ExceptionAttribute \
@@ -28,7 +28,7 @@
     cli_ure/source/basetypes/uno/TypeParametersAttribute \
 ))
 
-$(eval $(call gb_CliLibrary_add_generated_csfiles,cli_basetypes,\
+$(eval $(call gb_CliAssembly_add_generated_csfiles,cli_basetypes,\
 	CustomTarget/cli_ure/source/basetypes/assembly \
 ))
 
diff --git a/cli_ure/CliAssembly_cli_ure.mk b/cli_ure/CliAssembly_cli_ure.mk
new file mode 100644
index 0000000..973d29c
--- /dev/null
+++ b/cli_ure/CliAssembly_cli_ure.mk
@@ -0,0 +1,35 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+include $(SRCDIR)/cli_ure/version/version.txt
+
+$(eval $(call gb_CliAssembly_CliAssembly,cli_ure))
+
+$(eval $(call gb_CliAssembly_set_configfile,cli_ure,cli_ure/source/ure/cli_ure_config))
+
+$(eval $(call gb_CliAssembly_set_keyfile,cli_ure,$(SRCDIR)/cli_ure/source/cliuno.snk))
+
+$(eval $(call gb_CliAssembly_set_policy,cli_ure,$(CLI_URE_POLICY_ASSEMBLY),$(CLI_URE_POLICY_VERSION)))
+
+$(eval $(call gb_CliAssembly_use_assemblies,cli_ure,\
+	cli_uretypes \
+))
+
+$(eval $(call gb_CliAssembly_add_csfiles,cli_ure,\
+    cli_ure/source/ure/uno/util/DisposeGuard \
+    cli_ure/source/ure/uno/util/WeakAdapter \
+    cli_ure/source/ure/uno/util/WeakBase \
+    cli_ure/source/ure/uno/util/WeakComponentBase \
+))
+
+$(eval $(call gb_CliAssembly_add_generated_csfiles,cli_ure,\
+	CustomTarget/cli_ure/source/ure/assembly \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/cli_ure/CliLibrary_cli_cppuhelper.mk b/cli_ure/CliLibrary_cli_cppuhelper.mk
new file mode 100644
index 0000000..55c0247
--- /dev/null
+++ b/cli_ure/CliLibrary_cli_cppuhelper.mk
@@ -0,0 +1,48 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+include $(SRCDIR)/cli_ure/version/version.txt
+
+$(eval $(call gb_CliLibrary_CliLibrary,cli_cppuhelper))
+
+$(eval $(call gb_CliLibrary_set_configfile,cli_cppuhelper,cli_ure/source/native/cli_cppuhelper_config))
+
+$(eval $(call gb_CliLibrary_set_keyfile,cli_cppuhelper,$(SRCDIR)/cli_ure/source/cliuno.snk))
+
+$(eval $(call gb_CliLibrary_set_policy,cli_cppuhelper,$(CLI_CPPUHELPER_POLICY_ASSEMBLY),$(CLI_CPPUHELPER_POLICY_VERSION)))
+
+$(eval $(call gb_CliLibrary_use_assemblies,cli_cppuhelper,\
+	cli_ure \
+	cli_uretypes \
+))
+
+$(eval $(call gb_CliLibrary_use_packages,cli_cppuhelper,\
+	cli_ure_cliuno \
+))
+
+$(eval $(call gb_CliLibrary_use_internal_bootstrap_api,cli_cppuhelper,\
+	udkapi \
+))
+
+$(eval $(call gb_CliLibrary_use_api_libraries,cli_cppuhelper,\
+	cppu \
+	cppuhelper \
+	sal \
+))
+
+$(eval $(call gb_CliLibrary_add_exception_objects,cli_cppuhelper,\
+	cli_ure/source/native/native_bootstrap \
+	cli_ure/source/native/path \
+))
+
+$(eval $(call gb_CliLibrary_add_generated_exception_objects,cli_cppuhelper,\
+	CustomTarget/cli_ure/source/native/assembly \
+))
+
+# vim: set noet sw=4 ts=4:
diff --git a/cli_ure/CliLibrary_cli_ure.mk b/cli_ure/CliLibrary_cli_ure.mk
deleted file mode 100644
index c169d3c..0000000
--- a/cli_ure/CliLibrary_cli_ure.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-include $(SRCDIR)/cli_ure/version/version.txt
-
-$(eval $(call gb_CliLibrary_CliLibrary,cli_ure))
-
-$(eval $(call gb_CliLibrary_set_configfile,cli_ure,cli_ure/source/ure/cli_ure_config))
-
-$(eval $(call gb_CliLibrary_set_keyfile,cli_ure,$(SRCDIR)/cli_ure/source/cliuno.snk))
-
-$(eval $(call gb_CliLibrary_set_policy,cli_ure,$(CLI_URE_POLICY_ASSEMBLY),$(CLI_URE_POLICY_VERSION)))
-
-$(eval $(call gb_CliLibrary_use_assemblies,cli_ure,\
-	cli_uretypes \
-))
-
-$(eval $(call gb_CliLibrary_add_csfiles,cli_ure,\
-    cli_ure/source/ure/uno/util/DisposeGuard \
-    cli_ure/source/ure/uno/util/WeakAdapter \
-    cli_ure/source/ure/uno/util/WeakBase \
-    cli_ure/source/ure/uno/util/WeakComponentBase \
-))
-
-$(eval $(call gb_CliLibrary_add_generated_csfiles,cli_ure,\
-	CustomTarget/cli_ure/source/ure/assembly \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/cli_ure/CliNativeLibrary_cli_cppuhelper.mk b/cli_ure/CliNativeLibrary_cli_cppuhelper.mk
deleted file mode 100644
index dfc52ba..0000000
--- a/cli_ure/CliNativeLibrary_cli_cppuhelper.mk
+++ /dev/null
@@ -1,27 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-include $(SRCDIR)/cli_ure/version/version.txt
-
-$(eval $(call gb_CliNativeLibrary_CliNativeLibrary,cli_cppuhelper))
-
-$(eval $(call gb_CliNativeLibrary_wrap_library,cli_cppuhelper,cli_cppuhelper_native))
-
-$(eval $(call gb_CliNativeLibrary_set_configfile,cli_cppuhelper,cli_ure/source/native/cli_cppuhelper_config))
-
-$(eval $(call gb_CliNativeLibrary_set_keyfile,cli_cppuhelper,$(SRCDIR)/cli_ure/source/cliuno.snk))
-
-$(eval $(call gb_CliNativeLibrary_set_policy,cli_cppuhelper,$(CLI_CPPUHELPER_POLICY_ASSEMBLY),$(CLI_CPPUHELPER_POLICY_VERSION)))
-
-$(eval $(call gb_CliNativeLibrary_use_assemblies,cli_cppuhelper,\
-	cli_ure \
-	cli_uretypes \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/cli_ure/Library_cli_cppuhelper_native.mk b/cli_ure/Library_cli_cppuhelper_native.mk
deleted file mode 100644
index 72ddeb1..0000000
--- a/cli_ure/Library_cli_cppuhelper_native.mk
+++ /dev/null
@@ -1,67 +0,0 @@
-# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
-#
-# This file is part of the LibreOffice project.
-#
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-#
-
-include $(SRCDIR)/cli_ure/version/version.txt
-
-$(eval $(call gb_Library_Assembly,cli_cppuhelper_native))
-
-# When compiling for CLR, disable "warning C4339: use of undefined type detected
-# in CLR meta-data - use of this type may lead to a runtime exception":
-$(eval $(call gb_Library_add_cxxflags,cli_cppuhelper_native,\
-	-AI $(gb_Helper_OUTDIRLIBDIR) \
-	-clr \
-	-wd4339 \
-))
-
-$(eval $(call gb_Library_add_ldflags,cli_cppuhelper_native,\
-	-ignore:4248 \
-	-keyfile:$(call gb_Helper_windows_path,$(SRCDIR)/cli_ure/source/cliuno.snk) \
-))
-
-# TODO do not encode filenames here
-$(eval $(call gb_Library_add_ldflags,cli_cppuhelper_native,\
-	-delayload:cppuhelper3MSC.dll \
-	-delayload:cppu3.dll \
-	-delayload:sal3.dll \
-))
-
-$(eval $(call gb_Library_use_internal_bootstrap_api,cli_cppuhelper_native,\
-	udkapi \
-))
-
-$(eval $(call gb_Library_use_packages,cli_cppuhelper_native,\
-	cli_ure_cliuno \
-))
-
-$(eval $(call gb_Library_use_libraries,cli_cppuhelper_native,\
-	cppu \
-	cppuhelper \
-	sal \
-))
-
-$(eval $(call gb_Library_use_system_win32_libs,cli_cppuhelper_native,\
-	advapi32 \
-	delayimp \
-	mscoree \
-	$(if $(USE_DEBUG_RUNTIME)\
-		,msvcmrtd \
-		,msvcmrt \
-	) \
-))
-
-$(eval $(call gb_Library_add_exception_objects,cli_cppuhelper_native,\
-	cli_ure/source/native/native_bootstrap \
-	cli_ure/source/native/path \
-))
-
-$(eval $(call gb_Library_add_generated_exception_objects,cli_cppuhelper_native,\
-	CustomTarget/cli_ure/source/native/assembly \
-))
-
-# vim: set noet sw=4 ts=4:
diff --git a/cli_ure/Module_cli_ure.mk b/cli_ure/Module_cli_ure.mk
index 64f9bb9..d8d81ee 100644
--- a/cli_ure/Module_cli_ure.mk
+++ b/cli_ure/Module_cli_ure.mk
@@ -15,9 +15,9 @@
 
 ifeq ($(COM),MSC)
 $(eval $(call gb_Module_add_targets,cli_ure,\
-	CliLibrary_cli_basetypes \
-	CliLibrary_cli_ure \
-	CliNativeLibrary_cli_cppuhelper \
+	CliAssembly_cli_basetypes \
+	CliAssembly_cli_ure \
+	CliLibrary_cli_cppuhelper \
 	CliUnoApi_cli_uretypes \
 	CustomTarget_cli_ure_assemblies \
 	Executable_climaker \
diff --git a/solenv/gbuild/CliAssembly.mk b/solenv/gbuild/CliAssembly.mk
index f8c6fdb..ab59a5f 100644
--- a/solenv/gbuild/CliAssembly.mk
+++ b/solenv/gbuild/CliAssembly.mk
@@ -7,194 +7,232 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 #
 
-# CliConfigTarget class
+# CliCSharpTarget class
 
-gb_CliConfigTarget_TARGET := $(SOLARENV)/bin/clipatchconfig.pl
-gb_CliConfigTarget_COMMAND := $(PERL) -w $(gb_CliConfigTarget_TARGET)
+# platform defined
+#  gb_CliCSharpTarget__command
 
-gb_CliConfigTarget_VERSIONFILE_DEFAULT := $(SRCDIR)/cli_ure/version/version.txt
+gb_CliCSharpTarget__get_source = $(SRCDIR)/$(1).cs
+gb_CliCSharpTarget__get_generated_source = $(WORKDIR)/$(1).cs
 
-define gb_CliConfigTarget__command
-$(call gb_Output_announce,$(2),$(true),CPA,1)
-$(call gb_Helper_abbreviate_dirs,\
-	$(gb_CliConfigTarget_COMMAND) $(3) $(CLI_CONFIG_VERSIONFILE) $(1) \
-)
-endef
-
-$(dir $(call gb_CliConfigTarget_get_target,%))%/.dir :
+$(dir $(call gb_CliCSharpTarget_get_target,%)).dir :
 	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
 
-$(call gb_CliConfigTarget_get_target,%) :
-	$(call gb_CliConfigTarget__command,$@,$*,$<)
-
-$(call gb_CliConfigTarget_get_clean_target,%) :
-	$(call gb_Output_announce,$*,$(false),CPA,1)
-	rm -f $(call gb_CliConfigTarget_get_target,$*)
-
-# Subst. variables in a config file
-#
-# gb_CliConfigTarget_CliConfigTarget target source
-define gb_CliConfigTarget_CliConfigTarget
-$(call gb_CliConfigTarget_get_target,$(1)) : CLI_CONFIG_VERSIONFILE := $(gb_CliConfigTarget_VERSIONFILE_DEFAULT)
-
-$(call gb_CliConfigTarget_get_target,$(1)) : $(2)
-$(call gb_CliConfigTarget_get_target,$(1)) : $(gb_CliConfigTarget_TARGET)
-$(call gb_CliConfigTarget_get_target,$(1)) : $(gb_CliConfigTarget_VERSIONFILE_DEFAULT)
-$(call gb_CliConfigTarget_get_target,$(1)) :| $(dir $(call gb_CliConfigTarget_get_target,$(1))).dir
-
-endef
-
-# CliAssemblyTarget class
-
-# platform:
-#  CliAssemblyTarget_POLICYEXT
-#  CliAssemblyTarget_get_dll
-
-gb_CliAssemblyTarget_KEYFILE_DEFAULT := $(SRCDIR)/cli_ure/source/cliuno.snk
-
-define gb_CliAssemblyTarget__command
-$(call gb_Output_announce,$(2),$(true),AL ,2)
-$(call gb_Helper_abbreviate_dirs,\
-	al \
-		-nologo \
-		-out:$(CLI_ASSEMBLY_OUTFILE) \
-		-version:$(CLI_ASSEMBLY_VERSION) \
-		-keyfile:$(call gb_Helper_windows_path,$(CLI_ASSEMBLY_KEYFILE)) \
-		-link:$(CLI_ASSEMBLY_CONFIGFILE) \
-		$(if $(CLI_ASSEMBLY_PLATFORM),-platform:$(CLI_ASSEMBLY_PLATFORM)) && \
-	touch $(1) \
-)
-endef
-
-$(dir $(call gb_CliAssemblyTarget_get_target,%)).dir :
+$(dir $(call gb_CliCSharpTarget_get_target,%))%/.dir :
 	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
 
-$(dir $(call gb_CliAssemblyTarget_get_target,%))%/.dir :
-	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+$(call gb_CliCSharpTarget_get_target,%) :
+	$(call gb_CliCSharpTarget__command,$@,$*,$<,$?,$^)
 
-$(call gb_CliAssemblyTarget_get_target,%) :
-	$(if $(strip $(CLI_ASSEMBLY_VERSION)),,$(call gb_Output_error,assembly version not set))
-	$(if $(strip $(CLI_ASSEMBLY_CONFIGFILE)),,$(call gb_Output_error,assembly configuration file not set))
-	$(if $(strip $(CLI_ASSEMBLY_OUTFILE)),,$(call gb_Output_error,assembly name not set))
-	$(call gb_CliAssemblyTarget__command,$@,$*,$<)
-
-$(call gb_CliAssemblyTarget_get_assembly_target,%) :
-	touch $@
-
-.PHONY : $(call gb_CliAssemblyTarget_get_clean_target,%)
-$(call gb_CliAssemblyTarget_get_clean_target,%) :
-	$(call gb_Output_announce,$*,$(false),AL ,2)
+.PHONY : $(call gb_CliCSharpTarget_get_clean_target,%)
+$(call gb_CliCSharpTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),CSC,3)
 	$(call gb_Helper_abbreviate_dirs,\
-		rm -f $(call gb_CliAssemblyTarget_get_target,$*) $(CLI_ASSEMBLY_OUTFILE) \
+		rm -f $(call gb_CliCSharpTarget_get_target,$*) \
 	)
 
-# Create a CLI assembly
-define gb_CliAssemblyTarget_CliAssemblyTarget
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE :=
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(gb_CliAssemblyTarget_KEYFILE_DEFAULT)
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM :=
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION :=
+# Compile one or more C# source files.
+#
+# gb_CliCSharpTarget_CliCSharpTarget assembly
+define gb_CliCSharpTarget_CliCSharpTarget
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_ASSEMBLIES :=
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_SOURCES :=
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_CSCFLAGS :=
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_KEYFILE :=
 
-$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
-
-$(call gb_CliAssemblyTarget_get_target,$(1)) :| $(dir $(call gb_CliAssemblyTarget_get_target,$(1))).dir
+$(call gb_CliCSharpTarget_get_target,$(1)) :| $(dir $(call gb_CliCSharpTarget_get_target,$(1))).dir
 
 endef
 
-define gb_CliAssemblyTarget_set_configfile
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE := $(2)
-$(call gb_CliAssemblyTarget_get_target,$(1)) : $(2)
+# Use another assembly for compilation.
+#
+# gb_CliCSharpTarget_use_assembly assembly dep
+define gb_CliCSharpTarget_use_assembly
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_ASSEMBLIES += $(call gb_CliAssemblyTarget_get_dll,$(2))
+$(call gb_CliCSharpTarget_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(2))
 
 endef
 
-define gb_CliAssemblyTarget_set_keyfile
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(2)
-$(call gb_CliAssemblyTarget_get_target,$(1)) : $(2)
+# Use other assemblies for compilation.
+#
+# gb_CliCSharpTarget_use_assembly assembly dep(s)
+define gb_CliCSharpTarget_use_assemblies
+$(foreach assembly,$(2),$(call gb_CliCSharpTarget_use_assembly,$(1),$(assembly)))
 
 endef
 
-define gb_CliAssemblyTarget_set_name
-$(call gb_CliAssemblyTarget_get_target,$(1)) \
-$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : \
-	CLI_ASSEMBLY_OUTFILE := $(call gb_CliAssemblyTarget_get_assembly_target,$(2))
-$(call gb_CliAssemblyTarget_get_assembly_target,$(2)) : $(call gb_CliAssemblyTarget_get_target,$(1))
+# Add a source file to compile.
+#
+# gb_CliCSharpTarget_add_csfile assembly csfile
+define gb_CliCSharpTarget_add_csfile
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_SOURCES += $(call gb_CliCSharpTarget__get_source,$(2))
+$(call gb_CliCSharpTarget_get_target,$(1)) : $(call gb_CliCSharpTarget__get_source,$(2))
 
 endef
 
-define gb_CliAssemblyTarget_set_platform
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM := $(2)
+# Add source files to compile.
+#
+# gb_CliCSharpTarget_add_csfiles assembly csfile(s)
+define gb_CliCSharpTarget_add_csfiles
+$(foreach csfile,$(2),$(call gb_CliCSharpTarget_add_csfile,$(1),$(csfile)))
 
 endef
 
-define gb_CliAssemblyTarget_set_version
-$(call gb_CliAssemblyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION := $(2)
+# Add a generated source file to compile.
+#
+# gb_CliCSharpTarget_add_generated_csfile assembly csfile
+define gb_CliCSharpTarget_add_generated_csfile
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_SOURCES += $(call gb_CliCSharpTarget__get_generated_source,$(2))
+$(call gb_CliCSharpTarget_get_target,$(1)) : $(call gb_CliCSharpTarget__get_generated_source,$(2))
+
+endef
+
+# Add generated source files to compile.
+#
+# gb_CliCSharpTarget_add_generated_csfiles assembly csfile(s)
+define gb_CliCSharpTarget_add_generated_csfiles
+$(foreach csfile,$(2),$(call gb_CliCSharpTarget_add_generated_csfile,$(1),$(csfile)))
+
+endef
+
+# Add flags used for compilation.
+# 
+# gb_CliCSharpTarget_add_csflags assembly flags
+define gb_CliCSharpTarget_add_csflags
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_CSCFLAGS += $(2)
 
 endef
 
 # CliAssembly class
 
-gb_CliAssembly_KEYFILE_DEFAULT := $(gb_CliAssemblyTarget_KEYFILE_DEFAULT)
-gb_CliAssembly_POLICYEXT := $(gb_CliAssemblyTarget_POLICYEXT)
+# Handles creation of a CLI assembly from C# sources.
 
-gb_CliAssembly_get_dll = $(call gb_CliAssemblyTarget_get_dll,$(1))
+$(dir $(call gb_CliAssembly_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliAssembly_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
 
 $(call gb_CliAssembly_get_target,%) :
-	$(call gb_Output_announce,$*,$(true),CLA,3)
-	mkdir -p $(dir $@) && touch $@
+	touch $@
 
 .PHONY : $(call gb_CliAssembly_get_clean_target,%)
 $(call gb_CliAssembly_get_clean_target,%) :
-	$(call gb_Output_announce,$*,$(false),CLA,3)
 	rm -f $(call gb_CliAssembly_get_target,$*)
 
+# Create a CLI assembly from C# sources.
+#
+# gb_CliAssembly_CliAssembly assembly
 define gb_CliAssembly_CliAssembly
-$(call gb_CliAssemblyTarget_CliAssemblyTarget,$(1))
-$(call gb_Package_Package_internal,$(1)_assembly,$(WORKDIR))
+$(call gb_CliCSharpTarget_CliCSharpTarget,$(1))
+$(call gb_CliAssemblyTarget_CliAssemblyTarget,$(1),$(call gb_CliCSharpTarget_get_target,$(1)))
 
+$(call gb_CliAssembly_get_target,$(1)) : $(call gb_CliCSharpTarget_get_target,$(1))
 $(call gb_CliAssembly_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(1))
-$(call gb_CliAssembly_get_target,$(1)) :| $(call gb_Package_get_target,$(1)_assembly)
+$(call gb_CliAssembly_get_target,$(1)) :| $(dir $(call gb_CliAssembly_get_target,$(1))).dir
+$(call gb_CliAssembly_get_clean_target,$(1)) : $(call gb_CliCSharpTarget_get_clean_target,$(1))
 $(call gb_CliAssembly_get_clean_target,$(1)) : $(call gb_CliAssemblyTarget_get_clean_target,$(1))
-$(call gb_CliAssembly_get_clean_target,$(1)) : $(call gb_Package_get_clean_target,$(1)_assembly)
+
+$$(eval $$(call gb_Module_register_target,$(call gb_CliAssembly_get_target,$(1)),$(call gb_CliAssembly_get_clean_target,$(1))))
 
 endef
 
-define gb_CliAssembly__add_file
-$(call gb_Package_add_file,$(1)_assembly,bin/$(notdir $(2)),$(subst $(WORKDIR)/,,$(2)))
-
-endef
-
-define gb_CliAssembly__set_configfile_impl
-$(call gb_CliAssemblyTarget_set_configfile,$(1),$(2))
-$(call gb_CliAssembly__add_file,$(1),$(2))
-
-endef
-
-define gb_CliAssembly__set_configfile
-$(call gb_CliConfigTarget_CliConfigTarget,$(2),$(3))
-$(call gb_CliAssembly__set_configfile_impl,$(1),$(call gb_CliConfigTarget_get_target,$(2)))
-
-endef
-
+# Set the configuration file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliAssembly_set_configfile assembly configfile
 define gb_CliAssembly_set_configfile
-$(call gb_CliAssembly__set_configfile,$(1),$(patsubst %_config,%,$(2)),$(SRCDIR)/$(2))
+$(call gb_CliAssemblyTarget_set_configfile,$(1),$(2))
 
 endef
 
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliAssembly_set_keyfile assembly keyfile
 define gb_CliAssembly_set_keyfile
+$(call gb_CliCSharpTarget_get_target,$(1)) : CLI_KEYFILE := $(2)
 $(call gb_CliAssemblyTarget_set_keyfile,$(1),$(2))
 
 endef
 
-define gb_CliAssembly_set_platform
-$(call gb_CliAssemblyTarget_set_platform,$(1),$(2))
+# Set the policy file for the assembly.
+#
+# The file is given by complete path.
+#
+# gb_CliAssembly_set_policy assembly policyfile version
+define gb_CliAssembly_set_policy
+$(call gb_CliAssemblyTarget_set_policy,$(1),$(2),$(3))
 
 endef
 
-define gb_CliAssembly_set_policy
-$(call gb_CliAssemblyTarget_set_version,$(1),$(3))
-$(call gb_CliAssemblyTarget_set_name,$(1),$(2))
-$(call gb_CliAssembly__add_file,$(1),$(call gb_CliAssemblyTarget_get_assembly_target,$(2)))
+# Use another assembly for compilation.
+#
+# gb_CliAssembly_use_assembly assembly dep
+define gb_CliAssembly_use_assembly
+$(call gb_CliCSharpTarget_use_assembly,$(1),$(2))
+
+endef
+
+# Use other assemblies for compilation.
+#
+# gb_CliAssembly_use_assemblies assembly dep(s)
+define gb_CliAssembly_use_assemblies
+$(call gb_CliCSharpTarget_use_assemblies,$(1),$(2))
+
+endef
+
+# Add a C# source file to compile.
+#
+# The file is specified without extension and with path relative to
+# $(SRCDIR).
+#
+# gb_CliAssembly_add_csfile assembly csfile
+define gb_CliAssembly_add_csfile
+$(call gb_CliCSharpTarget_add_csfile,$(1),$(2))
+
+endef
+
+# Add C# source file(s) to compile.
+#
+# The files are specified without extension and with path relative to
+# $(SRCDIR).
+#
+# gb_CliAssembly_add_csfiles assembly csfile(s)
+define gb_CliAssembly_add_csfiles
+$(call gb_CliCSharpTarget_add_csfiles,$(1),$(2))
+
+endef
+
+# Add a generated C# source file to compile.
+#
+# The file is specified without extension and with path relative to
+# $(WORKDIR).
+#
+# gb_CliAssembly_add_generated_csfile assembly csfile
+define gb_CliAssembly_add_generated_csfile
+$(call gb_CliCSharpTarget_add_generated_csfile,$(1),$(2))
+
+endef
+
+# Add generated C# source files to compile
+#
+# The files are specified without extension and with path relative to
+# $(WORKDIR).
+#
+# gb_CliAssembly_add_generated_csfiles assembly csfile(s)
+define gb_CliAssembly_add_generated_csfiles
+$(call gb_CliCSharpTarget_add_generated_csfiles,$(1),$(2))
+
+endef
+
+# Add flags used for compilation.
+#
+# gb_CliAssembly_add_csflags assembly flags
+define gb_CliAssembly_add_csflags
+$(call gb_CliCSharpTarget_add_csflags,$(1),$(2))
 
 endef
 
diff --git a/solenv/gbuild/CliAssemblyTarget.mk b/solenv/gbuild/CliAssemblyTarget.mk
new file mode 100644
index 0000000..639e0ca
--- /dev/null
+++ b/solenv/gbuild/CliAssemblyTarget.mk
@@ -0,0 +1,269 @@
+# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*-
+#
+# This file is part of the LibreOffice project.
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+#
+
+# CliConfigTarget class
+
+# Substitutes variables in an assembly configuration file.
+
+gb_CliConfigTarget_TARGET := $(SOLARENV)/bin/clipatchconfig.pl
+gb_CliConfigTarget_COMMAND := $(PERL) -w $(gb_CliConfigTarget_TARGET)
+
+gb_CliConfigTarget_VERSIONFILE_DEFAULT := $(SRCDIR)/cli_ure/version/version.txt
+
+define gb_CliConfigTarget__command
+$(call gb_Output_announce,$(2),$(true),CPA,1)
+$(call gb_Helper_abbreviate_dirs,\
+	$(gb_CliConfigTarget_COMMAND) $(3) $(CLI_CONFIG_VERSIONFILE) $(1) \
+)
+endef
+
+$(dir $(call gb_CliConfigTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliConfigTarget_get_target,%) :
+	$(call gb_CliConfigTarget__command,$@,$*,$<)
+
+$(call gb_CliConfigTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),CPA,1)
+	rm -f $(call gb_CliConfigTarget_get_target,$*)
+
+# Subst. variables in a config file
+#
+# gb_CliConfigTarget_CliConfigTarget target source
+define gb_CliConfigTarget_CliConfigTarget
+$(call gb_CliConfigTarget_get_target,$(1)) : CLI_CONFIG_VERSIONFILE := $(gb_CliConfigTarget_VERSIONFILE_DEFAULT)
+
+$(call gb_CliConfigTarget_get_target,$(1)) : $(2)
+$(call gb_CliConfigTarget_get_target,$(1)) : $(gb_CliConfigTarget_TARGET)
+$(call gb_CliConfigTarget_get_target,$(1)) : $(gb_CliConfigTarget_VERSIONFILE_DEFAULT)
+$(call gb_CliConfigTarget_get_target,$(1)) :| $(dir $(call gb_CliConfigTarget_get_target,$(1))).dir
+
+endef
+
+# CliPolicyTarget class
+
+# Creates an associated policy dll for an assembly.
+
+gb_CliPolicyTarget_KEYFILE_DEFAULT := $(SRCDIR)/cli_ure/source/cliuno.snk
+
+$(dir $(call gb_CliPolicyTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliPolicyTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliPolicyTarget_get_target,%) :
+	$(if $(strip $(CLI_ASSEMBLY_VERSION)),,$(call gb_Output_error,assembly version not set))
+	$(if $(strip $(CLI_ASSEMBLY_CONFIGFILE)),,$(call gb_Output_error,assembly configuration file not set))
+	$(if $(strip $(CLI_ASSEMBLY_OUTFILE)),,$(call gb_Output_error,assembly name not set))
+	$(call gb_CliPolicyTarget__command,$@,$*,$<)
+
+$(call gb_CliPolicyTarget_get_assembly_target,%) :
+	touch $@
+
+.PHONY : $(call gb_CliPolicyTarget_get_clean_target,%)
+$(call gb_CliPolicyTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),AL ,2)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f $(call gb_CliPolicyTarget_get_target,$*) $(CLI_ASSEMBLY_OUTFILE) \
+	)
+
+# Create a policy dll.
+#
+# gb_CliPolicyTarget_CliPolicyTarget assembly
+define gb_CliPolicyTarget_CliPolicyTarget
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE :=
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(gb_CliPolicyTarget_KEYFILE_DEFAULT)
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM :=
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION :=
+
+$(call gb_CliPolicyTarget_get_clean_target,$(1)) : CLI_ASSEMBLY_OUTFILE :=
+
+$(call gb_CliPolicyTarget_get_target,$(1)) :| $(dir $(call gb_CliPolicyTarget_get_target,$(1))).dir
+
+endef
+
+# Get the assembly dll.
+#
+# gb_CliAssemblyTarget_get_dll assembly
+gb_CliAssemblyTarget_get_dll = $(call gb_CliAssemblyTarget_get_outdir_target,$(1)).dll
+
+# Set the configuration file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliPolicyTarget_set_configfile assembly configfile
+define gb_CliPolicyTarget_set_configfile
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_CONFIGFILE := $(2)
+$(call gb_CliPolicyTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliPolicyTarget_set_keyfile assembly keyfile
+define gb_CliPolicyTarget_set_keyfile
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_KEYFILE := $(2)
+$(call gb_CliPolicyTarget_get_target,$(1)) : $(2)
+
+endef
+
+# Set the name of the created policy dll.
+#
+# gb_CliPolicyTarget_set_name assembly policy
+define gb_CliPolicyTarget_set_name
+$(call gb_CliPolicyTarget_get_target,$(1)) \
+$(call gb_CliPolicyTarget_get_clean_target,$(1)) : \
+	CLI_ASSEMBLY_OUTFILE := $(call gb_CliPolicyTarget_get_assembly_target,$(2))
+$(call gb_CliPolicyTarget_get_assembly_target,$(2)) : $(call gb_CliPolicyTarget_get_target,$(1))
+
+endef
+
+# Set the platform of the assembly.
+#
+# Only applicable for C++ assemblies (CliLibrary).
+#
+# gb_CliPolicyTarget_set_platform assembly platform
+define gb_CliPolicyTarget_set_platform
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_PLATFORM := $(2)
+
+endef
+
+# Set the version of the assembly.
+#
+# gb_CliPolicyTarget_set_version assembly version
+define gb_CliPolicyTarget_set_version
+$(call gb_CliPolicyTarget_get_target,$(1)) : CLI_ASSEMBLY_VERSION := $(2)
+
+endef
+
+# CliAssemblyTarget class
+
+# Handles creation and delivery of signed multi-file CLI assembly.
+#
+# This class groups common parts of the process of creation and delivery
+# of a signed assembly. It does not specify how to create the "core" dll
+# (which must be supplied externally). This is because there are various
+# ways how to create the assembly, so they are handled by separate
+# classes (CliAssembly, CliLibrary, CliUnoApi).
+#
+# The delivered files are
+# * the assembly itself (.dll)
+# * the associated policy (.dll)
+# * the associated configuration file (.config)
+
+gb_CliAssemblyTarget_KEYFILE_DEFAULT := $(gb_CliPolicyTarget_KEYFILE_DEFAULT)
+
+$(dir $(call gb_CliAssemblyTarget_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliAssemblyTarget_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliAssemblyTarget_get_target,%) :
+	$(call gb_Output_announce,$*,$(true),CLI,5)
+	$(call gb_Helper_abbreviate_dirs,\
+		touch $@ \
+	)
+
+.PHONY : $(call gb_CliAssemblyTarget_get_clean_target,%)
+$(call gb_CliAssemblyTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),CLI,5)
+	$(call gb_Helper_abbreviate_dirs,\
+		rm -f $(CLI_ASSEMBLY_OUTFILES) $(call gb_CliAssemblyTarget_get_target,$*) \
+	)
+
+# Define an assembly.
+#
+# gb_CliAssemblyTarget_CliAssemblyTarget assembly dll
+define gb_CliAssemblyTarget_CliAssemblyTarget
+$(call gb_CliPolicyTarget_CliPolicyTarget,$(1))
+
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : CLI_ASSEMBLY_OUTFILES :=
+
+$(call gb_CliAssemblyTarget_get_target,$(1)) : $(call gb_CliPolicyTarget_get_target,$(1))
+$(call gb_CliAssemblyTarget_get_target,$(1)) :| $(dir (call gb_CliAssemblyTarget_get_target,$(1))).dir
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : $(call gb_CliPolicyTarget_get_clean_target,$(1))
+
+$(call gb_CliAssemblyTarget__add_file,$(1),$(2))
+
+endef
+
+define gb_CliAssemblyTarget__add_file_impl
+$(call gb_Deliver_add_deliverable,$(2),$(3),$(1))
+
+$(call gb_CliAssemblyTarget_get_clean_target,$(1)) : CLI_ASSEMBLY_OUTFILES += $(2)
+$(call gb_CliAssemblyTarget_get_target,$(1)) : $(2)
+$(2) : $(3)
+
+endef
+
+define gb_CliAssemblyTarget__add_file
+$(call gb_CliAssemblyTarget__add_file_impl,$(1),$(call gb_CliAssemblyTarget_get_outdir_target,$(notdir $(2))),$(2))
+
+endef
+
+define gb_CliAssemblyTarget__set_configfile_impl
+$(call gb_CliPolicyTarget_set_configfile,$(1),$(2))
+$(call gb_CliAssemblyTarget__add_file,$(1),$(2))
+
+endef
+
+define gb_CliAssemblyTarget__set_configfile
+$(call gb_CliConfigTarget_CliConfigTarget,$(2),$(3))
+$(call gb_CliAssemblyTarget__set_configfile_impl,$(1),$(call gb_CliConfigTarget_get_target,$(2)))
+
+endef
+
+# Set the configuration file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliAssemblyTarget_set_configfile assembly configfile
+define gb_CliAssemblyTarget_set_configfile
+$(call gb_CliAssemblyTarget__set_configfile,$(1),$(patsubst %_config,%,$(2)),$(SRCDIR)/$(2))
+
+endef
+
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliAssemblyTarget_set_keyfile assembly keyfile
+define gb_CliAssemblyTarget_set_keyfile
+$(call gb_CliPolicyTarget_set_keyfile,$(1),$(2))
+
+endef
+
+# Set the platform of the assembly.
+#
+# Only applicable for C++ assemblies (CliLibrary).
+#
+# gb_CliAssemblyTarget_set_platform assembly platform
+define gb_CliAssemblyTarget_set_platform
+$(call gb_CliPolicyTarget_set_platform,$(1),$(2))
+
+endef
+
+# Set the policy file for the assembly.
+#
+# The file is given by complete path.
+#
+# gb_CliAssemblyTarget_set_policy assembly policyfile version
+define gb_CliAssemblyTarget_set_policy
+$(call gb_CliPolicyTarget_set_version,$(1),$(3))
+$(call gb_CliPolicyTarget_set_name,$(1),$(2))
+$(call gb_CliAssemblyTarget__add_file,$(1),$(call gb_CliPolicyTarget_get_assembly_target,$(2)))
+
+endef
+
+# vim: set noet sw=4 ts=4:
diff --git a/solenv/gbuild/CliLibrary.mk b/solenv/gbuild/CliLibrary.mk
index 6b3a4ef..ef56488 100644
--- a/solenv/gbuild/CliLibrary.mk
+++ b/solenv/gbuild/CliLibrary.mk
@@ -7,196 +7,236 @@
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 #
 
-# CliLibraryTarget class
+# CliSignTarget class
 
-gb_CliLibraryTarget_EXT := $(gb_CliAssembly_POLICYEXT)
-
-gb_CliLibraryTarget_CSCFLAGS := \
-	-noconfig \
-	-nologo \
-
-gb_CliLibraryTarget_CSCFLAGS_DEBUG := \
-	-checked+ \
-	-define:DEBUG \
-	-define:TRACE \
-
-ifeq ($(strip $(debug)),)
-ifeq ($(strip $(PRODUCT)),)
-gb_CliLibraryTarget__get_csflags = $(gb_CliLibraryTarget_CSCFLAGS) $(gb_CliLibraryTarget_CSCFLAGS_DEBUG)
-else
-gb_CliLibraryTarget__get_csflags = $(gb_CliLibraryTarget_CSCFLAGS) -o
-endif
-else
-gb_CliLibraryTarget__get_csflags = $(gb_CliLibraryTarget_CSCFLAGS) $(gb_CliLibraryTarget_CSCFLAGS_DEBUG) -debug+
-endif
-
-gb_CliLibraryTarget__get_source = $(SRCDIR)/$(1).cs
-gb_CliLibraryTarget__get_generated_source = $(WORKDIR)/$(1).cs
-
-define gb_CliLibraryTarget__command
-$(call gb_Output_announce,$(2),$(true),CSC,3)
+define gb_CliSignTarget__command
+$(call gb_Output_announce,$(1),$(true),SN ,4)
 $(call gb_Helper_abbreviate_dirs,\
-	csc $(call gb_Helper_windows_path, \
-		$(call gb_CliLibraryTarget__get_csflags) \
-		$(CLI_CSCFLAGS) \
-		-target:library \
-		-out:$(1) \
-		-keyfile:$(call gb_Helper_windows_path,$(CLI_KEYFILE)) \
-		-reference:System.dll \
-		$(foreach assembly,$(CLI_ASSEMBLIES),-reference:$(assembly)) \
-		$(CLI_SOURCES) \
-	) \
+	$(GNUCOPY) $(CLI_SIGN_LIBRARY) $(1).tmp && \
+	sn -R $(1).tmp $(CLI_SIGN_KEYFILE) && \
+	mv $(1).tmp $(1) \
 )
 endef
 
-$(dir $(call gb_CliLibraryTarget_get_target,%)).dir :
+$(dir $(call gb_CliSignTarget_get_target,%)).dir :
 	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
 
-$(dir $(call gb_CliLibraryTarget_get_target,%))%/.dir :
+$(dir $(call gb_CliSignTarget_get_target,%))%/.dir :
 	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
 
-$(call gb_CliLibraryTarget_get_target,%) :
-	$(call gb_CliLibraryTarget__command,$@,$*,$<,$?,$^)
+$(call gb_CliSignTarget_get_target,%) :
+	$(call gb_CliSignTarget__command,$@,$*,$<)
 
-.PHONY : $(call gb_CliLibraryTarget_get_clean_target,%)
-$(call gb_CliLibraryTarget_get_clean_target,%) :
-	$(call gb_Output_announce,$*,$(false),CSC,3)
+$(call gb_CliSignTarget_get_external_target,%) :
+	touch $@
+
+.PHONY : $(call gb_CliSignTarget_get_clean_target,%)
+$(call gb_CliSignTarget_get_clean_target,%) :
+	$(call gb_Output_announce,$*,$(false),SN ,4)
 	$(call gb_Helper_abbreviate_dirs,\
-		rm -f $(call gb_CliLibraryTarget_get_target,$*) \
+		rm -rf $(call gb_CliSignTarget_get_target,$*) \
+			 $(call gb_CliSignTarget_get_external_target,$*) \
 	)
 
-# Compiles one or more C# source files
+# Sign a native assembly.
 #
-# gb_CliLibraryTarget_CliLibraryTarget target
-define gb_CliLibraryTarget_CliLibraryTarget
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_ASSEMBLIES :=
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_SOURCES :=
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_CSCFLAGS :=
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_KEYFILE :=
+# gb_CliSignTarget_CliSignTarget assembly
+define gb_CliSignTarget_CliSignTarget
+$(call gb_CliSignTarget_get_target,$(1)) : CLI_SIGN_KEYFILE :=
+$(call gb_CliSignTarget_get_target,$(1)) : CLI_SIGN_LIBRARY := $(2)
 
-$(call gb_CliLibraryTarget_get_target,$(1)) :| $(dir $(call gb_CliLibraryTarget_get_target,$(1))).dir
+$(call gb_CliSignTarget_get_external_target,$(1)) :| $(dir $(call gb_CliSignTarget_get_target,$(1))).dir
+$(call gb_CliSignTarget_get_target,$(1)) :| $(dir $(call gb_CliSignTarget_get_target,$(1))).dir
 
 endef
 
-define gb_CliLibraryTarget_use_assembly
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_ASSEMBLIES += $(call gb_CliLibrary_get_target,$(2))
-$(call gb_CliLibraryTarget_get_target,$(1)) : $(call gb_CliLibrary_get_target,$(2))
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliSignTarget_set_keyfile assembly keyfile
+define gb_CliSignTarget_set_keyfile
+$(call gb_CliSignTarget_get_target,$(1)) : CLI_SIGN_KEYFILE := $(2)
+$(call gb_CliSignTarget_get_target,$(1)) : $(2)
 
 endef
 
-define gb_CliLibraryTarget_use_assemblies
-$(foreach assembly,$(2),$(call gb_CliLibraryTarget_use_assembly,$(1),$(assembly)))
+# Use another assembly for compilation.
+#
+# gb_CliSignTarget_use_assembly assembly dep
+define gb_CliSignTarget_use_assembly
+$(call gb_CliSignTarget_get_external_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(2))
 
 endef
 
-# Add a source file to compile
-define gb_CliLibraryTarget_add_csfile
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_SOURCES += $(call gb_CliLibraryTarget__get_source,$(2))
-$(call gb_CliLibraryTarget_get_target,$(1)) : $(call gb_CliLibraryTarget__get_source,$(2))
-
-endef
-
-# Add source files to compile
-define gb_CliLibraryTarget_add_csfiles
-$(foreach csfile,$(2),$(call gb_CliLibraryTarget_add_csfile,$(1),$(csfile)))
-
-endef
-
-# Add a generated source file to compile
-define gb_CliLibraryTarget_add_generated_csfile
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_SOURCES += $(call gb_CliLibraryTarget__get_generated_source,$(2))
-$(call gb_CliLibraryTarget_get_target,$(1)) : $(call gb_CliLibraryTarget__get_generated_source,$(2))
-
-endef
-
-# Add generated source files to compile
-define gb_CliLibraryTarget_add_generated_csfiles
-$(foreach csfile,$(2),$(call gb_CliLibraryTarget_add_generated_csfile,$(1),$(csfile)))
-
-endef
-
-# Add flags used for compilation
-define gb_CliLibraryTarget_add_csflags
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_CSCFLAGS += $(2)
+# Use other assemblies for compilation.
+#
+# gb_CliSignTarget_use_assemblies assembly dep(s)
+define gb_CliSignTarget_use_assemblies
+$(foreach assembly,$(2),$(call gb_CliSignTarget_use_assembly,$(1),$(assembly)))
 
 endef
 
 # CliLibrary class
 
-gb_CliLibrary_EXT := $(gb_CliLibraryTarget_EXT)
+# Handles creation of a CLI assembly from C++ sources.
 
-# Compiles one or more C# source files
+# platform defined
+#  gb_CliLibrary_LIBS
+#  gb_CliLibrary_CliLibrary_platform
+#  gb_CliLibrary_get_dll
+#  gb_CliLibrary_add_delayload_dll
+#  gb_CliLibrary_set_link_keyfile
+
+gb_CliLibrary_PLATFORM_DEFAULT := x86
+
+$(dir $(call gb_CliLibrary_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliLibrary_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliLibrary_get_target,%) :
+	touch $@
+
+.PHONY : $(call gb_CliLibrary_get_clean_target,%)
+$(call gb_CliLibrary_get_clean_target,%) :
+	rm -f $(call gb_CliLibrary_get_target,$*)
+
+gb_CliLibrary_get_linktargetname = CliLibrary/$(1)
+
+# Create a CLI assembly from C++ sources.
 #
-# gb_CliLibrary_CliLibrary target
+# gb_CliLibrary assembly
 define gb_CliLibrary_CliLibrary
-$(call gb_CliLibraryTarget_CliLibraryTarget,$(1))
-$(call gb_CliAssembly_CliAssembly,$(1))
+$(call gb_CliLibrary__CliLibrary_impl,$(1),$(call gb_CliLibrary_get_linktargetname,$(1)))
 
-$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliLibraryTarget_get_target,$(1))
-$(call gb_CliLibrary_get_target,$(1)) :| $(call gb_CliAssembly_get_target,$(1))
+endef
+
+define gb_CliLibrary__CliLibrary_impl
+$(call gb_LinkTarget_LinkTarget,$(2),CliLibrary_$(1))
+$(call gb_CliSignTarget_CliSignTarget,$(1),$(call gb_CliLibrary_get_dll,$(1)))
+$(call gb_CliAssemblyTarget_CliAssemblyTarget,$(1),$(call gb_CliSignTarget_get_target,$(1)))
+
+$(call gb_LinkTarget_set_targettype,$(2),CliLibrary)
+$(call gb_LinkTarget_add_defs,$(2),gb_CliLibrary_DEFS)
+$(call gb_LinkTarget_add_libs,$(2),gb_CliLibrary_LIBS)
+
+$(call gb_CliLibrary_CliLibrary_platform,$(1),$(2),$(call gb_CliLibrary_get_dll,$(1)))
+
+$(call gb_CliSignTarget_set_keyfile,$(1),$(gb_CliAssemblyTarget_KEYFILE_DEFAULT))
+$(call gb_CliAssemblyTarget_set_platform,$(1),$(gb_CliLibrary_PLATFORM_DEFAULT))
+
+$(call gb_CliSignTarget_get_target,$(1)) : $(call gb_LinkTarget_get_target,$(2))
+$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliSignTarget_get_target,$(1))
+$(call gb_CliLibrary_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(1))
 $(call gb_CliLibrary_get_target,$(1)) :| $(dir $(call gb_CliLibrary_get_target,$(1))).dir
-$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_CliLibraryTarget_get_clean_target,$(1))
-$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_CliAssembly_get_clean_target,$(1))
 
-$(call gb_Deliver_add_deliverable,$(call gb_CliLibrary_get_target,$(1)),$(call gb_CliLibraryTarget_get_target,$(1)),$(1))
+$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_LinkTarget_get_clean_target,$(1))
+$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_CliSignTarget_get_clean_target,$(1))
+$(call gb_CliLibrary_get_clean_target,$(1)) : $(call gb_CliAssemblyTarget_get_clean_target,$(1))
 
 $$(eval $$(call gb_Module_register_target,$(call gb_CliLibrary_get_target,$(1)),$(call gb_CliLibrary_get_clean_target,$(1))))
 
 endef
 
+# Set the configuration file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliLibrary_set_configfile assembly configfile
 define gb_CliLibrary_set_configfile
-$(call gb_CliAssembly_set_configfile,$(1),$(2))
+$(call gb_CliAssemblyTarget_set_configfile,$(1),$(2))
 
 endef
 
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliLibrary_set_keyfile assembly keyfile
 define gb_CliLibrary_set_keyfile
-$(call gb_CliLibraryTarget_get_target,$(1)) : CLI_KEYFILE := $(2)
-$(call gb_CliAssembly_set_keyfile,$(1),$(2))
+$(call gb_CliSignTarget_set_keyfile,$(1),$(2))
+$(call gb_CliAssemblyTarget_set_keyfile,$(1),$(2))
+$(call gb_CliLibrary_set_link_keyfile,$(1),$(2))
 
 endef
 
+# Set the platform of the assembly.
+# TODO is this really needed?
+#
+# gb_CliLibrary_set_platform assembly platform
+define gb_CliLibrary_set_platform
+$(call gb_CliAssemblyTarget_set_platform,$(1),$(2))
+
+endef
+
+# Set the policy file for the assembly.
+#
+# The file is given by complete path.
+#
+# gb_CliLibrary_set_policy assembly policyfile version
 define gb_CliLibrary_set_policy
-$(call gb_CliAssembly_set_policy,$(1),$(2),$(3))
+$(call gb_CliAssemblyTarget_set_policy,$(1),$(2),$(3))
 
 endef
 
+# Use another assembly for compilation.
+#
+# gb_CliLibrary_use_assembly assembly dep
 define gb_CliLibrary_use_assembly
-$(call gb_CliLibraryTarget_use_assembly,$(1),$(2))
+$(call gb_CliSignTarget_use_assembly,$(1),$(2))
 
 endef
 
+# Use other assemblies for compilation.
+#
+# gb_CliLibrary_use_assemblies assembly dep(s)
 define gb_CliLibrary_use_assemblies
-$(call gb_CliLibraryTarget_use_assemblies,$(1),$(2))
+$(call gb_CliSignTarget_use_assemblies,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
 
 endef
 
-# Add a source file to compile
-define gb_CliLibrary_add_csfile
-$(call gb_CliLibraryTarget_add_csfile,$(1),$(2))
+# Use a public UNO API library.
+#
+# E.g., cppu, sal.
+#
+# gb_CliLibrary_use_api_library assembly library
+define gb_CliLibrary_use_api_library
+$(call gb_LinkTarget_use_library,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
+$(call gb_CliLibrary_add_delayload_dll,$(1),$(2))
 
 endef
 
-# Add source files to compile
-define gb_CliLibrary_add_csfiles
-$(call gb_CliLibraryTarget_add_csfiles,$(1),$(2))
+# Use public UNO API libraries.
+#
+# E.g., cppu, sal.
+#
+# gb_CliLibrary_use_api_libraries assembly library
+define gb_CliLibrary_use_api_libraries
+$(foreach library,$(2),$(call gb_CliLibrary_use_api_library,$(1),$(library)))
 
 endef
 
-# Add a generated source file to compile
-define gb_CliLibrary_add_generated_csfile
-$(call gb_CliLibraryTarget_add_generated_csfile,$(1),$(2))
+# straight forwards to LinkTarget
+
+define gb_CliLibrary_use_internal_bootstrap_api
+$(call gb_Library_use_internal_bootstrap_api,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
 
 endef
 
-# Add generated source files to compile
-define gb_CliLibrary_add_generated_csfiles
-$(call gb_CliLibraryTarget_add_generated_csfiles,$(1),$(2))
+define gb_CliLibrary_use_packages
+$(call gb_Library_use_packages,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
 
 endef
 
-# Add flags used for compilation
-define gb_CliLibrary_add_csflags
-$(call gb_CliLibraryTarget_add_csflags,$(1),$(2))
+define gb_CliLibrary_add_exception_objects
+$(call gb_Library_add_exception_objects,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
+
+endef
+
+define gb_CliLibrary_add_generated_exception_objects
+$(call gb_Library_add_generated_exception_objects,$(call gb_CliLibrary_get_linktargetname,$(1)),$(2))
 
 endef
 
diff --git a/solenv/gbuild/CliNativeLibrary.mk b/solenv/gbuild/CliNativeLibrary.mk
index f5c1249..4dd0d66 100644
--- a/solenv/gbuild/CliNativeLibrary.mk
+++ b/solenv/gbuild/CliNativeLibrary.mk
@@ -42,6 +42,7 @@
 			 $(call gb_CliNativeLibraryTarget_get_external_target,$*) \
 	)
 
+# gb_CliNativeLibraryTarget_CliNativeLibraryTarget target lib
 define gb_CliNativeLibraryTarget_CliNativeLibraryTarget
 $(call gb_CliNativeLibraryTarget_get_target,$(1)) : CLI_NATIVE_ASSEMBLIES := $(gb_Helper_MISCDUMMY)
 $(call gb_CliNativeLibraryTarget_get_target,$(1)) : CLI_NATIVE_KEYFILE :=
@@ -81,11 +82,14 @@
 gb_CliNativeLibrary_PLATFORM_DEFAULT := x86
 gb_CliNativeLibrary_EXT := $(gb_CliNativeLibraryTarget_EXT)
 
+gb_CliNativeLibrary_get_linktargetname = CliNativeLibrary/$(1)
+
 # Create a CLI library for a native library
 #
 # CliNativeLibrary target
 define gb_CliNativeLibrary_CliNativeLibrary
-$(call gb_CliNativeLibraryTarget_CliNativeLibraryTarget,$(1))
+$(call gb_LinkTarget_LinkTarget,$(call gb_CliNativeLibrary_get_linktargetname,$(1)))
+$(call gb_CliNativeLibraryTarget_CliNativeLibraryTarget,$(1),$(call gb_LinkTarget_get_target,$(call gb_CliNativeLibrary_get_linktargetname,$(1))))
 $(call gb_CliAssembly_CliAssembly,$(1))
 
 $(call gb_CliNativeLibraryTarget_set_keyfile,$(1),$(gb_CliAssembly_KEYFILE_DEFAULT))
diff --git a/solenv/gbuild/CliUnoApi.mk b/solenv/gbuild/CliUnoApi.mk
index f0a2735..2d84ecb 100644
--- a/solenv/gbuild/CliUnoApi.mk
+++ b/solenv/gbuild/CliUnoApi.mk
@@ -9,7 +9,7 @@
 
 # CliUnoApiTarget class
 
-gb_CliUnoApiTarget_EXT := $(gb_CliAssembly_POLICYEXT)
+# Handles creation of a CLI assembly from UNO types.rdb.
 
 gb_CliUnoApiTarget_TARGET := $(call gb_Executable_get_target_for_build,climaker)
 gb_CliUnoApiTarget_COMMAND := $(gb_Helper_set_ld_path) $(gb_CliUnoApiTarget_TARGET)
@@ -91,8 +91,8 @@
 endef
 
 define gb_CliUnoApiTarget_use_assembly
-$(call gb_CliUnoApiTarget_get_target,$(1)) : CLI_UNOAPI_ASSEMBLIES += $(call gb_CliUnoApi_get_target,$(2))
-$(call gb_CliUnoApiTarget_get_target,$(1)) : $(call gb_CliUnoApi_get_target,$(2))
+$(call gb_CliUnoApiTarget_get_target,$(1)) : CLI_UNOAPI_ASSEMBLIES += $(call gb_CliAssemblyTarget_get_dll,$(2))
+$(call gb_CliUnoApiTarget_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(2))
 
 endef
 
@@ -103,38 +103,60 @@
 
 # CliUnoApi class
 
-gb_CliUnoApi_EXT := $(gb_CliUnoApiTarget_EXT)
-gb_CliUnoApi_KEYFILE_DEFAULT := $(gb_CliAssembly_KEYFILE_DEFAULT)
+# Handles creation and delivery of a CLI assembly from UNO types.rdb.
 
-# Create a CLI library for UNO API
+gb_CliUnoApi_KEYFILE_DEFAULT := $(gb_CliAssemblyTarget_KEYFILE_DEFAULT)
+
+$(dir $(call gb_CliUnoApi_get_target,%)).dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(dir $(call gb_CliUnoApi_get_target,%))%/.dir :
+	$(if $(wildcard $(dir $@)),,mkdir -p $(dir $@))
+
+$(call gb_CliUnoApi_get_target,%) :
+	touch $@
+
+.PHONY : $(call gb_CliUnoApi_get_clean_target,%)
+$(call gb_CliUnoApi_get_clean_target,%) :
+	rm -f $(call gb_CliUnoApi_get_target,$*)
+
+# Create a CLI library for UNO API.
 #
 # gb_CliUnoApi_CliUnoApi target
 define gb_CliUnoApi_CliUnoApi
 $(call gb_CliUnoApiTarget_CliUnoApiTarget,$(1))
-$(call gb_CliAssembly_CliAssembly,$(1))
+$(call gb_CliAssemblyTarget_CliAssemblyTarget,$(1),$(call gb_CliUnoApiTarget_get_target,$(1)))
 
 $(call gb_CliUnoApiTarget_set_keyfile,$(1),$(gb_CliUnoApi_KEYFILE_DEFAULT))
 
 $(call gb_CliUnoApi_get_target,$(1)) : $(call gb_CliUnoApiTarget_get_target,$(1))
-$(call gb_CliUnoApi_get_target,$(1)) :| $(call gb_CliAssembly_get_target,$(1))
+$(call gb_CliUnoApi_get_target,$(1)) : $(call gb_CliAssemblyTarget_get_target,$(1))
 $(call gb_CliUnoApi_get_target,$(1)) :| $(dir $(call gb_CliUnoApi_get_target,$(1))).dir
 $(call gb_CliUnoApi_get_clean_target,$(1)) : $(call gb_CliUnoApiTarget_get_clean_target,$(1))
-$(call gb_CliUnoApi_get_clean_target,$(1)) : $(call gb_CliAssembly_get_clean_target,$(1))
-
-$(call gb_Deliver_add_deliverable,$(call gb_CliUnoApi_get_target,$(1)),$(call gb_CliUnoApiTarget_get_target,$(1)),$(1))
+$(call gb_CliUnoApi_get_clean_target,$(1)) : $(call gb_CliAssemblyTarget_get_clean_target,$(1))
 
 $$(eval $$(call gb_Module_register_target,$(call gb_CliUnoApiTarget_get_target,$(1)),$(call gb_CliUnoApiTarget_get_clean_target,$(1))))
 
 endef
 
+# Set the configuration file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliUnoApi_set_configfile assembly configfile
 define gb_CliUnoApi_set_configfile
-$(call gb_CliAssembly_set_configfile,$(1),$(2))
+$(call gb_CliAssemblyTarget_set_configfile,$(1),$(2))
 
 endef
 
+# Set the sign key file for the assembly.
+#
+# The file is given by complete path.
+# 
+# gb_CliUnoApi_set_keyfile assembly keyfile
 define gb_CliUnoApi_set_keyfile
 $(call gb_CliUnoApiTarget_set_keyfile,$(1),$(2))
-$(call gb_CliAssembly_set_keyfile,$(1),$(2))
+$(call gb_CliAssemblyTarget_set_keyfile,$(1),$(2))
 
 endef
 
@@ -143,8 +165,13 @@
 
 endef
 
+# Set the policy file for the assembly.
+#
+# The file is given by complete path.
+#
+# gb_CliUnoApiTarget_set_policy assembly policyfile version
 define gb_CliUnoApi_set_policy
-$(call gb_CliAssembly_set_policy,$(1),$(2),$(3))
+$(call gb_CliAssemblyTarget_set_policy,$(1),$(2),$(3))
 
 endef
 
@@ -158,11 +185,17 @@
 
 endef
 
+# Use another assembly for compilation.
+#
+# gb_CliUnoApi_use_assembly assembly dep
 define gb_CliUnoApi_use_assembly
 $(call gb_CliUnoApiTarget_use_assembly,$(1),$(2))
 
 endef
 
+# Use other assemblies for compilation.
+#
+# gb_CliUnoApi_use_assemblies assembly dep(s)
 define gb_CliUnoApi_use_assemblies
 $(call gb_CliUnoApiTarget_use_assemblies,$(1),$(2))
 
diff --git a/solenv/gbuild/TargetLocations.mk b/solenv/gbuild/TargetLocations.mk
index 36ff8ed..66f88af 100644
--- a/solenv/gbuild/TargetLocations.mk
+++ b/solenv/gbuild/TargetLocations.mk
@@ -28,9 +28,7 @@
 
 # outdir target pattern
 
-gb_CliLibrary_get_target = $(gb_Helper_OUTDIRLIBDIR)/$(1)$(gb_CliLibrary_EXT)
-gb_CliNativeLibrary_get_target = $(gb_Helper_OUTDIRLIBDIR)/$(1)$(gb_CliNativeLibrary_EXT)
-gb_CliUnoApi_get_target = $(gb_Helper_OUTDIRLIBDIR)/$(1)$(gb_CliUnoApi_EXT)
+gb_CliAssemblyTarget_get_outdir_target = $(gb_Helper_OUTDIRLIBDIR)/$(1)
 gb_ComponentTarget_get_outdir_target = $(OUTDIR)/xml/component/$(1).component
 gb_Dictionary_get_target = $(OUTDIR)/pck/$(1).oxt
 gb_Executable_get_target = $(OUTDIR)/bin/$(1)$(gb_Executable_EXT)
@@ -84,12 +82,15 @@
 gb_GenCObject_get_target = $(WORKDIR)/GenCObject/$(1).o
 gb_CliAssembly_get_target = $(WORKDIR)/CliAssembly/$(1).done
 gb_CliAssemblyTarget_get_target = $(WORKDIR)/CliAssemblyTarget/$(1).done
-gb_CliAssemblyTarget_get_assembly_target = $(WORKDIR)/CliAssemblyTarget/$(1)$(gb_CliAssemblyTarget_POLICYEXT)
 gb_CliConfigTarget_get_target = $(WORKDIR)/CliConfigTarget/$(1).config
-gb_CliLibraryTarget_get_target = $(WORKDIR)/CliLibraryTarget/$(1)$(gb_CliLibraryTarget_EXT)
-gb_CliNativeLibraryTarget_get_external_target = $(WORKDIR)/CliNativeLibraryTarget/$(1).external
-gb_CliNativeLibraryTarget_get_target = $(WORKDIR)/CliNativeLibraryTarget/$(1)$(gb_CliNativeLibraryTarget_EXT)
-gb_CliUnoApiTarget_get_target = $(WORKDIR)/CliUnoApiTarget/$(1)$(gb_CliUnoApiTarget_EXT)
+gb_CliCSharpTarget_get_target = $(WORKDIR)/CliCSharpTarget/$(1).dll
+gb_CliLibrary_get_target = $(WORKDIR)/CliLibrary/$(1).done
+gb_CliPolicyTarget_get_target = $(WORKDIR)/CliPolicyTarget/$(1).done
+gb_CliPolicyTarget_get_assembly_target = $(WORKDIR)/CliPolicyTarget/$(1).dll
+gb_CliSignTarget_get_external_target = $(WORKDIR)/CliSignTarget/$(1).external
+gb_CliSignTarget_get_target = $(WORKDIR)/CliSignTarget/$(1).dll
+gb_CliUnoApi_get_target = $(WORKDIR)/CliUnoApi/$(1).done
+gb_CliUnoApiTarget_get_target = $(WORKDIR)/CliUnoApiTarget/$(1).dll
 gb_ComponentTarget_get_target = $(WORKDIR)/ComponentTarget/$(1).component
 gb_ComponentsTarget_get_target = $(WORKDIR)/ComponentsTarget/$(1).components
 gb_Configuration_get_preparation_target = $(WORKDIR)/Configuration/$(1).prepared
@@ -226,8 +227,11 @@
 	CliAssembly \
 	CliAssemblyTarget \
 	CliConfigTarget \
-	CliLibraryTarget \
-	CliNativeLibraryTarget \
+	CliCSharpTarget \
+	CliLibrary \
+	CliPolicyTarget \
+	CliSignTarget \
+	CliUnoApi \
 	CliUnoApiTarget \
 	ComponentTarget \
 	ComponentsTarget \
@@ -280,9 +284,6 @@
 ))
 
 $(eval $(call gb_Helper_make_outdir_clean_targets,\
-	CliLibrary \
-	CliNativeLibrary \
-	CliUnoApi \
 	Dictionary \
 	Executable \
 	Extension \
@@ -337,6 +338,7 @@
 gb_Executable_BINDIR = $(WORKDIR)/LinkTarget/Executable
 gb_Library_OUTDIRLOCATION = $(OUTDIR)/lib
 gb_Library_DLLDIR = $(WORKDIR)/LinkTarget/Library
+gb_CliLibrary_DLLDIR = $(WORKDIR)/LinkTarget/CliLibrary
 gb_CppunitTest_DLLDIR = $(WORKDIR)/LinkTarget/CppunitTest
 gb_StaticLibrary_OUTDIRLOCATION = $(OUTDIR)/lib
 
diff --git a/solenv/gbuild/gbuild.mk b/solenv/gbuild/gbuild.mk
index 521d4bd..33fcf69 100644
--- a/solenv/gbuild/gbuild.mk
+++ b/solenv/gbuild/gbuild.mk
@@ -341,9 +341,9 @@
 	UnoApiMerge \
 	UnpackedTarball \
 	InternalUnoApi \
+	CliAssemblyTarget \
 	CliAssembly \
 	CliLibrary \
-	CliNativeLibrary \
 	CliUnoApi \
 	Zip \
 	AllLangZip \
diff --git a/solenv/gbuild/platform/IOS_ARM_GCC.mk b/solenv/gbuild/platform/IOS_ARM_GCC.mk
index 9f2f54e..078b20f 100644
--- a/solenv/gbuild/platform/IOS_ARM_GCC.mk
+++ b/solenv/gbuild/platform/IOS_ARM_GCC.mk
@@ -298,11 +298,6 @@
 
 gb_InstallScript_EXT := .ins
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT :=
-gb_CliAssemblyTarget_get_dll :=
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/LICENSE
@@ -319,6 +314,26 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS :=
+
+gb_CliLibrary_CliLibrary_platform :=
+
+gb_CliLibrary_get_dll :=
+
+gb_CliLibrary_add_delayload_dll :=
+
+gb_CliLibrary_set_link_keyfile :=
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget__command :=
+
+# CliPolicyTarget class
+
+gb_CliPolicyTarget__command :=
+
 # Python
 gb_PYTHON_PRECOMMAND := DYLD_LIBRARY_PATH=$(OUTDIR_FOR_BUILD)/lib
 
diff --git a/solenv/gbuild/platform/WNT_INTEL_GCC.mk b/solenv/gbuild/platform/WNT_INTEL_GCC.mk
index ae1e785..2a92621 100644
--- a/solenv/gbuild/platform/WNT_INTEL_GCC.mk
+++ b/solenv/gbuild/platform/WNT_INTEL_GCC.mk
@@ -403,11 +403,6 @@
 
 gb_InstallScript_EXT := .inf
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT :=
-gb_CliAssemblyTarget_get_dll :=
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/license.txt
@@ -424,6 +419,26 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS :=
+
+gb_CliLibrary_CliLibrary_platform :=
+
+gb_CliLibrary_get_dll :=
+
+gb_CliLibrary_add_delayload_dll :=
+
+gb_CliLibrary_set_link_keyfile :=
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget__command :=
+
+# CliPolicyTarget class
+
+gb_CliPolicyTarget__command :=
+
 # Python
 gb_PYTHON_PRECOMMAND := PATH="$${PATH}:$(OUTDIR_FOR_BUILD)/bin" PYTHONHOME="$(OUTDIR_FOR_BUILD)/lib/python" PYTHONPATH="$(OUTDIR_FOR_BUILD)/lib/python;$(OUTDIR_FOR_BUILD)/lib/python/lib-dynload"
 
diff --git a/solenv/gbuild/platform/WNT_INTEL_MSC.mk b/solenv/gbuild/platform/WNT_INTEL_MSC.mk
index 0075db0..809d5a2 100644
--- a/solenv/gbuild/platform/WNT_INTEL_MSC.mk
+++ b/solenv/gbuild/platform/WNT_INTEL_MSC.mk
@@ -355,6 +355,7 @@
 		$(if $(filter Library CppunitTest,$(TARGETTYPE)),$(gb_Library_TARGETTYPEFLAGS)) \
 		$(if $(filter StaticLibrary,$(TARGETTYPE)),$(gb_StaticLibrary_TARGETTYPEFLAGS)) \
 		$(if $(filter Executable,$(TARGETTYPE)),$(gb_Executable_TARGETTYPEFLAGS)) \
+		$(if $(filter CliLibrary,$(TARGETTYPE)),$(gb_CliLibrary_TARGETTYPEFLAGS)) \
 		$(if $(filter YES,$(TARGETGUI)), -SUBSYSTEM:WINDOWS, -SUBSYSTEM:CONSOLE) \
 		$(if $(filter YES,$(LIBRARY_X64)), -MACHINE:X64, -MACHINE:IX86) \
 		$(if $(filter YES,$(LIBRARY_X64)), -LIBPATH:$(OUTDIR)/lib/x64 -LIBPATH:$(COMPATH)/lib/amd64 -LIBPATH:$(WINDOWS_SDK_HOME)/lib/x64 \
@@ -437,13 +438,6 @@
 	$(foreach lib,$(gb_Library_UNOVERLIBS),$(lib):$(lib)$(gb_Library_UNOVEREXT)) \
 	$(foreach lib,$(gb_Library_EXTENSIONLIBS),$(lib):$(lib)$(gb_Library_UNOEXT)) \
 
-# An assembly is a special kind of library for CLI
-define gb_Library_Assembly
-$(call gb_Library_Library,$(1))
-$(call gb_LinkTarget_get_target,$(call gb_Library_get_linktargetname,$(1))) : NATIVERES :=
-
-endef
-
 define gb_Library_Library_platform
 $(call gb_LinkTarget_set_dlltarget,$(2),$(3))
 
@@ -705,11 +699,6 @@
 
 gb_InstallScript_EXT := .inf
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT := $(gb_Library_DLLEXT)
-gb_CliAssemblyTarget_get_dll = $(OUTDIR)/bin/$(1)$(gb_CliAssemblyTarget_POLICYEXT)
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/license.txt
@@ -726,6 +715,104 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS := \
+	advapi32 \
+	delayimp \
+	mscoree \
+	$(if $(USE_DEBUG_RUNTIME)\
+		,msvcmrtd \
+		,msvcmrt \
+	)
+
+define gb_CliLibrary_CliLibrary_platform
+$(call gb_LinkTarget_set_dlltarget,$(2),$(3))
+
+# When compiling for CLR, disable "warning C4339: use of undefined type detected
+# in CLR meta-data - use of this type may lead to a runtime exception":
+$(call gb_LinkTarget_add_cxxflags,$(2),\
+	-AI $(gb_Helper_OUTDIRLIBDIR) \
+	-clr \
+	-wd4339 \
+)
+
+$(call gb_LinkTarget_add_ldflags,$(2),\
+	-ignore:4248 \
+)
+
+endef
+
+gb_CliLibrary_get_dll = $(gb_CliLibrary_DLLDIR)/$(call gb_CliLibrary_get_linktargetname,$(1)).dll
+
+
+define gb_CliLibrary_add_delayload_dll
+$(call gb_LinkTarget_add_ldflags,$(call gb_CliLibrary_get_linktargetname,$(1)),\
+	-delayload:$(call gb_Library_get_dllname,$(2)) \
+)
+
+endef
+
+define gb_CliLibrary_set_link_keyfile
+$(call gb_LinkTarget_add_ldflags,$(call gb_CliLibrary_get_linktargetname,$(1)),\
+	-keyfile:$(call gb_Helper_windows_path,$(2)) \
+)
+
+endef
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget_CSCFLAGS := \
+	-noconfig \
+	-nologo \
+
+gb_CliCSharpTarget_CSCFLAGS_DEBUG := \
+	-checked+ \
+	-define:DEBUG \
+	-define:TRACE \
+
+ifeq ($(strip $(debug)),)
+ifeq ($(strip $(PRODUCT)),)
+gb_CliCSharpTarget__get_csflags = $(gb_CliCSharpTarget_CSCFLAGS) $(gb_CliCSharpTarget_CSCFLAGS_DEBUG)
+else
+gb_CliCSharpTarget__get_csflags = $(gb_CliCSharpTarget_CSCFLAGS) -o
+endif
+else
+gb_CliCSharpTarget__get_csflags = $(gb_CliCSharpTarget_CSCFLAGS) $(gb_CliCSharpTarget_CSCFLAGS_DEBUG) -debug+
+endif
+
+define gb_CliCSharpTarget__command
+$(call gb_Output_announce,$(2),$(true),CSC,3)
+$(call gb_Helper_abbreviate_dirs,\
+	csc $(call gb_Helper_windows_path, \
+		$(call gb_CliCSharpTarget__get_csflags) \
+		$(CLI_CSCFLAGS) \
+		-target:library \
+		-out:$(1) \
+		-keyfile:$(call gb_Helper_windows_path,$(CLI_KEYFILE)) \
+		-reference:System.dll \
+		$(foreach assembly,$(CLI_ASSEMBLIES),-reference:$(assembly)) \
+		$(CLI_SOURCES) \
+	) \
+)
+endef
+
+# CliPolicyTarget class
+
+define gb_CliPolicyTarget__command
+$(call gb_Output_announce,$(2),$(true),AL ,2)
+$(call gb_Helper_abbreviate_dirs,\
+	al \
+		-nologo \
+		-out:$(CLI_ASSEMBLY_OUTFILE) \
+		-version:$(CLI_ASSEMBLY_VERSION) \
+		-keyfile:$(call gb_Helper_windows_path,$(CLI_ASSEMBLY_KEYFILE)) \
+		-link:$(CLI_ASSEMBLY_CONFIGFILE) \
+		$(if $(CLI_ASSEMBLY_PLATFORM),-platform:$(CLI_ASSEMBLY_PLATFORM)) && \
+	touch $(1) \
+)
+endef
+
 # Python
 gb_PYTHON_PRECOMMAND := $(gb_Helper_set_ld_path) PYTHONHOME="$(OUTDIR_FOR_BUILD)/lib/python" PYTHONPATH="$(OUTDIR_FOR_BUILD)/lib/python;$(OUTDIR_FOR_BUILD)/lib/python/lib-dynload"
 
diff --git a/solenv/gbuild/platform/macosx.mk b/solenv/gbuild/platform/macosx.mk
index 59f6c56..4fcdee6 100644
--- a/solenv/gbuild/platform/macosx.mk
+++ b/solenv/gbuild/platform/macosx.mk
@@ -389,11 +389,6 @@
 
 gb_InstallScript_EXT := .ins
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT :=
-gb_CliAssemblyTarget_get_dll :=
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/LICENSE
@@ -414,6 +409,26 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS :=
+
+gb_CliLibrary_CliLibrary_platform :=
+
+gb_CliLibrary_get_dll :=
+
+gb_CliLibrary_add_delayload_dll :=
+
+gb_CliLibrary_set_link_keyfile :=
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget__command :=
+
+# CliPolicyTarget class
+
+gb_CliPolicyTarget__command :=
+
 # Python
 gb_PYTHON_PRECOMMAND := DYLD_LIBRARY_PATH=$(OUTDIR)/lib
 
diff --git a/solenv/gbuild/platform/solaris.mk b/solenv/gbuild/platform/solaris.mk
index 31e8e05..92a3309 100644
--- a/solenv/gbuild/platform/solaris.mk
+++ b/solenv/gbuild/platform/solaris.mk
@@ -387,11 +387,6 @@
 
 gb_InstallScript_EXT := .ins
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT :=
-gb_CliAssemblyTarget_get_dll :=
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/LICENSE
@@ -408,6 +403,26 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS :=
+
+gb_CliLibrary_CliLibrary_platform :=
+
+gb_CliLibrary_get_dll :=
+
+gb_CliLibrary_add_delayload_dll :=
+
+gb_CliLibrary_set_link_keyfile :=
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget__command :=
+
+# CliPolicyTarget class
+
+gb_CliPolicyTarget__command :=
+
 # Python
 gb_PYTHON_PRECOMMAND := $(gb_Helper_set_ld_path) PYTHONHOME=$(OUTDIR)/lib/python PYTHONPATH=$(OUTDIR)/lib/python:$(OUTDIR)/lib/python/lib-dynload
 
diff --git a/solenv/gbuild/platform/unxgcc.mk b/solenv/gbuild/platform/unxgcc.mk
index 843ec18..158d738 100644
--- a/solenv/gbuild/platform/unxgcc.mk
+++ b/solenv/gbuild/platform/unxgcc.mk
@@ -391,11 +391,6 @@
 
 gb_InstallScript_EXT := .ins
 
-# CliAssemblyTarget class
-
-gb_CliAssemblyTarget_POLICYEXT :=
-gb_CliAssemblyTarget_get_dll :=
-
 # ExtensionTarget class
 
 gb_ExtensionTarget_LICENSEFILE_DEFAULT := $(OUTDIR)/bin/osl/LICENSE
@@ -412,6 +407,26 @@
 gb_UnoApiHeadersTarget_select_variant = $(2)
 endif
 
+# CliLibrary class
+
+gb_CliLibrary_LIBS :=
+
+gb_CliLibrary_CliLibrary_platform :=
+
+gb_CliLibrary_get_dll :=
+
+gb_CliLibrary_add_delayload_dll :=
+
+gb_CliLibrary_set_link_keyfile :=
+
+# CliCSharpTarget class
+
+gb_CliCSharpTarget__command :=
+
+# CliPolicyTarget class
+
+gb_CliPolicyTarget__command :=
+
 # Python
 gb_PYTHON_PRECOMMAND := $(gb_Helper_set_ld_path) PYTHONHOME=$(OUTDIR)/lib/python PYTHONPATH=$(OUTDIR)/lib/python:$(OUTDIR)/lib/python/lib-dynload