makelib/config-linux.make
author Jan Vrany <jan.vrany@fit.cvut.cz>
Thu, 03 Aug 2017 09:37:46 +0100
changeset 135 0325651d2b43
parent 126 9cd66b79ca54
child 150 6525662ac35f
permissions -rw-r--r--
Makefiles: use our own makefiles rather than eXept's ...found in `stx/rules`. eXept's makefiles doesn't really fit Smalltalk/X jv-branch needs - they're cluttered with workarounds for long unsupported tools and platforms. In the past we had to monkey-patch them here and there. From this commit on, building requires GNU Make on UNUX-like and GCC or Clang toolchain on both UNIX-like and Windows. There we use MSYS2 environment. This is a followup for 6fcb351d23a7.

#------------------ start of linux-elf/COMMON/defines ---------------------
#
# $Header: /cvs/stx/stx/configurations/linux-elf/COMMON/defines,v 1.92 2016-07-19 19:56:46 stefan Exp $
include $(MAKELIB)/config.make

CONF_VENDOR=linux

ARCH=linux
ARCH_NAME=linux_elf
DISTRIB_NAME=demoLinuxELF

CCARCHCOMMONOPT=-DELF
#RELOCINSTVARS=+relocInstvars

INTERN_H=linuxIntern.h
CPU_INTERN_H=cpu_i386.h
CPUINTERN_H=$(INCLUDE)/linuxIntern.h

MAKEFILE_EXTENSION=linux-elf
TARGET_RULE_EXTENSION=_shared
# ALL_TARGET=LINUX_i386_ELF

MAKEFLAGS += --no-print-directory
MAKE_INCLUDE=include
INSTALL=install
INSTALL_BIN_CMD=install -s -m 0755
INSTALL_SCRIPT_CMD=install -m 0755
COMPRESSOR=gzip
COMPRESSED_FILETYPE=targz
SETUP_RULE=setup_linux

CC=gcc

#
# * `-fno-strict-aliasing` since it's almost impossible to write a memory
#   manager without breaking C's aliasing rules. Better be on a safe side.
#   Nice post about these things: http://blog.regehr.org/archives/1307
#
# * `-Wno-strict-aliasing` to turn of warnings about breaking aliasing rules. 
#   While one would think these wanings should be turned off when 
#   `-fno-strict-aliasing` is passed, apparently some GCCs bark anyway. 
#
# * `-fno-stack-protector` is (was) required on Ubuntu brands where it's 
#   by default on. Smalltalk/X green thread implementation does not wotk
#   well with it. 
#
# * `-U_FORTIFY_SOURCE` is (was) required on Gentoo as a workaround for failing 
#   longjmp check when _FORTIFY_SOURCE is defined (which is enabled by default 
#   on Gentoo. Remove when fixed.
#
OPT=-fPIC -O2 -fno-strict-aliasing -Wno-strict-aliasing -fno-stack-protector -ggdb3 -pipe -U_FORTIFY_SOURCE

STC_LEXLIB=

OS=-DLINUX

