tcc: early OSX native support
- build scripts - working '-run' mode, e.g.: ./tcc -B. -I./include -I. -I.. -D_ANSI_SOURCE -run examples/ex1.c Note: we don't bother parsing Mach-O/Fat images yet. We blindly dlopen the image. Signed-off-by: Andrei Warkentin <andrey.warkentin@gmail.com>
This commit is contained in:
parent
0ac29b53dc
commit
91cd148a05
4 changed files with 48 additions and 4 deletions
22
Makefile
22
Makefile
|
@ -36,6 +36,21 @@ ifdef CONFIG_WIN32
|
||||||
endif
|
endif
|
||||||
CFGWIN = -win
|
CFGWIN = -win
|
||||||
NATIVE_TARGET = $(ARCH)-$(if $(eq $(ARCH),arm),wince,win32)
|
NATIVE_TARGET = $(ARCH)-$(if $(eq $(ARCH),arm),wince,win32)
|
||||||
|
else ifdef CONFIG_OSX
|
||||||
|
LIBS=-lm
|
||||||
|
ifndef CONFIG_NOLDL
|
||||||
|
LIBS+=-ldl
|
||||||
|
endif
|
||||||
|
# make libtcc as static or dynamic library?
|
||||||
|
ifeq ($(DISABLE_STATIC),yes)
|
||||||
|
LIBTCC=libtcc.dylib
|
||||||
|
ifndef DISABLE_RPATH
|
||||||
|
LINK_LIBTCC += -Wl,-rpath,"$(libdir)"
|
||||||
|
export LD_LIBRARY_PATH := $(CURDIR)/$(TOP)
|
||||||
|
endif
|
||||||
|
endif
|
||||||
|
CFGWIN =-unx
|
||||||
|
NATIVE_TARGET = $(ARCH)-osx
|
||||||
else
|
else
|
||||||
LIBS=-lm
|
LIBS=-lm
|
||||||
ifndef CONFIG_NOLDL
|
ifndef CONFIG_NOLDL
|
||||||
|
@ -72,6 +87,7 @@ CONFIG_$(ARCH) = yes
|
||||||
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
NATIVE_DEFINES_$(CONFIG_i386) += -DTCC_TARGET_I386
|
||||||
NATIVE_DEFINES_$(CONFIG_x86_64) += -DTCC_TARGET_X86_64
|
NATIVE_DEFINES_$(CONFIG_x86_64) += -DTCC_TARGET_X86_64
|
||||||
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
NATIVE_DEFINES_$(CONFIG_WIN32) += -DTCC_TARGET_PE
|
||||||
|
NATIVE_DEFINES_$(CONFIG_OSX) += -DTCC_TARGET_X86_64 -DTCC_TARGET_MACHO
|
||||||
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
NATIVE_DEFINES_$(CONFIG_uClibc) += -DTCC_UCLIBC
|
||||||
NATIVE_DEFINES_$(CONFIG_musl) += -DTCC_MUSL
|
NATIVE_DEFINES_$(CONFIG_musl) += -DTCC_MUSL
|
||||||
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
NATIVE_DEFINES_$(CONFIG_arm) += -DTCC_TARGET_ARM
|
||||||
|
@ -92,11 +108,11 @@ TCCDOCS = tcc.1 tcc-doc.html tcc-doc.info
|
||||||
all: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
all: $(PROGS) $(TCCLIBS) $(TCCDOCS)
|
||||||
|
|
||||||
# cross compiler targets to build
|
# cross compiler targets to build
|
||||||
TCC_X = i386 x86_64 i386-win32 x86_64-win32 arm arm64 arm-wince c67
|
TCC_X = i386 x86_64 i386-win32 x86_64-win32 x86_64-osx arm arm64 arm-wince c67
|
||||||
# TCC_X += arm-fpa arm-fpa-ld arm-vfp arm-eabi
|
# TCC_X += arm-fpa arm-fpa-ld arm-vfp arm-eabi
|
||||||
|
|
||||||
# cross libtcc1.a targets to build
|
# cross libtcc1.a targets to build
|
||||||
LIBTCC1_X = i386 x86_64 i386-win32 x86_64-win32 arm arm64 arm-wince
|
LIBTCC1_X = i386 x86_64 i386-win32 x86_64-win32 x86_64-osx arm arm64 arm-wince
|
||||||
|
|
||||||
PROGS_CROSS = $(foreach X,$(TCC_X),$X-tcc$(EXESUF))
|
PROGS_CROSS = $(foreach X,$(TCC_X),$X-tcc$(EXESUF))
|
||||||
LIBTCC1_CROSS = $(foreach X,$(LIBTCC1_X),libtcc1-$X.a)
|
LIBTCC1_CROSS = $(foreach X,$(LIBTCC1_X),libtcc1-$X.a)
|
||||||
|
@ -123,6 +139,7 @@ DEF-i386 = -DTCC_TARGET_I386
|
||||||
DEF-x86_64 = -DTCC_TARGET_X86_64
|
DEF-x86_64 = -DTCC_TARGET_X86_64
|
||||||
DEF-i386-win32 = -DTCC_TARGET_PE -DTCC_TARGET_I386
|
DEF-i386-win32 = -DTCC_TARGET_PE -DTCC_TARGET_I386
|
||||||
DEF-x86_64-win32= -DTCC_TARGET_PE -DTCC_TARGET_X86_64
|
DEF-x86_64-win32= -DTCC_TARGET_PE -DTCC_TARGET_X86_64
|
||||||
|
DEF-x86_64-osx = -DTCC_TARGET_MACHO -DTCC_TARGET_X86_64
|
||||||
DEF-arm-wince = -DTCC_TARGET_PE -DTCC_TARGET_ARM -DTCC_ARM_EABI -DTCC_ARM_VFP -DTCC_ARM_HARDFLOAT
|
DEF-arm-wince = -DTCC_TARGET_PE -DTCC_TARGET_ARM -DTCC_ARM_EABI -DTCC_ARM_VFP -DTCC_ARM_HARDFLOAT
|
||||||
DEF-arm64 = -DTCC_TARGET_ARM64
|
DEF-arm64 = -DTCC_TARGET_ARM64
|
||||||
DEF-c67 = -DTCC_TARGET_C67 -w # disable warnigs
|
DEF-c67 = -DTCC_TARGET_C67 -w # disable warnigs
|
||||||
|
@ -160,6 +177,7 @@ i386_FILES = $(CORE_FILES) i386-gen.c i386-link.c i386-asm.c i386-asm.h i386-tok
|
||||||
i386-win32_FILES = $(i386_FILES) tccpe.c
|
i386-win32_FILES = $(i386_FILES) tccpe.c
|
||||||
x86_64_FILES = $(CORE_FILES) x86_64-gen.c x86_64-link.c i386-asm.c x86_64-asm.h
|
x86_64_FILES = $(CORE_FILES) x86_64-gen.c x86_64-link.c i386-asm.c x86_64-asm.h
|
||||||
x86_64-win32_FILES = $(x86_64_FILES) tccpe.c
|
x86_64-win32_FILES = $(x86_64_FILES) tccpe.c
|
||||||
|
x86_64-osx_FILES = $(x86_64_FILES)
|
||||||
arm_FILES = $(CORE_FILES) arm-gen.c arm-link.c arm-asm.c
|
arm_FILES = $(CORE_FILES) arm-gen.c arm-link.c arm-asm.c
|
||||||
arm-wince_FILES = $(arm_FILES) tccpe.c
|
arm-wince_FILES = $(arm_FILES) tccpe.c
|
||||||
arm64_FILES = $(CORE_FILES) arm64-gen.c arm64-link.c
|
arm64_FILES = $(CORE_FILES) arm64-gen.c arm64-link.c
|
||||||
|
|
8
configure
vendored
8
configure
vendored
|
@ -37,6 +37,7 @@ cygwin="no"
|
||||||
gprof="no"
|
gprof="no"
|
||||||
bigendian="no"
|
bigendian="no"
|
||||||
mingw32="no"
|
mingw32="no"
|
||||||
|
osx="no"
|
||||||
LIBSUF=".a"
|
LIBSUF=".a"
|
||||||
EXESUF=""
|
EXESUF=""
|
||||||
DLLSUF=".so"
|
DLLSUF=".so"
|
||||||
|
@ -52,6 +53,7 @@ cpu=
|
||||||
# OS specific
|
# OS specific
|
||||||
targetos=`uname`
|
targetos=`uname`
|
||||||
case $targetos in
|
case $targetos in
|
||||||
|
Darwin) osx=yes;;
|
||||||
MINGW*) mingw32=yes;;
|
MINGW*) mingw32=yes;;
|
||||||
MSYS*) mingw32=yes;;
|
MSYS*) mingw32=yes;;
|
||||||
CYGWIN*) mingw32=yes; cygwin=yes; cross_prefix="mingw32-";;
|
CYGWIN*) mingw32=yes; cygwin=yes; cross_prefix="mingw32-";;
|
||||||
|
@ -256,6 +258,9 @@ else
|
||||||
if test x"$tccdir" = x""; then
|
if test x"$tccdir" = x""; then
|
||||||
tccdir="${libdir}/tcc"
|
tccdir="${libdir}/tcc"
|
||||||
fi
|
fi
|
||||||
|
if test "$osx" = "yes" ; then
|
||||||
|
DLLSUF=".dylib"
|
||||||
|
fi
|
||||||
fi # mingw32
|
fi # mingw32
|
||||||
|
|
||||||
if test x"$includedir" = x""; then
|
if test x"$includedir" = x""; then
|
||||||
|
@ -486,6 +491,9 @@ fi
|
||||||
if test "$mingw32" = "yes" ; then
|
if test "$mingw32" = "yes" ; then
|
||||||
echo "CONFIG_WIN32=yes" >> config.mak
|
echo "CONFIG_WIN32=yes" >> config.mak
|
||||||
fi
|
fi
|
||||||
|
if test "$osx" = "yes" ; then
|
||||||
|
echo "CONFIG_OSX=yes" >> config.mak
|
||||||
|
fi
|
||||||
if test "$bigendian" = "yes" ; then
|
if test "$bigendian" = "yes" ; then
|
||||||
echo "WORDS_BIGENDIAN=yes" >> config.mak
|
echo "WORDS_BIGENDIAN=yes" >> config.mak
|
||||||
echo "#define WORDS_BIGENDIAN 1" >> $TMPH
|
echo "#define WORDS_BIGENDIAN 1" >> $TMPH
|
||||||
|
|
|
@ -46,6 +46,9 @@ TGT-i386 = -DTCC_TARGET_I386
|
||||||
OBJ-x86_64 = $(X86_64_O)
|
OBJ-x86_64 = $(X86_64_O)
|
||||||
TGT-x86_64 = -DTCC_TARGET_X86_64
|
TGT-x86_64 = -DTCC_TARGET_X86_64
|
||||||
|
|
||||||
|
OBJ-x86_64-osx = $(X86_64_O)
|
||||||
|
TGT-x86_64-osx = -DTCC_TARGET_X86_64 -DTCC_TARGET_MACHO
|
||||||
|
|
||||||
OBJ-arm = $(ARM_O)
|
OBJ-arm = $(ARM_O)
|
||||||
TGT-arm = -DTCC_TARGET_ARM
|
TGT-arm = -DTCC_TARGET_ARM
|
||||||
|
|
||||||
|
|
19
libtcc.c
19
libtcc.c
|
@ -1081,7 +1081,19 @@ ST_FUNC int tcc_add_file_internal(TCCState *s1, const char *filename, int flags)
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
#ifdef TCC_TARGET_PE
|
#if defined(TCC_TARGET_MACHO)
|
||||||
|
if (s1->output_type == TCC_OUTPUT_MEMORY) {
|
||||||
|
ret = 0;
|
||||||
|
#ifdef TCC_IS_NATIVE
|
||||||
|
if (NULL == dlopen(filename, RTLD_GLOBAL | RTLD_LAZY)) {
|
||||||
|
ret = -1;
|
||||||
|
}
|
||||||
|
#endif /* TCC_TARGET_MACHO */
|
||||||
|
} else {
|
||||||
|
ret = tcc_load_dll(s1, fd, filename,
|
||||||
|
(flags & AFF_REFERENCED_DLL) != 0);
|
||||||
|
}
|
||||||
|
#elif defined(TCC_TARGET_PE)
|
||||||
ret = pe_load_file(s1, filename, fd);
|
ret = pe_load_file(s1, filename, fd);
|
||||||
#else
|
#else
|
||||||
/* as GNU ld, consider it is an ld script if not recognized */
|
/* as GNU ld, consider it is an ld script if not recognized */
|
||||||
|
@ -1143,7 +1155,10 @@ ST_FUNC int tcc_add_crt(TCCState *s, const char *filename)
|
||||||
/* the library name is the same as the argument of the '-l' option */
|
/* the library name is the same as the argument of the '-l' option */
|
||||||
LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname)
|
LIBTCCAPI int tcc_add_library(TCCState *s, const char *libraryname)
|
||||||
{
|
{
|
||||||
#ifdef TCC_TARGET_PE
|
#if defined(TCC_TARGET_MACHO)
|
||||||
|
const char *libs[] = { "%s/lib%s.dylib", "%s/lib%s.a", NULL };
|
||||||
|
const char **pp = s->static_link ? libs + 1 : libs;
|
||||||
|
#elif defined(TCC_TARGET_PE)
|
||||||
const char *libs[] = { "%s/%s.def", "%s/lib%s.def", "%s/%s.dll", "%s/lib%s.dll", "%s/lib%s.a", NULL };
|
const char *libs[] = { "%s/%s.def", "%s/lib%s.def", "%s/%s.dll", "%s/lib%s.dll", "%s/lib%s.a", NULL };
|
||||||
const char **pp = s->static_link ? libs + 4 : libs;
|
const char **pp = s->static_link ? libs + 4 : libs;
|
||||||
#else
|
#else
|
||||||
|
|
Loading…
Reference in a new issue