Skip to content

Commit

Permalink
[runtime] Add Dedup Support to MkBundle (#5484)
Browse files Browse the repository at this point in the history
* [runtime] Fix mkbundle compilation on OSX

* [runtime] Add aot arguments to mkbundle

* [runtime] Enable compiling aot with mkbundle

* [runtime] Add new dedup interface to mkbundle

* [runtime] Fix path resolving for mkbundle

* [runtime] Use mkbundle in BCL tests

* [runtime] Skip building System.Security, System.IdentityModel tests on testing_aot_full

* [runtime] Fix in-tree building for mkbundle

* [runtime] Move testing dll into profile

* [runtime] Add target to mkbundle all tests before CI

* [runtime] Build stripper and use with mkbundle

Preliminary linker support ran into dependency-finding bug
with the monolinker.exe binary. Fix postponed until later.

* [runtime] Skip not supported tests with mkbundle

* [runtime] Don't re-aot when running BCL tests

* [runtime] Provide config to mkbundle

* [runtime] Fix mkbundle internationalization test results, build all

* [runtime] Clean up temp mkbundle aot directory

* [runtime] Add mkbundle support for dedup

* [runtime] Fix tracking of dedup module in mkbundle

* [runtime] Document mkbundle AOT options in man pages

* [runtime] Fix CADMessage generic method argument marshalling
  • Loading branch information
alexanderkyte authored and luhenry committed Nov 15, 2017
1 parent 50fa04c commit ca8b8bd
Show file tree
Hide file tree
Showing 25 changed files with 534 additions and 46 deletions.
12 changes: 11 additions & 1 deletion configure.ac
Expand Up @@ -958,6 +958,8 @@ with_cooperative_gc_default=no

INVARIANT_AOT_OPTIONS=nimt-trampolines=2000,ntrampolines=8000,nrgctx-fetch-trampolines=256,ngsharedvt-trampolines=4000

AOT_BUILD_ATTRS=$INVARIANT_AOT_OPTIONS

if test x$cross_compiling = xyes -o x$enable_mcs_build = xno; then
DISABLE_MCS_DOCS_default=yes
elif test x$with_runtime_preset = xnet_4_x; then
Expand Down Expand Up @@ -985,8 +987,8 @@ elif test x$with_runtime_preset = xfullaot; then
mono_feature_disable_appdomains='yes'

AOT_BUILD_FLAGS="--runtime=mobile -O=gsharedvt --aot=full,$INVARIANT_AOT_OPTIONS"

AOT_RUN_FLAGS="--runtime=mobile --full-aot"
AOT_MODE="full"
elif test x$with_runtime_preset = xbitcode; then
DISABLE_MCS_DOCS_default=yes
with_testing_aot_full_default=yes
Expand All @@ -1003,6 +1005,7 @@ elif test x$with_runtime_preset = xbitcode; then

AOT_BUILD_FLAGS="--runtime=mobile --aot=llvmonly,$INVARIANT_AOT_OPTIONS"
AOT_RUN_FLAGS="--runtime=mobile --llvmonly"
AOT_MODE="llvmonly"
elif test x$with_runtime_preset = xhybridaot; then
DISABLE_MCS_DOCS_default=yes
with_testing_aot_hybrid_default=yes
Expand Down Expand Up @@ -1030,6 +1033,7 @@ elif test x$with_runtime_preset = xwinaot; then

AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
AOT_RUN_FLAGS="--runtime=mobile --full-aot"
AOT_MODE="llvmonly"
elif test x$with_runtime_preset = xorbis; then
DISABLE_MCS_DOCS_default=yes
with_orbis_default=yes
Expand All @@ -1043,6 +1047,7 @@ elif test x$with_runtime_preset = xorbis; then

AOT_BUILD_FLAGS="--runtime=mobile --aot=full,$INVARIANT_AOT_OPTIONS"
AOT_RUN_FLAGS="--runtime=mobile --full-aot"
AOT_MODE="full"
elif test x$with_runtime_preset = xunreal; then
DISABLE_MCS_DOCS_default=yes
with_unreal_default=yes
Expand Down Expand Up @@ -4871,6 +4876,11 @@ fi
if test "x$AOT_BUILD_FLAGS" != "x" ; then
echo "AOT_RUN_FLAGS=$AOT_RUN_FLAGS" >> $srcdir/$mcsdir/build/config.make
echo "AOT_BUILD_FLAGS=$AOT_BUILD_FLAGS" >> $srcdir/$mcsdir/build/config.make
echo "AOT_BUILD_ATTRS=$AOT_BUILD_ATTRS" >> $srcdir/$mcsdir/build/config.make
fi

if test "x$AOT_MODE" != "x" ; then
echo "AOT_MODE=$AOT_MODE" >> $srcdir/$mcsdir/build/config.make
fi

if test "x$enable_btls" = "xyes"; then
Expand Down
31 changes: 31 additions & 0 deletions man/mkbundle.1
Expand Up @@ -188,6 +188,18 @@ as precompiled binaries on the Mono distribution server.
.I "--local-targets"
Lists all of the available local cross compilation targets.
.TP
.I "--cil-strip PATH"
Provides a CIL stripper that mkbundle will use if able to.
The intended use is to help reduce file size on AOT.
.TP
.I "--in-tree path/to/mono/source/root"
Provides mkbundle with a mono source repository from which to pull the necessary headers for compilation.
This allows mkbundle to run out of the project's source tree, useful for working with multiple runtimes and for
testing without installing.
.TP
.I "--managed-linker PATH"
Provides mkbundle access to a managed linker to preprocess the assemblies.
.TP
.I "--machine-config FILE"
Uses the given FILE as the machine.config file for the generated
application.
Expand Down Expand Up @@ -308,6 +320,25 @@ causes it to statically link instead.
Compresses the assemblies before embedding. This results in smaller
executable files, but increases startup time and requires zlib to be
installed on the target system.

.SH AOT Options
These options support an mkbundle using AOT compilation with static linking. A native compiler
toolchain is required.
.TP
.I "--aot-runtime PATH"
Provide the path to the mono runtime to use for AOTing assemblies.
.TP
.I "--aot-dedup"
(Experimental) Deduplicate AOT'ed methods based on a unique mangling of method names.
.TP
.I "--aot-mode MODE"
MODE can be either "full" or "llvmonly" at this time.
Currently, mkbundle supports three AOT modes. The default mode (this option unset)
will AOT methods but will fall back on runtime codegen where it is much faster or offers
a more full compatibility profile. The "full" setting will generate the necessary stubs to
not require runtime code generation. The "llvmonly" setting does the same, but forces all codegen
to go through the llvm backend.

.SH WINDOWS
If you are using the old embedding on Windows systems, it it necessary
to have Unix-like toolchain to be installed for \fImkbundle\fP to
Expand Down
4 changes: 3 additions & 1 deletion mcs/build/config-default.make
Expand Up @@ -32,7 +32,9 @@ mono_libdir = $(exec_prefix)/lib
sysconfdir = $(prefix)/etc
#RUNTIME = mono
RUNTIME = false
TEST_RUNTIME = MONO_PATH="./$(PLATFORM_PATH_SEPARATOR)$(topdir)/class/lib/$(PROFILE_DIRECTORY)$(PLATFORM_PATH_SEPARATOR)$(TEST_MONO_PATH)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME) --debug
MONO_PATH_TOP = $(topdir)/class/lib/$(PROFILE_DIRECTORY)/
MONO_PATH_TESTS = $(MONO_PATH_TOP)/tests
TEST_RUNTIME = MONO_PATH="$(MONO_PATH_TOP)$(PLATFORM_PATH_SEPARATOR)$(TEST_MONO_PATH)$(PLATFORM_PATH_SEPARATOR)$(MONO_PATH_TESTS)$(PLATFORM_PATH_SEPARATOR).$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME) --debug

# In case you want to add MCS_FLAGS, this lets you not have to
# keep track of the default value
Expand Down
9 changes: 6 additions & 3 deletions mcs/build/rules.make
Expand Up @@ -177,24 +177,27 @@ do-all-aot:
ifneq ("$(wildcard $(topdir)/class/lib/$(PROFILE))","")

AOT_PROFILE_ASSEMBLIES := $(sort $(patsubst .//%,%,$(filter-out %.dll.dll %.exe.dll %bare% %plaincore% %secxml% %Facades% %ilasm%,$(filter %.dll %.exe,$(wildcard $(topdir)/class/lib/$(PROFILE)/*)))))
AOT_PROFILE_TESTS := $(sort $(patsubst .//%,%,$(filter-out %.dll.dll %.exe.dll %bare% %plaincore% %secxml% %Facades% %ilasm%,$(filter %.dll %.exe,$(wildcard $(topdir)/class/lib/$(PROFILE)/tests/*)))))
AOT_PROFILE_ASSEMBLIES_OUT := $(patsubst %,%$(PLATFORM_AOT_SUFFIX),$(AOT_PROFILE_ASSEMBLIES))
AOT_PROFILE_TESTS_OUT := $(patsubst %,%$(PLATFORM_AOT_SUFFIX),$(AOT_PROFILE_TESTS))

# This can run in parallel
.PHONY: aot-all-profile
ifdef AOT_BUILD_FLAGS
aot-all-profile: $(patsubst %,%$(PLATFORM_AOT_SUFFIX),$(AOT_PROFILE_ASSEMBLIES))
aot-all-profile: $(AOT_PROFILE_ASSEMBLIES_OUT) $(AOT_PROFILE_TESTS_OUT)
else
aot-all-profile:
echo AOT_BUILD_FLAGS not set, skipping AOT.
endif

%.dll$(PLATFORM_AOT_SUFFIX): %.dll
@ mkdir -p $<_bitcode_tmp
$(Q_AOT) MONO_PATH="$(dir $<)" $(RUNTIME) $(RUNTIME_FLAGS) $(AOT_BUILD_FLAGS),temp-path=$<_bitcode_tmp --verbose $< > $@.aot-log
$(Q_AOT) MONO_PATH="$(topdir)/class/lib/$(PROFILE)" $(RUNTIME) $(RUNTIME_FLAGS) $(AOT_BUILD_FLAGS),temp-path=$<_bitcode_tmp --verbose $< > $@.aot-log
@ rm -rf $<_bitcode_tmp

%.exe$(PLATFORM_AOT_SUFFIX): %.exe
@ mkdir -p $<_bitcode_tmp
$(Q_AOT) MONO_PATH="$(dir $<)" $(RUNTIME) $(RUNTIME_FLAGS) $(AOT_BUILD_FLAGS),temp-path=$<_bitcode_tmp --verbose $< > $@.aot-log
$(Q_AOT) MONO_PATH="$(topdir)/class/lib/$(PROFILE)" $(RUNTIME) $(RUNTIME_FLAGS) $(AOT_BUILD_FLAGS),temp-path=$<_bitcode_tmp --verbose $< > $@.aot-log
@ rm -rf $<_bitcode_tmp

endif #ifneq ("$(wildcard $(topdir)/class/lib/$(PROFILE))","")
Expand Down
64 changes: 58 additions & 6 deletions mcs/build/tests.make
Expand Up @@ -90,8 +90,14 @@ tests_CLEAN_FILES += $(topdir)/build/deps/nunit-$(PROFILE).stamp

endif

test_assemblies :=

test_lib_dir = $(topdir)/class/lib/$(PROFILE)/tests

test_lib_output = $(topdir)/class/lib/$(PROFILE)/tests/$(test_lib)

ifdef HAVE_CS_TESTS
test_assemblies = $(test_lib)
test_assemblies += $(test_lib_output)

check: run-test
test-local: $(test_assemblies)
Expand Down Expand Up @@ -121,11 +127,11 @@ LABELS_ARG = -labels
endif

ifdef ALWAYS_AOT
test-local-aot-compile: $(topdir)/build/deps/nunit-$(PROFILE).stamp
test-local-aot-compile: $(topdir)/build/deps/nunit-$(PROFILE).stamp $(test_assemblies)
PATH="$(TEST_RUNTIME_WRAPPERS_PATH):$(PATH)" MONO_REGISTRY_PATH="$(HOME)/.mono/registry" MONO_TESTS_IN_PROGRESS="yes" $(TEST_RUNTIME) $(TEST_RUNTIME_FLAGS) $(AOT_BUILD_FLAGS) $(test_assemblies)

else
test-local-aot-compile: $(topdir)/build/deps/nunit-$(PROFILE).stamp
test-local-aot-compile: $(topdir)/build/deps/nunit-$(PROFILE).stamp $(test_assemblies)

endif # ALWAYS_AOT

Expand All @@ -144,10 +150,53 @@ ifdef TEST_NUNITLITE_APP_CONFIG_RUNTIME
sed -i -e "/__INSERT_CUSTOM_APP_CONFIG_RUNTIME__/r $(TEST_NUNITLITE_APP_CONFIG_RUNTIME)" $(NUNITLITE_CONFIG_FILE)
endif

ifdef PLATFORM_AOT_SUFFIX

DEDUP_DUMMY_CS=$(topdir)/class/lib/$(PROFILE)/DedupInflatedMethods.cs
DEDUP_DUMMY=$(topdir)/class/lib/$(PROFILE)/DedupInflatedMethods.dll

$(DEDUP_DUMMY):
echo " // Empty Assembly \n\n" > $(DEDUP_DUMMY_CS)
$(CSCOMPILE) -t:library -out:$(DEDUP_DUMMY) $(DEDUP_DUMMY_CS)
rm $(DEDUP_DUMMY_CS)

MKBUNDLE_TEST_BIN = $(TEST_HARNESS).static
MKBUNDLE_EXE = $(topdir)/class/lib/$(PROFILE)/mkbundle.exe
# Pattern based on the one in AOT_PROFILE_ASSEMBLIES
# It's easier if you read it backwards.
# What we do here is get the files in the profile directory that end in "test.dll" or are prefixed with nunit (filter)
# and then strip out everything that we expect to live outside the top level (filter-out)
TEST_ASSEMBLIES:=$(sort $(patsubst .//%,%,$(filter-out %.exe.static %.dll.dll %.exe.dll %bare% %plaincore% %secxml% %Facades% %ilasm%,$(filter %.dll,$(wildcard $(topdir)/class/lib/$(PROFILE)/tests/*)))))

$(MKBUNDLE_EXE): $(topdir)/tools/mkbundle/mkbundle.cs
make -C $(topdir)/tools/mkbundle

mkbundle-all-tests:
$(Q_AOT) $(MAKE) -C $(topdir)/class do-test
$(Q_AOT) $(MAKE) -C $(topdir)/tools/mkbundle
$(Q_AOT) $(MAKE) $(MKBUNDLE_TEST_BIN) # recursive make re-computes variables for TEST_ASSEMBLIES

ifdef MKBUNDLE_DEDUP
MKBUNDLE_DEDUP_COND := $(DEDUP_DUMMY)
DEDUP_ARGS=--aot-dedup $(DEDUP_DUMMY)
endif

$(MKBUNDLE_TEST_BIN): $(TEST_ASSEMBLIES) $(TEST_HARNESS) $(MKBUNDLE_EXE) $(MKBUNDLE_DEDUP_COND)
$(Q_AOT) MONO_PATH="$(topdir)/class/lib/$(BUILD_TOOLS_PROFILE)" PKG_CONFIG_PATH="$(topdir)/../data" $(RUNTIME) $(RUNTIME_FLAGS) $(MKBUNDLE_EXE) -L $(topdir)/class/lib/$(PROFILE) -v --deps $(TEST_HARNESS) $(TEST_ASSEMBLIES) -o $(MKBUNDLE_TEST_BIN) --aot-mode $(AOT_MODE) --aot-runtime $(RUNTIME) --aot-args $(AOT_BUILD_ATTRS) --in-tree $(topdir)/.. --managed-linker $(topdir)/class/lib/$(BUILD_TOOLS_PROFILE)/monolinker.exe --config $(topdir)/../data/config --i18n all $(DEDUP_ARGS) --keeptemp

endif # PLATFORM_AOT_SUFFIX

ifneq ($(wildcard $(MKBUNDLE_TEST_BIN)),)
TEST_HARNESS_EXEC=$(MKBUNDLE_TEST_BIN)
TEST_HARNESS_EXCLUDES:=$(TEST_HARNESS_EXCLUDES),StaticLinkedAotNotWorking
else
TEST_HARNESS_EXEC=$(TEST_RUNTIME) $(RUNTIME_FLAGS) $(TEST_COVERAGE_FLAGS) $(AOT_RUN_FLAGS) $(TEST_HARNESS)
endif

## FIXME: i18n problem in the 'sed' command below
run-test-lib: test-local test-local-aot-compile patch-nunitlite-appconfig
ok=:; \
PATH="$(TEST_RUNTIME_WRAPPERS_PATH):$(PATH)" MONO_REGISTRY_PATH="$(HOME)/.mono/registry" MONO_TESTS_IN_PROGRESS="yes" $(TEST_RUNTIME) $(TEST_RUNTIME_FLAGS) $(TEST_COVERAGE_FLAGS) $(AOT_RUN_FLAGS) $(TEST_HARNESS) $(test_assemblies) $(NOSHADOW_FLAG) $(TEST_HARNESS_FLAGS) $(LOCAL_TEST_HARNESS_FLAGS) $(TEST_HARNESS_EXCLUDES) $(LABELS_ARG) -format:nunit2 -result:TestResult-$(PROFILE).xml $(FIXTURE_ARG) $(TESTNAME_ARG)|| ok=false; \
PATH="$(TEST_RUNTIME_WRAPPERS_PATH):$(PATH)" MONO_REGISTRY_PATH="$(HOME)/.mono/registry" MONO_TESTS_IN_PROGRESS="yes" $(TEST_HARNESS_EXEC) $(test_assemblies) $(NOSHADOW_FLAG) $(TEST_HARNESS_FLAGS) $(LOCAL_TEST_HARNESS_FLAGS) $(TEST_HARNESS_EXCLUDES) $(LABELS_ARG) -format:nunit2 -result:TestResult-$(PROFILE).xml $(FIXTURE_ARG) $(TESTNAME_ARG)|| ok=false; \
if [ ! -f "TestResult-$(PROFILE).xml" ]; then echo "<?xml version='1.0' encoding='utf-8'?><test-results failures='1' total='1' not-run='0' name='bcl-tests' date='$$(date +%F)' time='$$(date +%T)'><test-suite name='$(strip $(test_assemblies))' success='False' time='0'><results><test-case name='crash' executed='True' success='False' time='0'><failure><message>The test runner didn't produce a test result XML, probably due to a crash of the runtime. Check the log for more details.</message><stack-trace></stack-trace></failure></test-case></results></test-suite></test-results>" > TestResult-$(PROFILE).xml; fi; \
$$ok

Expand All @@ -169,7 +218,10 @@ endif

ifdef HAVE_CS_TESTS

$(test_lib): $(the_assembly) $(test_response) $(test_nunit_dep)
$(test_lib_dir):
mkdir -p $@

$(test_lib_output): $(the_assembly) $(test_response) $(test_nunit_dep) $(test_lib_dir)
$(TEST_COMPILE) $(LIBRARY_FLAGS) -target:library -out:$@ $(test_flags) $(LOCAL_TEST_COMPILER_ONDOTNET_FLAGS) @$(test_response)

test_response_preprocessed = $(test_response)_preprocessed
Expand All @@ -189,7 +241,7 @@ $(test_makefrag): $(test_response)

-include $(test_makefrag)

build-test-lib: $(test_lib)
build-test-lib: $(test_lib_output)
@echo Building testing lib

endif
Expand Down
2 changes: 1 addition & 1 deletion mcs/class/Microsoft.Build.Utilities/Makefile
Expand Up @@ -30,4 +30,4 @@ CLEAN_FILES += $(TEST_RESX_RESOURCES)
$(TEST_RESX_RESOURCES): %.resources: %.resx
$(RESGEN) $< || cp $@.prebuilt $@

$(test_lib): $(TEST_RESX_RESOURCES)
$(test_lib_output): $(TEST_RESX_RESOURCES) $(test_lib_dir)
Expand Up @@ -30,16 +30,25 @@ public void CreateAndPaths ()
var xml = XmlReader.Create (new StringReader (empty_project_xml), null, "file:///foo.xml");
// This creator does not fill FullPath...
var root = ProjectRootElement.Create (xml);

// Expected to run from mcs/class/lib/profile/tests
var dir_name = Path.GetDirectoryName (new Uri (GetType ().Assembly.CodeBase).LocalPath);
var namespace_path = Path.Combine (Directory.GetParent (dir_name).Parent.Parent.FullName, "Microsoft.Build");

Assert.IsNull (root.FullPath, "#2");
Assert.AreEqual (Path.GetDirectoryName (new Uri (GetType ().Assembly.CodeBase).LocalPath), root.DirectoryPath, "#3");
Assert.AreEqual (namespace_path, root.DirectoryPath, "#3");
}

[Test]
public void FullPathSetter ()
{
var root = ProjectRootElement.Create ();
root.FullPath = "test" + Path.DirectorySeparatorChar + "foo.xml";
var full = Path.Combine (Path.GetDirectoryName (new Uri (GetType ().Assembly.CodeBase).LocalPath), "test", "foo.xml");

// Expected to run from mcs/class/lib/profile/tests
var dir_name = Path.GetDirectoryName (new Uri (GetType ().Assembly.CodeBase).LocalPath);
var namespace_path = Path.Combine (Directory.GetParent (dir_name).Parent.Parent.FullName, "Microsoft.Build");
var full = Path.Combine (namespace_path, "test", "foo.xml");
Assert.AreEqual (full, root.FullPath, "#1");
Assert.AreEqual (Path.GetDirectoryName (full), root.DirectoryPath, "#1");
}
Expand Down
4 changes: 4 additions & 0 deletions mcs/class/System.IdentityModel/Makefile
Expand Up @@ -31,6 +31,10 @@ endif

TEST_MCS_FLAGS = $(LIB_MCS_FLAGS)

ifdef MOBILE_PROFILE
NO_TEST = yes
endif

EXTRA_DISTFILES = \
Test/Resources/test.cer \
Test/Resources/test_neg_serial.cer \
Expand Down
4 changes: 4 additions & 0 deletions mcs/class/System.Security/Makefile
Expand Up @@ -28,6 +28,10 @@ EXTRA_DISTFILES = \

RESX_RESOURCE_STRING = ../../../external/corefx/src/System.Security.Cryptography.Xml/src/Resources/Strings.resx

ifdef MOBILE_PROFILE
NO_TEST = yes
endif

include ../../build/library.make

$(build_lib): $(secxml_libdir)/System.dll $(MONO_SECURITY_DLL)
Expand Down
Expand Up @@ -138,7 +138,10 @@ public static MetadataSet LoadMetadataFromFile (string name)
if (!name.EndsWith (".xml"))
name = name + ".xml";
var uri = new Uri (asm.CodeBase);
// Run from mcs/class/lib/<profile>
var path = Path.GetDirectoryName (uri.AbsolutePath);
path = Directory.GetParent (path).Parent.Parent.FullName;
path = Path.Combine (path, "System.ServiceModel");
path = Path.Combine (path, "Test");
path = Path.Combine (path, "MetadataTests");
path = Path.Combine (path, "Resources");
Expand Down Expand Up @@ -172,6 +175,8 @@ public static XmlDocument LoadConfigurationFromFile (string name)
name = name + ".config";
var uri = new Uri (asm.CodeBase);
var path = Path.GetDirectoryName (uri.AbsolutePath);
path = Directory.GetParent (path).Parent.Parent.FullName;
path = Path.Combine (path, "System.ServiceModel");
path = Path.Combine (path, "Test");
path = Path.Combine (path, "MetadataTests");
path = Path.Combine (path, "Resources");
Expand Down
Expand Up @@ -91,12 +91,10 @@ public override string ToString ()

static CacheItemPriorityQueueTest ()
{
dataDir =
Path.Combine (
Path.Combine (
Path.Combine (Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location), "Test"),
"System.Web.Caching"),
DATA_DIR);
// Assumes this is compiled into mcs/class/lib/<profile>/test
string class_dir = Directory.GetParent (Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location)).Parent.Parent.FullName;
string system_web_dir = Path.Combine (class_dir, "System.Web", "Test", "System.Web.Caching");
dataDir = Path.Combine (system_web_dir, DATA_DIR);
}

void RunTest (string testsFileName, string listFileName)
Expand Down
Expand Up @@ -97,6 +97,7 @@ public void NullAbsoluteUriWithCustomSchemedRelativeUri ()
}

[Test]
[Category ("StaticLinkedAotNotWorking")] // Can't find .dll files when bundled in .exe
public void TestAsync ()
{
var loc = Assembly.GetExecutingAssembly ().Location;
Expand Down
2 changes: 1 addition & 1 deletion mcs/class/System/Makefile
Expand Up @@ -177,7 +177,7 @@ $(the_libdir_base)System.Configuration.dll:

$(build_lib): $(CYCLIC_DEP_FILES)

$(test_lib): $(TEST_RESOURCES)
$(test_lib_output): $(TEST_RESOURCES) $(test_lib_dir)

CLEAN_FILES = $(test_lib).config $(bare_libdir)/System.dll $(secxml_libdir)/System.dll $(bare_libdir)/System.dll.mdb $(secxml_libdir)/System.dll.mdb

Expand Down

0 comments on commit ca8b8bd

Please sign in to comment.