FFI_ARCH=x86
FFI_CFLAGS=
FFI_DIR=libffi-3.0.10rc8
FFI_OBJS=$(FFI_DIR)/build/src/*.o $(FFI_DIR)/build/src/x86/*.o
OPTIONAL_HAVE_FFI_ARG=-DHAVE_FFI -I$(TOP)/librun/$(FFI_DIR)/build/include
OPTIONAL_FFI_TARGET_IN_LIBRUN=ffi
FFI_CC="gcc -m32"
FFI_LD='ld -m elf_i386'

OBJNAME=.o
BIN_O=.so
O_EXT=.so
SA_EXT=.so
SO_NAME=.so

#
# use static librt for clock_gettime().
# dynamic librt causes libpthread to be loaded that does not
# work with stx' stack layout
#

OTHERLIBS=-ldl -Wl,-Bstatic,-lrt,-Bdynamic
OTHERLIBS=-ldl -lrt
OTHERLIBS=-ldl -lrt -lc
STATIC_OTHERLIBS=
LDFLAGS=-Llib -L/usr/local/lib -L/usr/X11/lib \
	-Wl,-z,now,-rpath,'$$ORIGIN',-rpath,'$$ORIGIN/lib',-rpath,'$$ORIGIN/../lib',--wrap=memcpy

SPECIAL_LIBRUN_RULE=allLINUX
LIBRUNTARGET=librun.so

FORCE_LINK_LIBRUN=1

# mhm - these should now only be in libview!
LIBVIEW_EXTRA_TARGETS=$(WORKSTAT1).so $(WORKSTAT2).so

ARCH_LIBSNMP=$(TOP)/libsnmp
ARCH_CLASSLIBDIRS=$(ARCH_LIBSNMP)

#
# where are the X libraries if we need them:
#
XDEFS=-DSHAPE -DXINERAMA -DXFT -DHAVE_FONTCONFIG
XINCLUDE+=$(shell pkg-config --cflags xft)

LIB_X=-lX11
LIB_XEXT=-lXext
LIB_XT= -lXt
LIB_XAW=-lXaw
LIB_XMU=-lXmu
LIB_XMU=-lXt
LIB_XINERAMA=-lXinerama
LIB_XFT=$(shell pkg-config --libs xft)

EXTRA_LIBS= -lX11 -lXext
STATIC_EXTRA_LIBS= -lX11 -lXext

X_LIB_DIR=/usr/X11/lib
JPEGLIB_LD_ARG=
LIBJPEG_DIR=$(TOP)/support/libjpeg-9
JPEG_INCLUDE=-I$(LIBJPEG_DIR)

LIBJPEG=$(LIBJPEG_DIR)/.libs/libjpeg.a
LIBJPEG_FOR_COPY=$(LIBJPEG_DIR)/.libs/libjpeg.a
LIBJPEG_FOR_LINK=$(LIBJPEG_DIR)/.libs/libjpeg.a

#
# a netsnmp library
#
# if already in /usr/lib:
# DYNAMIC_LINK_LIB_NETSNMP=-lnetsnmp
# STATIC_LINK_LIB_NETSNMP=
# TARGET_LIB_NETSNMP=
#
# if a local one should be built and used:
DYNAMIC_LINK_LIB_NETSNMP=-L$(NETSNMP_LIBDIR)/.libs -L$(NETSNMP_LIBDIR) $(NETSNMP_LIBDIR)/.libs/libnetsnmp.a -lrt
STATIC_LINK_LIB_NETSNMP=
TARGET_LIB_NETSNMP=snmplib


STATIC_LIB_X   =$(X_LIB_DIR)/libX11.a
STATIC_LIB_XEXT=$(X_LIB_DIR)/libXext.a
STATIC_LIB_XT  =$(X_LIB_DIR)/libXt.a
STATIC_LIB_XAW =$(X_LIB_DIR)/libXaw.a
STATIC_LIB_XMU =$(X_LIB_DIR)/libXmu.a

# the following defs are for using the system's usb lib (only needed in some apps);
USB_LIB_DIR=
USB_LIB_ARG=-lusb
USB_LIB_DIR_ARG=-L/usr/lib
USB_MAKE_TARGET=

MATRIXLOCK_DIR=$(TOP)/../exept/setup/ml
MATRIXLOCK_LIB_ARG=-L$(MATRIXLOCK_DIR)/lib -lmxlin260 -lusb

NOSTDLIB=-nostdlib

#
# an extra rule for shared objects
#
.SUFFIXES: .a .o .so
# use -nostdlib in combination with -lc -lgcc: we actually use some functions (like fstat) from libc (-lc)
# and gcc (-lgcc) provides some low level routines that should be around
.o.so:
	@-rm -f $*.so
	$(LD) $(NOSTDLIB) -shared $(LDFLAGS) -o $*.so $*.o $(LOCAL_SHARED_LIBS) $(EXTRA_SHARED_LIBS) -lc -lgcc

.a.so:
	rm -f $*.so
	rm -rf tmp.a.so
	mkdir tmp.a.so
	cd tmp.a.so; $(AR) x ../$*.a
	@-rm -f $*.so
	$(LD) $(NOSTDLIB) -shared $(LDFLAGS) -o $*.so tmp.a.so/*.o $(LOCAL_SHARED_LIBS) $(EXTRA_SHARED_LIBS) -lc -lgcc
	rm -rf tmp.a.so

SHAREDLIBRULE=linuxSharedLib
linuxSharedLib:
	@-rm -f $(LIB)
	$(LD) $(NOSTDLIB) -shared $(LDFLAGS) -o $(LIB) $(OBJS) $(LOCAL_SHARED_LIBS) $(EXTRA_SHARED_LIBS) -lc -lgcc

#.st.s2:
#       $(STC) $(STCFLAGS) $(CFLAGS) -C $*.st
#       $(CC) $(CFLAGS) -S $*.c
#       @-echo " stripping off useless .align directives ..."
#       sed "/.align 4/d" < $*.s > $*.s2

#.SUFFIXES: .s2 .s3
#
#.s2.s3:
#       @-echo "   removing useless jumps ..."
#       awk -f $(TOP)/rules/i386.script.awk < $*.s2 > $*.s3

#
# extra rules for space-optimized/speed-optimized modules modules
#
.SUFFIXES: .st .spc .spd

.st.spc:
	$(MAKE) STC_OPT="$(STC_OPT)" OPT="$(OPT)" STCOPT="$(STCOPT)" STFILE=$* KEEP=y __SPACEOPT_O_RULE__

.st.spd:
	$(MAKE) STC_OPT="$(STC_OPT)" OPT="$(OPT)" STCOPT="$(STCOPT)" STFILE=$* KEEP=y __SPEEDOPT_O_RULE__

VERYBIG_STFILE_RULE=__VERYBIG_RULE__
__VERYBIG_RULE__:
	$(MAKE) $(O_RULE) STFILE=$(BIG_FILE) CC="$(CC)" STC_OPT="$(STC_OPT) -Os" OPT="$(OPT) -Os" SEPINITCODE="$(SEPINITCODE)"

LONGNAME_RULE=__NORMAL_RULE2__
__NORMAL_RULE2__:
	$(MAKE) $(O_RULE) STFILE=$(LONGNAME_FILE) CC="$(CC)" STC_OPT="$(STC_OPT)" OPT="$(OPT)" SEPINITCODE="$(SEPINITCODE)"


#AWK_VERBOSE=1
AWK_DIFF=
AWK_FIX=$(TOP)/rules/i386fixELF.awk

SPACEOPT_O_RULE=__SPACEOPT_O_RULE__
__SPACEOPT_O_RULE__:
	@$(MAKE) STC=$(STC) CC=$(CC) STCOPT="$(STCOPT)" SEPINITCODE="$(SEPINITCODE)" $(STFILE).s
	@-if [ -f $(STFILE).s ]; then \
	    awk -f $(AWK_FIX) < $(STFILE).s > $(STFILE).s2; \
	    if [ "$(AWK_DIFF)" != "" ]; then \
		diff $(STFILE).s $(STFILE).s2; \
	    fi; \
	    if [ "$(AWK_VERBOSE)" != "" ]; then \
		echo "# optimized $(STFILE).s -> $(STFILE).s2"; \
		tail -5 $(STFILE).s2; \
		echo; \
	    fi; \
	    $(AS) $(ASFLAGS) -o $(STFILE).o $(STFILE).s2; \
	fi
	@-if [ -f i_$(STFILE).s ]; then \
	    awk -f $(AWK_FIX) < i_$(STFILE).s > i_$(STFILE).s2; \
	    if [ "$(AWK_DIFF)" != "" ]; then \
		diff i_$(STFILE).s i_$(STFILE).s2; \
	    fi; \
	    if [ "$(AWK_VERBOSE)" != "" ]; then \
		echo "# optimized i_$(STFILE).s -> i_$(STFILE).s2"; \
		tail -5 i_$(STFILE).s2; \
		echo; \
	    fi; \
	    $(AS) $(ASFLAGS) -o i_$(STFILE).o i_$(STFILE).s2; \
	fi
	@if [ "$(KEEP)" != "y" ]; then \
	    rm -f $(STFILE).s $(STFILE).s2 i_$(STFILE).s i_$(STFILE).s2; \
	fi


.SUFFIXES: .st .s2

.st.s2:
	@$(MAKE) $(SPEEDOPT_O_RULE) STCOPT="$(STCOPT)" KEEP=y STFILE=$* SEPINITCODE="$(SEPINITCODE)"

SPEEDOPT_O_RULE=__SPEEDOPT_O_RULE__
__SPEEDOPT_O_RULE__:
	@$(MAKE) STC=$(STC) CC=$(CC) STCOPT="$(STCOPT)" SEPINITCODE="$(SEPINITCODE)" $(STFILE).s
	@-if [ -f $(STFILE).s ]; then \
	    awk -f $(AWK_FIX) < $(STFILE).s > $(STFILE).s2; \
	    if [ "$(AWK_DIFF)" != "" ]; then \
		diff $(STFILE).s $(STFILE).s2; \
	    fi; \
	    if [ "$(AWK_VERBOSE)" != "" ]; then \
		echo "# optimized $(STFILE).s -> $(STFILE).s2"; \
		tail -5 $(STFILE).s2; \
		echo; \
	    fi; \
	    $(AS) $(ASFLAGS) -o $(STFILE).o $(STFILE).s2; \
	fi
	@-if [ -f i_$(STFILE).s ]; then \
	    awk -f $(AWK_FIX) < i_$(STFILE).s > i_$(STFILE).s2; \
	    if [ "$(AWK_DIFF)" != "" ]; then \
		diff i_$(STFILE).s i_$(STFILE).s2; \
	    fi; \
	    if [ "$(AWK_VERBOSE)" != "" ]; then \
		echo "# optimized i_$(STFILE).s -> i_$(STFILE).s2"; \
		tail -5 i_$(STFILE).s2; \
		echo; \
	    fi; \
	    $(AS) $(ASFLAGS) -o i_$(STFILE).o i_$(STFILE).s2; \
	fi
	@if [ "$(KEEP)" != "y" ]; then \
	    rm -f $(STFILE).s $(STFILE).s2 i_$(STFILE).s i_$(STFILE).s2; \
	fi

O_RULE=$(SPEEDOPT_O_RULE)

#------------------ end of linux-elf/COMMON/defines ---------------------