From ec41632b536fbab63ce732a2439b38ae1c32b095 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 15 Nov 2011 17:54:41 +0200 Subject: Add support for building MinWG shared libraries with GCC --- build/c/gnu/configuration-rules.make | 3 ++- build/c/gnu/configure | 37 +++++++++++++++++++++++++++++++++--- build/c/gnu/o-l.make | 22 +++++++++++++++++++++ build/cxx/gnu/configure | 33 ++++++++++++++++++++++++++++---- build/cxx/gnu/o-l.make | 22 +++++++++++++++++++++ 5 files changed, 109 insertions(+), 8 deletions(-) diff --git a/build/c/gnu/configuration-rules.make b/build/c/gnu/configuration-rules.make index 63f8af4..192519b 100644 --- a/build/c/gnu/configuration-rules.make +++ b/build/c/gnu/configuration-rules.make @@ -4,7 +4,8 @@ # license : GNU GPL v2; see accompanying LICENSE file $(dcf_root)/c/gnu/configuration-dynamic.make: | $(dcf_root)/c/gnu/. - $(call message,,$(bld_root)/c/gnu/configure $@ $(c_optimize)) + $(call message,,$(bld_root)/c/gnu/configure $@ $(c_optimize) \ +"$(c_extra_options)" "$(c_ld_extra_options)") ifndef %foreign% diff --git a/build/c/gnu/configure b/build/c/gnu/configure index dad0904..827b558 100755 --- a/build/c/gnu/configure +++ b/build/c/gnu/configure @@ -7,6 +7,8 @@ # $1 out file # $2 optimize (y/n) +# $3 c_extra_options +# $4 c_ld_extra_options # # bld_root - build root # project_name - project name @@ -27,8 +29,32 @@ $echo "'/usr/local/bin/gcc' or 'distcc gcc'." $echo c_gnu=`read_path --command gcc` -c_gnu_libraries=`$c_gnu -print-search-dirs | sed -e 's/libraries: =//p' -e d` +# Pass c_extra_options and c_ld_extra_options since those can affect the +# search paths (e.g., -m32) and target. +# +c_gnu_libraries=`$c_gnu $3 $4 -print-search-dirs | sed -e 's/libraries: =//p' -e d` + +c_gnu_target=`$c_gnu $3 $4 -dumpmachine` +c_gnu_target=`$bld_root/system/config.sub "$c_gnu_target"` + +if [ $? != 0 ]; then + $echo "unable to canonicalize target system '$c_gnu_target'" + exit 1 +fi + +c_gnu_target_cpu=`echo $c_gnu_target | cut -f 1 -d -` +c_gnu_target_mf=`echo $c_gnu_target | cut -f 2 -d -` +c_gnu_target_kernel=`echo $c_gnu_target | cut -f 3 -d -` +c_gnu_target_os=`echo $c_gnu_target | cut -f 4 -d -` + +if [ -z "$c_gnu_target_os" ]; then + + # Old format: cpu-mf-os + # + c_gnu_target_os=$c_gnu_target_kernel + c_gnu_target_kernel= +fi optimization= @@ -50,6 +76,11 @@ if [ "$2" == "y" ]; then fi -echo "c_gnu := $c_gnu" > $1 -echo "c_gnu_libraries := $c_gnu_libraries" >> $1 +echo "c_gnu := $c_gnu" > $1 +echo "c_gnu_libraries := $c_gnu_libraries" >> $1 echo "c_gnu_optimization_options := $optimization" >> $1 +echo "c_gnu_target := $c_gnu_target" >> $1 +echo "c_gnu_target_cpu := $c_gnu_target_cpu" >> $1 +echo "c_gnu_target_mf := $c_gnu_target_mf" >> $1 +echo "c_gnu_target_kernel := $c_gnu_target_kernel" >> $1 +echo "c_gnu_target_os := $c_gnu_target_os" >> $1 diff --git a/build/c/gnu/o-l.make b/build/c/gnu/o-l.make index a532908..aeba3a9 100644 --- a/build/c/gnu/o-l.make +++ b/build/c/gnu/o-l.make @@ -42,9 +42,13 @@ $(out_base)/%.l.o.clean: else +mingw := $(if $(filter $(c_gnu_target_os),mingw32 mingw64),y,n) + $(out_base)/%.l: ld := $(c_gnu) $(out_base)/%.l: ld_options := $(c_gnu_optimization_options) $(c_gnu_debugging_options) +ifeq ($(mingw),n) $(out_base)/%.l: c_pic_options := -fPIC +endif $(out_base)/%.l: comma_ := , $(out_base)/%.l: expand-l = $(if $(subst n,,$(c_rpath)),\ @@ -56,6 +60,9 @@ $(out_base)/%.l: else $(out_base)/%.l: | $$(dir $$@). endif +ifeq ($(mingw),n) +# Standard version. +# $(call message,ld $@,$(ld) -shared \ $(c_extra_options) $(ld_options) $(c_ld_extra_options) \ -o $(@D)/lib$(basename $(@F)).so -Wl$(comma_)-soname=lib$(basename $(@F)).so \ @@ -63,9 +70,24 @@ $(foreach f,$^,$(if $(patsubst %.l,,$f),$f,$(call expand-l,$f))) $(c_extra_libs) $(call message,,echo "$(@D)/lib$(basename $(@F)).so" >$@) $(call message,,echo "rpath:$(@D)" >>$@) $(call message,,echo "$(patsubst %.l,`cat %.l`,$(filter %.a %.so %.l,$^))" | xargs -n 1 echo >>$@) +else +# MinGW version. +# + $(call message,ld $@,$(ld) -shared \ +$(c_extra_options) $(ld_options) $(c_ld_extra_options) \ +-o $(@D)/$(basename $(@F)).dll -Wl$(comma_)--out-implib$(comma_)$(@D)/lib$(basename $(@F)).a \ +$(foreach f,$^,$(if $(patsubst %.l,,$f),$f,$(call expand-l,$f))) $(c_extra_libs)) + $(call message,,echo "$(@D)/lib$(basename $(@F)).a" >$@) + $(call message,,echo "rpath:$(@D)" >>$@) + $(call message,,echo "$(patsubst %.l,`cat %.l`,$(filter %.a %.l,$^))" | xargs -n 1 echo >>$@) +endif $(out_base)/%.l.o.clean: +ifeq ($(mingw),n) $(call message,rm $$1,rm -f $$1 $(@D)/$(patsubst %.l.o.clean,lib%.so,$(@F)),$(basename $(basename $@))) +else + $(call message,rm $$1,rm -f $$1 $(@D)/$(patsubst %.l.o.clean,%.dll,$(@F)) $(@D)/$(patsubst %.l.o.clean,lib%.a,$(@F)),$(basename $(basename $@))) +endif endif endif diff --git a/build/cxx/gnu/configure b/build/cxx/gnu/configure index bda4bdb..7e5820e 100755 --- a/build/cxx/gnu/configure +++ b/build/cxx/gnu/configure @@ -31,10 +31,30 @@ $echo cxx_gnu=`read_path --command g++` # Pass cxx_extra_options and cxx_ld_extra_options since those -# can affect the search paths (e.g., -m32). +# can affect the search paths (e.g., -m32) and target. # cxx_gnu_libraries=`$cxx_gnu $3 $4 -print-search-dirs | sed -e 's/libraries: =//p' -e d` +cxx_gnu_target=`$cxx_gnu $3 $4 -dumpmachine` +cxx_gnu_target=`$bld_root/system/config.sub "$cxx_gnu_target"` + +if [ $? != 0 ]; then + $echo "unable to canonicalize target system '$cxx_gnu_target'" + exit 1 +fi + +cxx_gnu_target_cpu=`echo $cxx_gnu_target | cut -f 1 -d -` +cxx_gnu_target_mf=`echo $cxx_gnu_target | cut -f 2 -d -` +cxx_gnu_target_kernel=`echo $cxx_gnu_target | cut -f 3 -d -` +cxx_gnu_target_os=`echo $cxx_gnu_target | cut -f 4 -d -` + +if [ -z "$cxx_gnu_target_os" ]; then + + # Old format: cpu-mf-os + # + cxx_gnu_target_os=$cxx_gnu_target_kernel + cxx_gnu_target_kernel= +fi optimization= @@ -56,6 +76,11 @@ if [ "$2" == "y" ]; then fi -echo "cxx_gnu := $cxx_gnu" > $1 -echo "cxx_gnu_libraries := $cxx_gnu_libraries" >> $1 -echo "cxx_gnu_optimization_options := $optimization" >> $1 +echo "cxx_gnu := $cxx_gnu" > $1 +echo "cxx_gnu_libraries := $cxx_gnu_libraries" >> $1 +echo "cxx_gnu_optimization_options := $optimization" >> $1 +echo "cxx_gnu_target := $cxx_gnu_target" >> $1 +echo "cxx_gnu_target_cpu := $cxx_gnu_target_cpu" >> $1 +echo "cxx_gnu_target_mf := $cxx_gnu_target_mf" >> $1 +echo "cxx_gnu_target_kernel := $cxx_gnu_target_kernel" >> $1 +echo "cxx_gnu_target_os := $cxx_gnu_target_os" >> $1 diff --git a/build/cxx/gnu/o-l.make b/build/cxx/gnu/o-l.make index 9a2e129..e27927c 100644 --- a/build/cxx/gnu/o-l.make +++ b/build/cxx/gnu/o-l.make @@ -42,10 +42,14 @@ $(out_base)/%.l.o.clean: else +mingw := $(if $(filter $(cxx_gnu_target_os),mingw32 mingw64),y,n) + $(out_base)/%.l: ld := $(cxx_gnu) $(out_base)/%.l: ld_options := $(cxx_gnu_optimization_options) $(cxx_gnu_debugging_options) +ifeq ($(mingw),n) $(out_base)/%.l: c_pic_options := -fPIC $(out_base)/%.l: cxx_pic_options := -fPIC +endif $(out_base)/%.l: comma_ := , $(out_base)/%.l: expand-l = $(if $(subst n,,$(cxx_rpath)),\ @@ -57,6 +61,9 @@ $(out_base)/%.l: else $(out_base)/%.l: | $$(dir $$@). endif +ifeq ($(mingw),n) +# Standard version. +# $(call message,ld $@,$(ld) -shared \ $(cxx_extra_options) $(ld_options) $(cxx_ld_extra_options) \ -o $(@D)/lib$(basename $(@F)).so -Wl$(comma_)-soname=lib$(basename $(@F)).so \ @@ -64,9 +71,24 @@ $(foreach f,$^,$(if $(patsubst %.l,,$f),$f,$(call expand-l,$f))) $(cxx_extra_lib $(call message,,echo "$(@D)/lib$(basename $(@F)).so" >$@) $(call message,,echo "rpath:$(@D)" >>$@) $(call message,,echo "$(patsubst %.l,`cat %.l`,$(filter %.a %.so %.l,$^))" | xargs -n 1 echo >>$@) +else +# MinGW version. +# + $(call message,ld $@,$(ld) -shared \ +$(cxx_extra_options) $(ld_options) $(cxx_ld_extra_options) \ +-o $(@D)/$(basename $(@F)).dll -Wl$(comma_)--out-implib$(comma_)$(@D)/lib$(basename $(@F)).a \ +$(foreach f,$^,$(if $(patsubst %.l,,$f),$f,$(call expand-l,$f))) $(cxx_extra_libs)) + $(call message,,echo "$(@D)/lib$(basename $(@F)).a" >$@) + $(call message,,echo "rpath:$(@D)" >>$@) + $(call message,,echo "$(patsubst %.l,`cat %.l`,$(filter %.a %.l,$^))" | xargs -n 1 echo >>$@) +endif $(out_base)/%.l.o.clean: +ifeq ($(mingw),n) $(call message,rm $$1,rm -f $$1 $(@D)/$(patsubst %.l.o.clean,lib%.so,$(@F)),$(basename $(basename $@))) +else + $(call message,rm $$1,rm -f $$1 $(@D)/$(patsubst %.l.o.clean,%.dll,$(@F)) $(@D)/$(patsubst %.l.o.clean,lib%.a,$(@F)),$(basename $(basename $@))) +endif endif endif -- cgit v1.1