3 # The rules for building our class libraries.
5 # The NO_TEST stuff is not too pleasant but whatcha
8 # All the dep files now land in the same directory so we
9 # munge in the library name to keep the files from clashing.
11 # The including makefile can set the following variables:
12 # LIB_MCS_FLAGS - Command line flags passed to mcs.
13 # LIB_REFS - This should be a space separated list of assembly names which are added to the mcs
17 # All dependent libs become dependent dirs for parallel builds
18 # Have to rename to handle differences between assembly/directory names
19 DEP_LIBS
=$(patsubst System.Xml
,System.XML
,$(LIB_REFS
))
21 _FILTER_OUT
= $(foreach x
,$(2),$(if
$(findstring $(1),$(x
)),,$(x
)))
23 LIB_REFS_FULL
= $(call _FILTER_OUT
,=, $(LIB_REFS
))
24 LIB_REFS_ALIAS
= $(filter-out $(LIB_REFS_FULL
),$(LIB_REFS
))
26 LIB_MCS_FLAGS
+= $(patsubst %,-r
:$(topdir
)/class
/lib
/$(PROFILE
)/%.dll
,$(LIB_REFS_FULL
))
27 LIB_MCS_FLAGS
+= $(patsubst %,-r
:%.dll
, $(subst =,=$(topdir
)/class
/lib
/$(PROFILE
)/,$(LIB_REFS_ALIAS
)))
29 sourcefile
= $(LIBRARY
).sources
31 # If the directory contains the per profile include file, generate list file.
32 PROFILE_sources
:= $(wildcard $(PROFILE
)_
$(LIBRARY
).sources
)
34 PROFILE_excludes
= $(wildcard $(PROFILE
)_
$(LIBRARY
).exclude.sources
)
35 sourcefile
= $(depsdir
)/$(PROFILE
)_
$(LIBRARY
).sources
36 library_CLEAN_FILES
+= $(sourcefile
)
38 # Note, gensources.sh can create a $(sourcefile).makefrag if it sees any '#include's
39 # We don't include it in the dependencies since it isn't always created
40 $(sourcefile
): $(PROFILE_sources
) $(PROFILE_excludes
) $(topdir
)/build
/gensources.sh
41 @echo Creating the per profile list
$@ ...
42 $(SHELL
) $(topdir
)/build
/gensources.sh
$@
'$(PROFILE_sources)' '$(PROFILE_excludes)'
45 PLATFORM_excludes
:= $(wildcard $(LIBRARY
).
$(PLATFORM
)-excludes
)
47 ifndef PLATFORM_excludes
48 ifeq (cat
,$(PLATFORM_CHANGE_SEPARATOR_CMD
))
49 response
= $(sourcefile
)
54 response
= $(depsdir
)/$(PROFILE
)_
$(LIBRARY_SUBDIR
)_
$(LIBRARY
).response
55 library_CLEAN_FILES
+= $(response
)
59 LIBRARY_NAME
= $(LIBRARY
)
69 the_libdir_base
= $(topdir
)/class
/$(lib_dir
)/$(PROFILE
)/$(LIBRARY_SUBDIR
)/
71 the_libdir_base
= $(topdir
)/class
/$(lib_dir
)/$(PROFILE
)/
74 ifdef RESOURCE_STRINGS
75 ifneq (basic
, $(PROFILE
))
76 RESOURCE_STRINGS_FILES
+= $(RESOURCE_STRINGS
:%=--resourcestrings
:%)
81 # The bare directory contains the plain versions of System and System.Xml
83 bare_libdir
= $(the_libdir_base
)bare
86 # The secxml directory contains the System version that depends on
87 # System.Xml and Mono.Security
89 secxml_libdir
= $(the_libdir_base
)secxml
91 the_libdir
= $(the_libdir_base
)$(intermediate
)
93 ifdef LIBRARY_USE_INTERMEDIATE_FILE
94 build_libdir
= $(the_libdir
)tmp
/
96 build_libdir
= $(the_libdir
)
99 the_lib
= $(the_libdir
)$(LIBRARY_NAME
)
100 build_lib
= $(build_libdir
)$(LIBRARY_NAME
)
101 library_CLEAN_FILES
+= $(the_lib
) $(the_lib
).so
$(the_lib
).mdb
$(the_lib
:.dll
=.pdb
)
102 library_CLEAN_FILES
+= $(build_lib
) $(build_lib
).so
$(build_lib
).mdb
$(build_lib
:.dll
=.pdb
)
104 ifdef NO_SIGN_ASSEMBLY
108 sn
= $(topdir
)/class
/lib
/$(BUILD_TOOLS_PROFILE
)/sn.exe
109 SN
= MONO_PATH
="$(topdir)/class/lib/$(BUILD_TOOLS_PROFILE)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME
) $(RUNTIME_FLAGS
) $(sn
) -q
113 ifeq ($(PLATFORM
), win32
)
114 GACDIR
= `cygpath -w $(mono_libdir)`
115 GACROOT
= `cygpath -w $(DESTDIR)$(mono_libdir)`
116 test_flags
+= -d
:WINDOWS
118 GACDIR
= $(mono_libdir
)
119 GACROOT
= $(DESTDIR
)$(mono_libdir
)
123 all-local
: $(the_lib
) $(extra_targets
)
126 ifeq ($(LIBRARY_COMPILE
),$(BOOT_COMPILE
))
132 csproj-local
: csproj-library csproj-test
134 intermediate_clean
=$(subst /,-,$(intermediate
))
136 config_file
=`basename $(LIBRARY) .dll`-$(intermediate_clean
)$(PROFILE
).input
; \
137 case
"$(thisdir)" in
*"Facades"*) config_file
=Facades_
$$config_file;; esac
; \
138 echo
$(thisdir
):$$config_file >> $(topdir
)/..
/msvc
/scripts
/order
; \
140 echo
$(USE_MCS_FLAGS
) $(LIBRARY_FLAGS
) $(LIB_MCS_FLAGS
); \
141 echo
$(LIBRARY_NAME
); \
142 echo
$(BUILT_SOURCES_cmdline
); \
144 echo
$(FRAMEWORK_VERSION
); \
146 echo
$(RESOURCE_DEFS
); \
147 echo
$(response
)) > $(topdir
)/..
/msvc
/scripts
/inputs
/$$config_file
151 install-local
: all-local
152 test-local
: all-local
156 install-local uninstall-local
:
161 aot_lib
= $(the_lib
)$(PLATFORM_AOT_SUFFIX
)
162 aot_libname
= $(LIBRARY_NAME
)$(PLATFORM_AOT_SUFFIX
)
164 ifdef LIBRARY_INSTALL_DIR
166 $(MKINSTALLDIRS
) $(DESTDIR
)$(LIBRARY_INSTALL_DIR
)
167 $(INSTALL_LIB
) $(the_lib
) $(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
)
168 test ! -f
$(the_lib
).mdb ||
$(INSTALL_LIB
) $(the_lib
).mdb
$(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
).mdb
169 test ! -f
$(the_lib
:.dll
=.pdb
) ||
$(INSTALL_LIB
) $(the_lib
:.dll
=.pdb
) $(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
:.dll
=.pdb
)
171 ifdef PLATFORM_AOT_SUFFIX
172 test ! -f
$(aot_lib
) ||
$(INSTALL_LIB
) $(aot_lib
) $(DESTDIR
)$(LIBRARY_INSTALL_DIR
)
176 -rm -f
$(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
) $(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
).mdb
$(DESTDIR
)$(LIBRARY_INSTALL_DIR
)/$(LIBRARY_NAME
:.dll
=.pdb
)
180 # If RUNTIME_HAS_CONSISTENT_GACDIR is set, it implies that the internal GACDIR
181 # of the runtime is the same as the GACDIR we want. So, we don't need to pass it
182 # to gacutil. Note that the GACDIR we want may not be the same as the value of
183 # GACDIR set above, since the user could have overridden the value of $(prefix).
185 # This makes a difference only when we're building from the mono/ tree, since we
186 # have to ensure that the internal GACDIR of the in-tree runtime matches where we
189 ifndef RUNTIME_HAS_CONSISTENT_GACDIR
190 gacdir_flag
= /gacdir
$(GACDIR
)
193 ifndef LIBRARY_PACKAGE
195 LIBRARY_PACKAGE
= compat-
$(FRAMEWORK_VERSION
)
197 LIBRARY_PACKAGE
= $(FRAMEWORK_VERSION
)
201 ifneq (none
, $(LIBRARY_PACKAGE
))
202 package_flag
= /package
$(LIBRARY_PACKAGE
)
205 install-local
: $(gacutil
)
206 $(GACUTIL
) /i
$(the_lib
) /f
$(gacdir_flag
) /root
$(GACROOT
) $(package_flag
)
208 uninstall-local
: $(gacutil
)
209 -$(GACUTIL
) /u
$(LIBRARY_NAME
:.dll
=) $(gacdir_flag
) /root
$(GACROOT
) $(package_flag
)
211 endif # LIBRARY_INSTALL_DIR
215 -rm -f
$(tests_CLEAN_FILES
) $(library_CLEAN_FILES
) $(CLEAN_FILES
)
217 test-local run-test-local run-test-ondotnet-local
:
221 # RESOURCES_DEFS is a list of ID,FILE pairs separated by spaces
222 # for each of those, generate a rule that produces ID.resource from
223 # FILE using the resgen tool, adds the generated file to CLENA_FILES and
224 # passes the resource to the compiler
227 define RESOURCE_template
229 $(RESGEN
) "$$<" "$$@"
231 GEN_RESOURCE_DEPS
+= $(1).resources
232 GEN_RESOURCE_FLAGS
+= -resource
:$(1).resources
233 CLEAN_FILES
+= $(1).resources
234 DIST_LISTED_RESOURCES
+= $(2)
238 $(foreach pair
,$(RESOURCE_DEFS
), $(eval
$(call RESOURCE_template
,$(word 1, $(subst $(ccomma
), ,$(pair
))), $(word 2, $(subst $(ccomma
), ,$(pair
))))))
241 DISTFILES
= $(wildcard *$(LIBRARY
)*.sources
) $(EXTRA_DISTFILES
) $(DIST_LISTED_RESOURCES
)
243 ASSEMBLY
= $(LIBRARY
)
245 the_assembly
= $(the_lib
)
246 include $(topdir
)/build
/tests.make
249 DISTFILES
+= $(test_sourcefile
)
252 config_file
=`basename $(LIBRARY) .dll`-tests-
$(PROFILE
).input
; \
253 echo
$(thisdir
):$$config_file >> $(topdir
)/..
/msvc
/scripts
/order
; \
255 echo
$(USE_MCS_FLAGS
) -r
:$(the_assembly
) $(TEST_MCS_FLAGS
); \
257 echo
$(BUILT_SOURCES_cmdline
); \
259 echo
$(FRAMEWORK_VERSION
); \
262 echo
$(test_response
)) > $(topdir
)/..
/msvc
/scripts
/inputs
/$$config_file
266 # make dist will collect files in .sources files from all profiles
267 dist-local
: dist-default
269 for f in
`$(topdir)/tools/removecomments.sh $(filter-out $(wildcard *_test.dll.sources) $(wildcard *exclude.sources),$(wildcard *.sources))` $(TEST_FILES
) ; do \
273 *) dest
=`dirname "$$f"` ; \
274 case
$$subs in
*" $$dest "*) : ;; *) subs
=" $$dest$$subs" ; $(MKINSTALLDIRS
) $(distdir
)/$$dest ;; esac
; \
275 cp
-p
"$$f" $(distdir
)/$$dest || exit
1 ;; \
277 for d in .
$$subs ; do \
278 case
$$d in .
) : ;; *) test ! -f
$$d/ChangeLog || cp
-p
$$d/ChangeLog
$(distdir
)/$$d ;; esac
; done
280 ifndef LIBRARY_COMPILE
281 LIBRARY_COMPILE
= $(CSCOMPILE
)
285 LIBRARY_SNK
= $(topdir
)/class
/mono.snk
289 library_CLEAN_FILES
+= $(BUILT_SOURCES
)
290 ifeq (cat
, $(PLATFORM_CHANGE_SEPARATOR_CMD
))
291 BUILT_SOURCES_cmdline
= $(BUILT_SOURCES
)
293 BUILT_SOURCES_cmdline
= `echo $(BUILT_SOURCES) | $(PLATFORM_CHANGE_SEPARATOR_CMD)`
299 $(the_lib
): $(the_libdir
)/.stamp
301 $(build_lib
): $(response
) $(sn
) $(BUILT_SOURCES
) $(build_libdir
:=/.stamp
) $(GEN_RESOURCE_DEPS
)
302 $(LIBRARY_COMPILE
) $(LIBRARY_FLAGS
) $(LIB_MCS_FLAGS
) $(GEN_RESOURCE_FLAGS
) -target
:library
-out
:$@
$(BUILT_SOURCES_cmdline
) @
$(response
)
303 ifdef RESOURCE_STRINGS_FILES
304 $(Q
) $(STRING_REPLACER
) $(RESOURCE_STRINGS_FILES
) $@
306 $(Q
) $(SN
) -R
$@
$(LIBRARY_SNK
)
308 ifdef LIBRARY_USE_INTERMEDIATE_FILE
309 $(the_lib
): $(build_lib
)
310 $(Q
) cp
$(build_lib
) $@
312 $(Q
) test ! -f
$(build_lib
).mdb || mv
$(build_lib
).mdb
$@.mdb
313 $(Q
) test ! -f
$(build_lib
:.dll
=.pdb
) || mv
$(build_lib
:.dll
=.pdb
) $(the_lib
:.dll
=.pdb
)
316 library_CLEAN_FILES
+= $(PROFILE
)_aot.log
318 ifdef PLATFORM_AOT_SUFFIX
319 $(the_lib
)$(PLATFORM_AOT_SUFFIX
): $(the_lib
)
320 $(Q_AOT
) MONO_PATH
='$(the_libdir_base)' > $(PROFILE
)_
$(LIBRARY_NAME
)_aot.log
2>&1 $(RUNTIME
) $(AOT_BUILD_FLAGS
) --debug
$(the_lib
)
322 all-local-aot
: $(the_lib
)$(PLATFORM_AOT_SUFFIX
)
326 makefrag
= $(depsdir
)/$(PROFILE
)_
$(LIBRARY_SUBDIR
)_
$(LIBRARY
).makefrag
327 library_CLEAN_FILES
+= $(makefrag
)
328 $(makefrag
): $(sourcefile
)
329 # @echo Creating $@ ...
330 @sed
's,^,$(build_lib): ,' $< >$@
331 @if
test ! -f
$(sourcefile
).makefrag
; then
:; else \
332 cat
$(sourcefile
).makefrag
>> $@
; \
333 echo
'$@: $(sourcefile).makefrag' >> $@
; \
334 echo
'$(sourcefile).makefrag:' >> $@
; fi
336 ifneq ($(response
),$(sourcefile
))
338 ifdef PLATFORM_excludes
339 $(response
): $(sourcefile
) $(PLATFORM_excludes
)
340 @echo Filtering
$(sourcefile
) to
$@ ...
341 @
sort $(sourcefile
) $(PLATFORM_excludes
) | uniq
-u |
$(PLATFORM_CHANGE_SEPARATOR_CMD
) >$@
343 $(response
): $(sourcefile
)
344 @echo Converting
$(sourcefile
) to
$@ ...
345 @cat
$(sourcefile
) |
$(PLATFORM_CHANGE_SEPARATOR_CMD
) >$@
352 # for now, don't give any /lib flags or set MONO_PATH, since we
353 # give a full path to the assembly.
355 ## Include corcompare stuff
356 include $(topdir
)/build
/corcompare.make
358 all-local
: $(makefrag
) $(test_makefrag
) $(btest_makefrag
)
359 ifneq ($(response
),$(sourcefile
))
360 $(response
): $(topdir
)/build
/library.make
$(depsdir
)/.stamp
362 $(makefrag
) $(test_response
) $(test_makefrag
) $(btest_response
) $(btest_makefrag
): $(topdir
)/build
/library.make
$(depsdir
)/.stamp
364 ## Documentation stuff
366 Q_MDOC_UP
=$(if
$(V
),,@echo
"MDOC-UP [$(PROFILE)] $(notdir $(@))";)
367 MDOC_UP
=$(Q_MDOC_UP
) \
368 MONO_PATH
="$(topdir)/class/lib/$(DEFAULT_PROFILE)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME
) $(topdir
)/class
/lib
/$(DEFAULT_PROFILE
)/mdoc.exe \
369 update
--delete
-o Documentation
/en
$(the_lib
)
371 doc-update-local
: $(the_libdir
)/.doc-stamp
373 $(the_libdir
)/.doc-stamp
: $(the_lib
)
375 @echo
"doc-stamp" > $@
377 # Need to be here so it comes after the definition of DEP_DIRS/DEP_LIBS
379 @echo
"$(DEPS_TARGET_DIR): $(DEP_DIRS) $(DEP_LIBS)" >> $(DEPS_FILE
)
381 # Should be $(BUILD_TOOLS_PROFILE) but still missing System.Windows.Forms
382 resx2sr
=$(topdir
)/class
/lib
/net_4_x
/resx2sr.exe
384 update-corefx-sr
: $(resx2sr
) $(RESX_RESOURCE_STRING
)
385 MONO_PATH
="$(topdir)/class/lib/$(BUILD_TOOLS_PROFILE)$(PLATFORM_PATH_SEPARATOR)$$MONO_PATH" $(RUNTIME
) $(RUNTIME_FLAGS
) $(resx2sr
) $(RESX_RESOURCE_STRING
) >corefx
/SR.cs
388 $(MAKE
) -C
$(topdir
)/tools
/resx2sr