summaryrefslogtreecommitdiff
path: root/solenv/inc/tg_shl.mk
diff options
context:
space:
mode:
authorTor Lillqvist <tlillqvist@novell.com>2011-05-23 17:15:48 +0300
committerTor Lillqvist <tlillqvist@novell.com>2011-05-23 17:33:49 +0300
commitbd9d0067a6ad22c978186a413e4ce3093e3da7d2 (patch)
tree1c6af38bd7c9370cf5bbd5b3488e2149accb6329 /solenv/inc/tg_shl.mk
parent4915eb35712e310e9a60d8d966ed789c945338a5 (diff)
Rework DLL creation code for MinGW (cross-)compilation
Don't run dlltool --output-exp to create a separate object file with just export data (.edata section). In the case where at least one function in the objects being linked has been explicitly marked for export, GNU ld will not look for export information in the object files anyway. At least the GetVersion() function seems to be marked for export explicitly. Just pass the .def file when linking. GNU ld since 2.17 supports @cmdfile syntax, just like MSVC tools, so no need to create a separate shell command file and source that. (Why that even would work better than just running the ld command with a long command line directly, I don't know.) Actually I don't know why even bother with the @cmdfile, after all we mainly intend WNTGCC to be used when cross-compiling, and there are no short command-line length restrictions on modern OSes from which one might want to cross-compile. But oh well. Pass the necessary -L switches, i.e. SOLARLIB, when linking with GNU ld. (For MSVC, the ILIB environment variable is used.) Produce the import library when linking, no need to have a separate rule to produce an import library for WNTGCC. Re-unroll tg_shl.mk into _tg_shl.mk with the recently unbroken mkunroll tool.
Diffstat (limited to 'solenv/inc/tg_shl.mk')
-rw-r--r--solenv/inc/tg_shl.mk71
1 files changed, 48 insertions, 23 deletions
diff --git a/solenv/inc/tg_shl.mk b/solenv/inc/tg_shl.mk
index e94a95241f78..12498270b778 100644
--- a/solenv/inc/tg_shl.mk
+++ b/solenv/inc/tg_shl.mk
@@ -93,8 +93,11 @@ SHL$(TNR)IMPLIB=i$(TARGET)_t$(TNR)
.ENDIF # "$(SHL$(TNR)IMPLIB)" == ""
.IF "$(COM)" != "GCC"
USE_$(TNR)IMPLIB=-implib:$(LB)/$(SHL$(TNR)IMPLIB).lib
-.ENDIF # "$(COM)" != "GCC"
SHL$(TNR)IMPLIBN=$(LB)/$(SHL$(TNR)IMPLIB).lib
+.ELSE
+SHL$(TNR)IMPLIBN=$(LB)/lib$(SHL$(TNR)IMPLIB).dll.a
+USE_$(TNR)IMPLIB=-Wl,--out-implib=$(SHL$(TNR)IMPLIBN)
+.ENDIF # "$(COM)" != "GCC"
ALLTAR : $(SHL$(TNR)IMPLIBN)
.IF "$(USE_DEFFILE)"==""
@@ -311,30 +314,54 @@ $(SHL$(TNR)TARGETN) : \
.ENDIF # "$(COM)"=="GCC"
.ENDIF # "$(SHL$(TNR)ALLRES)"!=""
.IF "$(COM)"=="GCC" # always have to call dlltool explicitly as ld cannot handle # comment in .def
- @echo $(DLLTOOL) --dllname $(SHL$(TNR)TARGET)$(DLLPOST) \
- --kill-at \\ > $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
+# GNU ld since 2.17 supports @cmdfile syntax
+.IF "$(USE_DEFFILE)"!=""
+ @$(COMMAND_ECHO)$(LINK) @$(mktmp $(strip \
+ $(SHL$(TNR)LINKFLAGS) \
+ $(LINKFLAGSSHL) \
+ $(SOLARLIB) \
+ $(MINGWSSTDOBJ) \
+ -o $@ \
+ -Wl,-Map,$(MISC)/$(@:b).map \
+ $(SHL$(TNR)DEF) \
+ $(USE_$(TNR)IMPLIB) \
+ $(STDOBJ) \
+ $(SHL$(TNR)VERSIONOBJ) $(SHL$(TNR)OBJS) \
+ $(subst,$(ROUT),$(PRJ)/$(ROUT) $(shell cat /dev/null $(SHL$(TNR)LIBS))) \
+ -Wl,--exclude-libs,ALL,--start-group $(SHL$(TNR)STDLIBS) -Wl,--end-group \
+ $(SHL$(TNR)STDSHL) $(STDSHL$(TNR)) \
+ $(SHL$(TNR)LINKRESO) \
+ ))
+.ELSE
@noop $(assign ALL$(TNR)OBJLIST:=$(STDOBJ) $(SHL$(TNR)OBJS) $(SHL$(TNR)LINKRESO) $(shell $(TYPE) /dev/null $(SHL$(TNR)LIBS) | $(SED) s?$(ROUT)?$(PRJ)/$(ROUT)?g))
.IF "$(DEFLIB$(TNR)NAME)"!="" # do not have to include objs
@noop $(assign DEF$(TNR)OBJLIST:=$(shell $(TYPE) $(foreach,i,$(DEFLIB$(TNR)NAME) $(SLB)/$(i).lib) | sed s?$(ROUT)?$(PRJ)/$(ROUT)?g))
@noop $(foreach,i,$(DEF$(TNR)OBJLIST) $(assign ALL$(TNR)OBJLIST:=$(ALL$(TNR)OBJLIST:s?$i??)))
.ENDIF # "$(DEFLIB$(TNR)NAME)"!=""
- @echo --output-exp $(MISC)/$(@:b)_exp.o \\ >> $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
-.IF "$(SHL$(TNR)DEF)"!=""
- @echo --input-def $(SHL$(TNR)DEF) \\ >> $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
-.ELSE
- @echo $(SHL$(TNR)VERSIONOBJ) $(SHL$(TNR)DESCRIPTIONOBJ) \\ >> $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
-.ENDIF
- @echo $(ALL$(TNR)OBJLIST) >> $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
- @echo $(LINK) $(LINKFLAGS) $(LINKFLAGSSHL) $(MINGWSSTDOBJ) -o $@ \
- $(STDOBJ) $(SHL$(TNR)VERSIONOBJ) $(SHL$(TNR)DESCRIPTIONOBJ) $(SHL$(TNR)OBJS) $(SHL$(TNR)LINKRESO) \
- `$(TYPE) /dev/null $(SHL$(TNR)LIBS) | $(SED) s\#$(ROUT)\#$(PRJ)/$(ROUT)\#g` \
+ $(COMMAND_ECHO)$(DLLTOOL) @@(mktmp \
+ --dllname $(SHL$(TNR)TARGET)$(DLLPOST) \
+ --kill-at \
+ --output-exp $(MISC)/$(@:b)_exp.o \
+ $(SHL$(TNR)VERSIONOBJ) \
+ @(ALL$(TNR)OBJLIST)
+ )
+ $(COMMAND_ECHO)$(LINK) @$(mktmp $(strip \
+ $(SHL$(TNR)LINKFLAGS) \
+ $(LINKFLAGSSHL) \
+ $(SOLARLIB) \
+ $(MINGWSSTDOBJ) \
+ -o $@ \
+ -Wl,-Map,$(MISC)/$(@:b).map \
+ $(MISC)/$(@:b)_exp.o \
+ $(USE_$(TNR)IMPLIB) \
+ $(STDOBJ) \
+ $(SHL$(TNR)VERSIONOBJ) $(SHL$(TNR)OBJS) \
+ $(subst,$(ROUT),$(PRJ)/$(ROUT) $(shell cat /dev/null $(SHL$(TNR)LIBS))) \
-Wl,--exclude-libs,ALL,--start-group $(SHL$(TNR)STDLIBS) -Wl,--end-group \
- $(SHL$(TNR)STDSHL) $(STDSHL$(TNR)) $(MISC)/$(@:b)_exp.o $(MINGWSSTDENDOBJ) \
- -Wl,-Map,$(MISC)/$(@:b).map >> $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
- .IF "$(VERBOSE)" == "TRUE"
- @$(TYPE) $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
- .ENDIF
- @+source $(MISC)/$(TARGET).$(@:b)_$(TNR).cmd
+ $(SHL$(TNR)STDSHL) $(STDSHL$(TNR)) \
+ $(SHL$(TNR)LINKRESO) \
+ ))
+.ENDIF
.ELSE
.IF "$(linkinc)"==""
.IF "$(SHL$(TNR)USE_EXPORTS)"!="name"
@@ -522,6 +549,7 @@ USELIB$(TNR)DEPN+=$(SHL$(TNR)LIBS)
USE_SHL$(TNR)TARGET=$(SHL$(TNR)TARGETN)
.ENDIF
+.IF "$(GUI)$(COM)" != "WNTGCC"
.IF "$(GUI)" != "UNX"
$(SHL$(TNR)IMPLIBN): \
$(SHL$(TNR)DEF) \
@@ -534,9 +562,6 @@ $(SHL$(TNR)IMPLIBN): \
.ENDIF
@echo "Making: " $(@:f)
.IF "$(GUI)" == "WNT"
-.IF "$(COM)"=="GCC"
- $(DLLTOOL) --output-lib=$(SHL$(TNR)IMPLIBN) --input-def=$(SHL$(TNR)DEF)
-.ELSE # "$(COM)=="GCC"
# bei use_deffile implib von linker erstellt
.IF "$(USE_DEFFILE)"==""
$(IMPLIB) $(IMPLIBFLAGS) @$(mktmp -out:$(SHL$(TNR)IMPLIBN) \
@@ -545,7 +570,6 @@ $(SHL$(TNR)IMPLIBN): \
@echo build of $(SHL$(TNR)TARGETN) creates $@
@$(TOUCH) $@
.ENDIF # "$(USE_DEFFILE)==""
-.ENDIF # "$(COM)"=="GCC"
.ELSE
@echo no ImportLibs on Mac and *ix
@@ -553,6 +577,7 @@ $(SHL$(TNR)IMPLIBN): \
@$(TOUCH) $@
.ENDIF
.ENDIF
+.ENDIF
# unroll end
#######################################################