@@ -171,6 +171,7 @@ ifeq "$(SDKROOT)" ""
171
171
else
172
172
SWIFTSDKROOT = $(SDKROOT)
173
173
endif
174
+ PYTHON ?= python3
174
175
175
176
#----------------------------------------------------------------------
176
177
# ARCHFLAG is the flag used to tell the compiler which architecture
@@ -293,23 +294,35 @@ ifeq "$(findstring -target,$(SWIFTFLAGS))" ""
293
294
SWIFTFLAGS += $(TARGET_SWIFTFLAGS)
294
295
endif
295
296
297
+ ifneq "$(SWIFT_ENABLE_EXPLICIT_MODULES)" ""
298
+ SWIFTFLAGS += -explicit-module-build
299
+ endif
300
+
296
301
# Swift bridging headers.
297
302
ifneq "$(SWIFT_BRIDGING_HEADER)" ""
303
+ # These are incompatible.
304
+ DISABLE_SWIFT_INTERFACE = YES
298
305
ifneq "$(SWIFT_PRECOMPILE_BRIDGING_HEADER)" "NO"
299
306
# With PCH.
300
- SWIFT_BRIDGING_PCH=$(patsubst %.h,%.pch,$(SWIFT_BRIDGING_HEADER))
301
- SWIFT_HFLAGS = -import-objc-header $(BUILDDIR)/$(SWIFT_BRIDGING_PCH)
307
+ SWIFT_HFLAGS = -import-objc-header $(SRCDIR)/$(SWIFT_BRIDGING_HEADER) -enable-bridging-pch -pch-output-dir $(BUILDDIR)
302
308
else
303
309
# From source.
304
- SWIFT_BRIDGING_PCH :=
305
- SWIFT_HFLAGS = -import-objc-header $(SRCDIR)/$(SWIFT_BRIDGING_HEADER)
310
+ SWIFT_HFLAGS = -import-objc-header $(SRCDIR)/$(SWIFT_BRIDGING_HEADER) -disable-bridging-pch
306
311
endif
307
312
else
308
313
# No bridging header.
309
- SWIFT_BRIDGING_PCH :=
310
314
SWIFT_HFLAGS :=
311
315
endif
312
316
317
+ # Clang headers generated from Swift sources.
318
+ ifneq "$(SWIFT_OBJC_HEADER)" ""
319
+ SWIFTFLAGS += -emit-objc-header-path $(SWIFT_OBJC_HEADER)
320
+ endif
321
+ ifneq "$(SWIFT_CXX_HEADER)" ""
322
+ SWIFTFLAGS += -emit-clang-header-path $(SWIFT_CXX_HEADER)
323
+ $(SWIFT_CXX_HEADER): $(strip $(SWIFT_SOURCES:.swift=.swift.o))
324
+ endif
325
+
313
326
ifeq "$(OS)" "Linux"
314
327
SWIFT_HOSTDIR = $(shell dirname $(SWIFTC))/../lib/swift/linux
315
328
else
@@ -467,7 +480,7 @@ endif
467
480
468
481
ifeq (1, $(USE_SYSTEM_STDLIB))
469
482
ifneq ($(or $(USE_LIBSTDCPP), $(USE_LIBCPP)),)
470
- $(error Cannot use system's standard library and a custom standard library together)
483
+ $(error Cannot use system standard library and a custom standard library together)
471
484
endif
472
485
endif
473
486
@@ -583,17 +596,17 @@ endif
583
596
# Check if we have any Swift source files
584
597
#----------------------------------------------------------------------
585
598
ifneq "$(strip $(SWIFT_SOURCES))" ""
586
- OBJECTS +=$(strip $(SWIFT_SOURCES:.swift=.o))
599
+ OBJECTS +=$(strip $(SWIFT_SOURCES:.swift=.swift. o))
587
600
USESWIFTDRIVER = 1
588
601
endif
589
602
590
603
ifneq "$(strip $(DYLIB_SWIFT_SOURCES))" ""
591
- DYLIB_OBJECTS +=$(strip $(DYLIB_SWIFT_SOURCES:.swift=.o))
604
+ DYLIB_OBJECTS +=$(strip $(DYLIB_SWIFT_SOURCES:.swift=.swift. o))
592
605
USESWIFTDRIVER = 1
593
606
endif
594
607
595
608
ifneq "$(strip $(SWIFT_SOURCES_FOR_CXX_HEADER))" ""
596
- SWIFT_CXX_HEADER =$(strip $(SWIFT_SOURCES:.swift=.o))
609
+ SWIFT_CXX_HEADER =$(strip $(SWIFT_SOURCES:.swift=.swift. o))
597
610
USESWIFTDRIVER = 1
598
611
endif
599
612
@@ -635,12 +648,12 @@ ifeq "$(SWIFT_EMBEDDED_MODE)" "1"
635
648
SWIFTFLAGS += -gdwarf-types -enable-experimental-feature Embedded -Xfrontend -disable-objc-interop -runtime-compatibility-version none
636
649
SWIFT_WMO = 1
637
650
endif
638
-
651
+
639
652
#----------------------------------------------------------------------
640
653
# Set up variables to run the Swift frontend directly.
641
654
#----------------------------------------------------------------------
642
655
SWIFT=$(shell dirname $(SWIFTC))/swift
643
- SWIFT_FEFLAGS = $(shell echo $(patsubst -Xfrontend,,$(SWIFTFLAGS)) | sed -e 's/-Xlinker [^ ]*//g') -enable-anonymous-context-mangled-names
656
+ SWIFT_FEFLAGS = $(shell echo $(patsubst -Xfrontend,,$(SWIFTFLAGS)) | sed -e 's/-Xlinker [^ ]*//g')
644
657
SWIFT_FE=$(SWIFT) -frontend
645
658
646
659
#----------------------------------------------------------------------
@@ -686,22 +699,45 @@ endif
686
699
687
700
VPATHSOURCES=$(patsubst %,$(VPATH)/%,$(SWIFT_SOURCES)) $(patsubst %,$(VPATH)/%,$(DYLIB_SWIFT_SOURCES))
688
701
689
- # Whole module optimization and primary file directives are at direct odds with each other.
690
- # Either pick one or the other.
702
+ ALL_SWIFT_SOURCES = $(SWIFT_SOURCES) $(DYLIB_SWIFT_SOURCES)
703
+ SWIFT_OBJECTS = $(strip $(ALL_SWIFT_SOURCES:.swift=.swift.o))
704
+
705
+ ifeq "$(DISABLE_SWIFT_INTERFACE)" ""
706
+ SWIFT_INTERFACE_FLAGS=-emit-module-interface-path $(BUILDDIR)/$(MODULENAME).swiftinterface
707
+ endif
708
+
691
709
ifeq "$(SWIFT_WMO)" "1"
692
- SWIFT_COMPILE_MODE_DIRECTIVE = " -wmo"
710
+ SWIFTC_OUTPUT= -wmo -o $@
693
711
else
694
- SWIFT_COMPILE_DIRECTIVE = "-primary -file"
712
+ SWIFTC_OUTPUT=-output-file-map $(BUILDDIR)/$(MODULENAME)-output -file-map.json
695
713
endif
696
714
697
- %.o: %.swift $(SWIFT_BRIDGING_PCH) $(SWIFT_OBJC_HEADER)
698
- @echo "### Compiling" $<
699
- $(SWIFT_FE) -c $(SWIFT_COMPILE_DIRECTIVE) $< \
700
- $(filter-out $(VPATH)/$<,$(filter-out $<,$(VPATHSOURCES))) \
701
- $(SWIFT_FEFLAGS) $(SWIFT_HFLAGS) $(PARSE_AS_LIBRARY) \
702
- -module-name $(MODULENAME) -emit-module-path \
703
- $(patsubst %.o,$(BUILDDIR)/%.partial.swiftmodule,$@) \
704
- -o $(BUILDDIR)/$@
715
+ # The Swift object files are named .swift.o so they don't conflict
716
+ # with the wrapped Swift module $(MODULENAME).o
717
+
718
+ $(SWIFT_OBJECTS): $(SWIFT_SOURCES) $(DYLIB_SWIFT_SOURCES)
719
+ ifneq "$(SWIFT_WMO)" "1"
720
+ @echo "### Generating output file map"
721
+ $(PYTHON) $(THIS_FILE_DIR)/gen-output-map.py $^ $(patsubst %,$(BUILDDIR)/%,$(SWIFT_OBJECTS)) >$(BUILDDIR)/$(MODULENAME)-output-file-map.json
722
+ endif
723
+ @echo "### Compiling" $^
724
+ @echo "### Swift driver expanded incovation will be:"
725
+ $(SWIFTC) -emit-object $^ $(SWIFTC_OUTPUT) \
726
+ $(SWIFTFLAGS) $(SWIFT_HFLAGS) $(PARSE_AS_LIBRARY) \
727
+ -module-name $(MODULENAME) \
728
+ -emit-module-path $(BUILDDIR)/$(MODULENAME).swiftmodule \
729
+ $(SWIFT_INTERFACE_FLAGS) -###
730
+ @echo "### Swift driver invocation:"
731
+ $(SWIFTC) -emit-object $^ $(SWIFTC_OUTPUT) \
732
+ $(SWIFTFLAGS) $(SWIFT_HFLAGS) $(PARSE_AS_LIBRARY) \
733
+ -module-name $(MODULENAME) \
734
+ -emit-module-path $(BUILDDIR)/$(MODULENAME).swiftmodule \
735
+ $(SWIFT_INTERFACE_FLAGS)
736
+ ifneq "$(OS)" "Darwin"
737
+ @echo "### Wrapping Swift module:"
738
+ $(SWIFT) -modulewrap $(BUILDDIR)/$(MODULENAME).swiftmodule \
739
+ -o $(BUILDDIR)/$(MODULENAME).o
740
+ endif
705
741
706
742
ifeq "$(OS)" "Darwin"
707
743
ifeq "$(HIDE_SWIFTMODULE)" ""
@@ -711,58 +747,21 @@ else
711
747
SWIFTMODULE =
712
748
LD_SWIFTFLAGS =
713
749
endif
714
- $(EXE): $(SWIFTMODULE) $( OBJECTS)
750
+ $(EXE): $(OBJECTS)
715
751
@echo "### Linking" $(EXE)
716
752
$(SWIFTC) $(LD_EXTRAS) $(LD_SWIFTFLAGS) $(OBJECTS) $(patsubst -g,,$(SWIFTFLAGS)) -o "$(EXE)"
717
753
ifneq "$(CODESIGN)" ""
718
754
$(CODESIGN) -s - "$(EXE)"
719
755
endif
720
756
else # OS = Linux
721
- $(EXE): $(MODULENAME).swiftmodule.o $(OBJECTS)
722
- @echo "### Linking" $(EXE)
723
- ifneq "$(HIDE_SWIFTMODULE)" ""
724
- $(SWIFTC) $(LD_EXTRAS) $(LD_SWIFTFLAGS) $(patsubst %.swiftmodule.o,,$^) $(patsubst -g,,$(SWIFTFLAGS)) -o "$(EXE)"
725
- else
726
- $(SWIFTC) $(LD_EXTRAS) $(LD_SWIFTFLAGS) $^ $(patsubst -g,,$(SWIFTFLAGS)) -o "$(EXE)"
727
- endif
728
-
729
- $(MODULENAME).swiftmodule.o: $(MODULENAME).swiftmodule
730
- @echo "### Wrapping swift module"
731
- $(SWIFT) -modulewrap $^ -o $(BUILDDIR)/$@
732
- endif
733
-
734
- $(MODULENAME).swiftmodule: $(OBJECTS) $(DYLIB_OBJECTS)
735
- @echo "### Merging swift modules for $(MODULENAME)"
736
- $(SWIFT_FE) $(SWIFT_FEFLAGS) $(SWIFT_HFLAGS) -merge-modules \
737
- -emit-module \
738
- -emit-module-interface-path $(BUILDDIR)/$(MODULENAME).swiftinterface \
739
- $(patsubst %.swift,%.partial.swiftmodule,$(SWIFT_SOURCES) $(DYLIB_SWIFT_SOURCES)) \
740
- -disable-diagnostic-passes -disable-sil-perf-optzns \
741
- -module-name $(MODULENAME) \
742
- -o $(BUILDDIR)/$@
743
-
744
- # Swift precompiled bridging headers. Don't override the Clang .pch build rule.
745
- ifneq "$(SWIFT_BRIDGING_PCH)" ""
746
- $(SWIFT_BRIDGING_PCH): $(SWIFT_BRIDGING_HEADER)
747
- @echo "### Precompiling" $<
748
- $(SWIFT_FE) -emit-pch $(SWIFT_FEFLAGS) $< -o $(BUILDDIR)/$@
757
+ ifeq "$(HIDE_SWIFTMODULE)" ""
758
+ WRAPPED_SWIFTMODULE = $(MODULENAME).o
749
759
endif
750
760
751
- # Swift Obj-C header.
752
- ifneq "$(SWIFT_OBJC_HEADER)" ""
753
- $(SWIFT_OBJC_HEADER): $(SWIFT_SOURCES) $(DYLIB_SWIFT_SOURCES)
754
- @echo "### Building Obj-C header"
755
- $(SWIFT_FE) -typecheck $(VPATHSOURCES) \
756
- $(SWIFT_FEFLAGS) $(SWIFT_HFLAGS) -module-name $(MODULENAME) \
757
- -emit-objc-header-path $(SWIFT_OBJC_HEADER)
758
- endif
761
+ $(EXE): $(OBJECTS)
762
+ @echo "### Linking" $(EXE)
763
+ $(SWIFTC) $(LD_EXTRAS) $(LD_SWIFTFLAGS) $(WRAPPED_SWIFTMODULE) $^ $(patsubst -g,,$(SWIFTFLAGS)) -o "$(EXE)"
759
764
760
- ifneq "$(SWIFT_CXX_HEADER)" ""
761
- $(SWIFT_CXX_HEADER): $(SWIFT_SOURCES) $(SWIFT_BRIDGING_PCH)
762
- @echo "### Building C++ header from Swift" $<
763
- $(SWIFT_FE) -typecheck $(VPATHSOURCES) \
764
- $(SWIFT_FEFLAGS) $(SWIFT_HFLAGS) -module-name $(MODULENAME) \
765
- $(SWIFT_CXX_HEADER_FLAGS) -emit-clang-header-path $(SWIFT_CXX_HEADER)
766
765
endif
767
766
768
767
else # USESWIFTDRIVER = 0
0 commit comments