blob: 3aff866d3976de4c728115ea3b79be410cac89a6 [file] [log] [blame]
# Copyright (c) 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
# GNU Makefile based on shared rules provided by the Native Client SDK.
# See README.Makefiles for more details.
CFLAGS :=-g -O0 -pthread -D__ANDROID__ -DANDROID -DBIONIC -fPIC -Wno-incompatible-library-redeclaration
LIBC_CFLAGS += -I$(SRC_ROOT)/stdlib -I$(SRC_ROOT)string -I$(SRC_ROOT)/stdio
LIBC_CFLAGS += -I$(SRC_ROOT)/private -I$(SRC_ROOT) -I$(SRC_ROOT)/arch-nacl/syscalls
LIBC_CFLAGS += -I$(SRC_ROOT)/upstream-netbsd
LIBC_CFLAGS +=-MD -DNACL_SDK_DEBUG -include AndroidConfig.h -Wstrict-aliasing=2
LIBC_CFLAGS +=-U_FORTIFY_SOURCE -DANDROID_CHANGES -fno-short-enums -funwind-tables -fno-stack-protector -fno-strict-aliasing
LIBC_CFLAGS +=-fno-exceptions -fno-omit-frame-pointer -fno-asynchronous-unwind-tables -fno-unwind-tables
LIBC_CFLAGS +=-DINET6 -DUSG_COMPAT -DANDROID_SMP=1 -D_GNU_SOURCE -DHAVE_MORECORE=0 -D_USE_NACL_SYS_ALIAS_=1 -fPIC
ARM_FLAGS :=-mcpu=cortex-a9 -mfloat-abi=hard -mfpu=neon
ARM_FLAGS +=-DTM_GMTOFF=tm_gmtoff -DUSG_COMPAT=1 -DHAVE_ARM_TLS_REGISTER
ARM_FLAGS +=-gdwarf-3
X86_FLAGS :=-DUSES_SSE2 -DFLOATING_POINT -D_BYTE_ORDER=_LITTLE_ENDIAN
ifeq ($(NACL_ARCH),arm-nacl)
ARCH_FLAGS:=$(ARM_FLAGS)
else
ARCH_FLAGS:=$(X86_FLAGS)
endif
$(eval $(call BASIC_COMPILE_TARGET,$(INS_ROOT)/crtbegin.o,$(SRC_ROOT)/arch-nacl/bionic/crtbegin.c,$(CC),$(ARCH_FLAGS) $(CFLAGS) -DCRT_DYNAMIC))
$(eval $(call BASIC_COMPILE_TARGET,$(INS_ROOT)/crtbeginS.o,$(SRC_ROOT)/arch-nacl/bionic/crtbegin.c,$(CC),$(ARCH_FLAGS) $(CFLAGS) -DCRT_SO))
$(eval $(call BASIC_COMPILE_TARGET,$(INS_ROOT)/crtbeginT.o,$(SRC_ROOT)/arch-nacl/bionic/crtbegin.c,$(CC),$(ARCH_FLAGS) $(CFLAGS) -DCRT_STATIC))
$(eval $(call BASIC_COMPILE_TARGET,$(INS_ROOT)/crtend.o,$(SRC_ROOT)/arch-nacl/bionic/crtend.c,$(CC),$(ARCH_FLAGS) $(CFLAGS) -DCRT_STATIC))
$(eval $(call BASIC_COMPILE_TARGET,$(INS_ROOT)/crtendS.o,$(SRC_ROOT)/arch-nacl/bionic/crtend.c,$(CC),$(ARCH_FLAGS) $(CFLAGS) -DCRT_SO))
C_UNISTD_SOURCES = \
unistd/abort.c \
unistd/alarm.c \
unistd/brk.c \
unistd/daemon.c \
unistd/eventfd.c \
unistd/exec.c \
unistd/fcntl.c \
unistd/fnmatch.c \
unistd/fstatfs.c \
unistd/ftime.c \
unistd/ftok.c \
unistd/getdtablesize.c \
unistd/gethostname.c \
unistd/getopt_long.c \
unistd/getpgrp.c \
unistd/getpriority.c \
unistd/getpt.c \
unistd/initgroups.c \
unistd/isatty.c \
unistd/issetugid.c \
unistd/killpg.c \
unistd/openat.c \
unistd/opendir.c \
unistd/pathconf.c \
unistd/perror.c \
unistd/popen.c \
unistd/pread.c \
unistd/pselect.c \
unistd/ptsname.c \
unistd/ptsname_r.c \
unistd/pwrite.c \
unistd/raise.c \
unistd/reboot.c \
unistd/recv.c \
unistd/sbrk.c \
unistd/send.c \
unistd/setegid.c \
unistd/setuid.c \
unistd/seteuid.c \
unistd/setreuid.c \
unistd/setresuid.c \
unistd/setpgrp.c \
unistd/sigblock.c \
unistd/siginterrupt.c \
unistd/siglist.c \
unistd/signal.c \
unistd/signame.c \
unistd/sigsetmask.c \
unistd/sigsuspend.c \
unistd/sigwait.c \
unistd/sleep.c \
unistd/statfs.c \
unistd/swab.c \
unistd/sysconf.c \
unistd/syslog.c \
unistd/system.c \
unistd/tcgetpgrp.c \
unistd/tcsetpgrp.c \
unistd/time.c \
unistd/umount.c \
unistd/unlockpt.c \
unistd/usleep.c \
unistd/wait.c
# unistd/open.c \
C_STDIO_SOURCES = \
stdio/asprintf.c \
stdio/clrerr.c \
stdio/fclose.c \
stdio/fdopen.c \
stdio/feof.c \
stdio/ferror.c \
stdio/fflush.c \
stdio/fgetc.c \
stdio/fgetln.c \
stdio/fgetpos.c \
stdio/fgets.c \
stdio/fileno.c \
stdio/findfp.c \
stdio/flags.c \
stdio/flockfile.c \
stdio/fopen.c \
stdio/fprintf.c \
stdio/fpurge.c \
stdio/fputc.c \
stdio/fputs.c \
stdio/fread.c \
stdio/freopen.c \
stdio/fscanf.c \
stdio/fseek.c \
stdio/fsetpos.c \
stdio/ftell.c \
stdio/funopen.c \
stdio/fvwrite.c \
stdio/fwalk.c \
stdio/fwrite.c \
stdio/getc.c \
stdio/getchar.c \
stdio/gets.c \
stdio/makebuf.c \
stdio/mktemp.c \
stdio/printf.c \
stdio/putc.c \
stdio/putchar.c \
stdio/puts.c \
stdio/putw.c \
stdio/refill.c \
stdio/remove.c \
stdio/rewind.c \
stdio/rget.c \
stdio/scanf.c \
stdio/setbuf.c \
stdio/setbuffer.c \
stdio/setvbuf.c \
stdio/snprintf.c \
stdio/sprintf.c \
stdio/sscanf.c \
stdio/stdio.c \
stdio/tempnam.c \
stdio/tmpfile.c \
stdio/tmpnam.c \
stdio/ungetc.c \
stdio/vasprintf.c \
stdio/vfprintf.c \
stdio/vfscanf.c \
stdio/vprintf.c \
stdio/vsnprintf.c \
stdio/vsprintf.c \
stdio/vscanf.c \
stdio/vsscanf.c \
stdio/wbuf.c \
stdio/wsetup.c \
stdio/__fgets_chk.c \
stdio/__snprintf_chk.c \
stdio/__sprintf_chk.c \
stdio/__vsnprintf_chk.c \
stdio/__vsprintf_chk.c \
C_STDLIB_SOURCES = \
stdlib/_rand48.c \
stdlib/assert.c \
stdlib/atexit.c \
stdlib/atoi.c \
stdlib/atol.c \
stdlib/atoll.c \
stdlib/bsearch.c \
stdlib/ctype_.c \
stdlib/div.c \
stdlib/exit.c \
stdlib/getenv.c \
stdlib/jrand48.c \
stdlib/ldiv.c \
stdlib/lldiv.c \
stdlib/locale.c \
stdlib/lrand48.c \
stdlib/mrand48.c \
stdlib/nrand48.c \
stdlib/putenv.c \
stdlib/qsort.c \
stdlib/seed48.c \
stdlib/setenv.c \
stdlib/setjmperr.c \
stdlib/srand48.c \
stdlib/strntoimax.c \
stdlib/strntoumax.c \
stdlib/strtod.c \
stdlib/strtoimax.c \
stdlib/strtol.c \
stdlib/strtoll.c \
stdlib/strtoul.c \
stdlib/strtoull.c \
stdlib/strtoumax.c \
stdlib/tolower_.c \
stdlib/toupper_.c \
stdlib/wchar.c \
bionic/dlmalloc.c
#// bionic/malloc_debug_common.cpp
C_STRING_SOURCES = \
string/bcopy.c \
string/bzero.c \
string/index.c \
string/memccpy.c \
string/memchr.c \
string/memcmp.c \
string/memcpy.c \
string/memmove.c \
string/memmem.c \
string/memrchr.c \
string/memset.c \
string/memswap.c \
string/strcasecmp.c \
string/strcasestr.c \
string/strcat.c \
string/strchr.c \
string/strcoll.c \
string/strcpy.c \
string/strcspn.c \
string/strdup.c \
string/strlcat.c \
string/strlcpy.c \
string/strncat.c \
string/strncmp.c \
string/strncpy.c \
string/strndup.c \
string/strnlen.c \
string/strpbrk.c \
string/strrchr.c \
string/strsep.c \
string/strspn.c \
string/strstr.c \
string/strtok.c \
string/strtotimeval.c \
string/strcmp.c \
string/strlen.c \
string/__memcpy_chk.c \
string/__memmove_chk.c \
string/__memset_chk.c \
string/__strcat_chk.c \
string/__strcpy_chk.c \
string/__strlcat_chk.c \
string/__strlcpy_chk.c \
string/__strlen_chk.c \
string/__strncat_chk.c \
string/__strncpy_chk.c \
wchar/wcpcpy.c \
wchar/wcpncpy.c \
wchar/wcscasecmp.c \
wchar/wcscat.c \
wchar/wcschr.c \
wchar/wcscmp.c \
wchar/wcscoll.c \
wchar/wcscpy.c \
wchar/wcscspn.c \
wchar/wcsdup.c \
wchar/wcslcat.c \
wchar/wcslcpy.c \
wchar/wcslen.c \
wchar/wcsncasecmp.c \
wchar/wcsncat.c \
wchar/wcsncmp.c \
wchar/wcsncpy.c \
wchar/wcsnlen.c \
wchar/wcspbrk.c \
wchar/wcsrchr.c \
wchar/wcsspn.c \
wchar/wcsstr.c \
wchar/wcstok.c \
wchar/wcswidth.c \
wchar/wcsxfrm.c \
wchar/wmemchr.c \
wchar/wmemcmp.c \
wchar/wmemcpy.c \
wchar/wmemmove.c \
wchar/wmemset.c
C_MISC_SOURCES = \
inet/bindresvport.c \
inet/inet_addr.c \
inet/inet_aton.c \
inet/inet_ntoa.c \
inet/inet_ntop.c \
inet/inet_pton.c \
inet/ether_aton.c \
inet/ether_ntoa.c \
tzcode/asctime.c \
tzcode/difftime.c \
tzcode/localtime.c \
tzcode/strftime.c \
tzcode/strptime.c \
bionic/__set_errno.c \
bionic/bionic_clone.c \
bionic/cpuacct.c \
bionic/arc4random.c \
bionic/basename.c \
bionic/basename_r.c \
bionic/clearenv.c \
bionic/dirname.c \
bionic/dirname_r.c \
bionic/drand48.c \
bionic/erand48.c \
bionic/err.c \
bionic/fdprintf.c \
bionic/fts.c \
bionic/getcwd.c \
bionic/if_nametoindex.c \
bionic/if_indextoname.c \
bionic/ioctl.c \
bionic/ldexp.c \
bionic/libc_init_common.c \
bionic/logd_write.c \
bionic/memmove_words.c \
bionic/pututline.c \
bionic/realpath.c \
bionic/sched_getaffinity.c \
bionic/sched_getcpu.c \
bionic/sched_cpualloc.c \
bionic/sched_cpucount.c \
bionic/semaphore.c \
bionic/strerror.c \
bionic/strerror_r.c \
bionic/strsignal.c \
bionic/system_properties.c \
bionic/tdestroy.c \
bionic/time64.c \
bionic/thread_atexit.c \
bionic/utime.c \
bionic/utmp.c \
bionic/__errno.c \
bionic/pthread.c \
bionic/pthread-atfork.c \
bionic/pthread-rwlocks.c \
bionic/pthread-timers.c \
bionic/ptrace.c
# bionic/pthread_debug.c \
C_NACL_SOURCES = \
arch-nacl/bionic/nacl_read_tp.c \
arch-nacl/bionic/__get_sp.c \
arch-nacl/bionic/__set_tls.c \
arch-nacl/bionic/atexit.c \
arch-nacl/bionic/clone.c \
arch-nacl/syscalls/accept.c \
arch-nacl/syscalls/access.c \
arch-nacl/syscalls/bind.c \
arch-nacl/syscalls/chdir.c \
arch-nacl/syscalls/chmod.c \
arch-nacl/syscalls/chown.c \
arch-nacl/syscalls/clock_getres.c \
arch-nacl/syscalls/clock_gettime.c \
arch-nacl/syscalls/close.c \
arch-nacl/syscalls/connect.c \
arch-nacl/syscalls/dup.c \
arch-nacl/syscalls/dup2.c \
arch-nacl/syscalls/enosys.c \
arch-nacl/syscalls/_exit.c \
arch-nacl/syscalls/_exit_thread.c \
arch-nacl/syscalls/fchdir.c \
arch-nacl/syscalls/fchmod.c \
arch-nacl/syscalls/fchown.c \
arch-nacl/syscalls/fdatasync.c \
arch-nacl/syscalls/fstat.c \
arch-nacl/syscalls/fsync.c \
arch-nacl/syscalls/futex.c \
arch-nacl/syscalls/__getcwd.c \
arch-nacl/syscalls/getdents.c \
arch-nacl/syscalls/getpeername.c \
arch-nacl/syscalls/getpid.c \
arch-nacl/syscalls/getsockname.c \
arch-nacl/syscalls/getsockopt.c \
arch-nacl/syscalls/gettid.c \
arch-nacl/syscalls/gettimeofday.c \
arch-nacl/syscalls/getuid.c \
arch-nacl/syscalls/__ioctl.c \
arch-nacl/syscalls/kill.c \
arch-nacl/syscalls/listen.c \
arch-nacl/syscalls/lseek.c \
arch-nacl/syscalls/lseek64.c \
arch-nacl/syscalls/lstat.c \
arch-nacl/syscalls/mkdir.c \
arch-nacl/syscalls/mmap.c \
arch-nacl/syscalls/mprotect.c \
arch-nacl/syscalls/munmap.c \
arch-nacl/syscalls/nacl_dyncode_create.c \
arch-nacl/syscalls/nacl_dyncode_delete.c \
arch-nacl/syscalls/nacl_errno.c \
arch-nacl/syscalls/nacl_list_mappings.c \
arch-nacl/syscalls/nacl_socket.c \
arch-nacl/syscalls/nacl_stat.c \
arch-nacl/syscalls/nacl_timespec.c \
arch-nacl/syscalls/nacl_timeval.c \
arch-nacl/syscalls/nanosleep.c \
arch-nacl/syscalls/__open.c \
arch-nacl/syscalls/poll.c \
arch-nacl/syscalls/pipe.c \
arch-nacl/syscalls/read.c \
arch-nacl/syscalls/recvfrom.c \
arch-nacl/syscalls/readlink.c \
arch-nacl/syscalls/recvmsg.c \
arch-nacl/syscalls/rename.c \
arch-nacl/syscalls/rmdir.c \
arch-nacl/syscalls/select.c \
arch-nacl/syscalls/sendmsg.c \
arch-nacl/syscalls/sendto.c \
arch-nacl/syscalls/setsockopt.c \
arch-nacl/syscalls/shutdown.c \
arch-nacl/syscalls/sigaction.c \
arch-nacl/syscalls/socket.c \
arch-nacl/syscalls/socketpair.c \
arch-nacl/syscalls/stat.c \
arch-nacl/syscalls/symlink.c \
arch-nacl/syscalls/times.c \
arch-nacl/syscalls/truncate.c \
arch-nacl/syscalls/unlink.c \
arch-nacl/syscalls/utimes.c \
arch-nacl/syscalls/write.c \
arch-nacl/syscalls/writev.c \
arch-nacl/tmp/libc_common_stubs.c \
arch-nacl/tmp/raw_print.c \
arch-nacl/tmp/libc_stubs.c \
arch-nacl/syscalls/irt_syscalls.c \
bionic/glibc_compat.c \
nacl_stubs.c
C_REGEX_SOURCES = \
upstream-netbsd/libc/regex/regcomp.c \
upstream-netbsd/libc/regex/regerror.c \
upstream-netbsd/libc/regex/regexec.c \
upstream-netbsd/libc/regex/regfree.c \
upstream-netbsd/libc/stdlib/lsearch.c \
upstream-netbsd/libc/string/strxfrm.c
C_STATIC_SOURCES = \
bionic/libc_init_static.c \
C_DYNAMIC_SOURCES = \
bionic/libc_init_dynamic.c \
ifeq ($(NACL_ARCH),arm)
ARCH_SOURCES:=arch-arm/bionic/eabi.c arch-arm/bionic/setjmp.S
C_STATIC_SOURCES+=arch-arm/bionic/exidx_static.c
C_DYNAMIC_SOURCES+=arch-arm/bionic/exidx_dynamic.c
else
ARCH_SOURCES:=
endif
COMMON_SOURCES:=$(C_UNISTD_SOURCES) $(C_STDIO_SOURCES) $(C_STDLIB_SOURCES)
COMMON_SOURCES+=$(C_STRING_SOURCES) $(C_MISC_SOURCES) $(C_NACL_SOURCES)
COMMON_SOURCES+=$(ARCH_SOURCES)
LIBC_STATIC_SOURCES:=$(C_STATIC_SOURCES) $(COMMON_SOURCES)
LIBC_DYNAMIC_SOURCES:=$(C_DYNAMIC_SOURCES) $(COMMON_SOURCES)
STATIC_OBJECTS = $(subst .S,.o,$(subst .c,.o,$(LIBC_STATIC_SOURCES) $(C_REGEX_SOURCES)))
DYNAMIC_OBJECTS = $(subst .S,.o,$(subst .c,.o,$(LIBC_DYNAMIC_SOURCES) $(C_REGEX_SOURCES)))
LIBC_CC_SOURCES = $(COMMON_SOURCES) $(C_STATIC_SOURCES) $(C_DYNAMIC_SOURCES)
REGEX_FLAGS:=-I$(SRC_ROOT)/upstream-netbsd/libc/regex
REGEX_FLAGS+=-include netbsd-compat.h
DYNAMIC_LINK_FLAGS:=-nostdlib -shared -Wl,-z,defs -L$(INS_ROOT) -L$(GCC_ROOT)
all: compile lib
.PHONY : irt
IRT_PY := $(SRC_ROOT)/../../tools/irt_syscalls.py
IRT_H := $(INS_ROOT)/../include/irt.h
IRT_DEV_H := $(INS_ROOT)/../include/irt_dev.h
IRT_SOCKET_H := $(SRC_ROOT)/arch-nacl/syscalls/irt_socket.h
IRT_POLL_H := $(SRC_ROOT)/arch-nacl/syscalls/irt_poll.h
IRT_SYSCALLS_C := $(SRC_ROOT)/arch-nacl/syscalls/irt_syscalls.c
IRT_SYSCALLS_H := $(INS_ROOT)/../include/irt_syscalls.h
$(foreach src,$(C_REGEX_SOURCES),$(eval $(call BASIC_COMPILE_TARGET,$(basename $(src)).o,$(SRC_ROOT)/$(src),$(CC),-std=gnu99 -g $(CFLAGS) $(LIBC_CFLAGS) $(ARCH_FLAGS) $(REGEX_FLAGS),,,$(IRT_SYSCALLS_H))))
$(foreach src,$(LIBC_CC_SOURCES),$(eval $(call BASIC_COMPILE_TARGET,$(basename $(src)).o,$(SRC_ROOT)/$(src),$(CC),-std=gnu99 -g $(CFLAGS) $(LIBC_CFLAGS) $(ARCH_FLAGS),,,$(IRT_SYSCALLS_H))))
irt : $(IRT_SYSCALLS_H)
$(IRT_SYSCALLS_C) $(IRT_SYSCALLS_H) : $(IRT_PY) $(IRT_H) $(IRT_DEV_H) $(IRT_SOCKET_H) $(IRT_POLL_H)
python $(IRT_PY) -i $(IRT_SYSCALLS_H) $(IRT_H) $(IRT_DEV_H) $(IRT_SOCKET_H) $(IRT_POLL_H)
$(eval $(call BASIC_COMPILE_TARGET,irt_munge_test.o,$(SRC_ROOT)/irt_munge_test.c,$(CC),-nostdlib -nostdinc))
irt_munge_test:
$(RUN_SEL_LDR)
# Fake libdl.so to provide a way to share the IRT pointers
DL_SOURCE:=arch-nacl/bionic/irt_ptrs.c
DL_OBJECT:=$(subst .c,.o,$(DL_SOURCE))
$(eval $(call BASIC_COMPILE_TARGET,$(DL_OBJECT),$(SRC_ROOT)/$(DL_SOURCE),$(CC),-std=gnu99 -g $(CFLAGS) $(LIBC_CFLAGS) $(ARCH_FLAGS),,,$(IRT_SYSCALLS_H)))
$(eval $(call BASIC_LINK_TARGET,$(INS_ROOT)/libdl.so,$(DL_OBJECT),$(LD),-nostdlib -shared))
$(eval $(call BASIC_LIB_TARGET,$(INS_ROOT)/libc.a,$(STATIC_OBJECTS),$(AR)))
$(eval $(call BASIC_LINK_TARGET,$(INS_ROOT)/libc.so,$(INS_ROOT)/crtbeginS.o $(DYNAMIC_OBJECTS) $(INS_ROOT)/crtendS.o ,$(LD),$(DYNAMIC_LINK_FLAGS),-ldl -lgcc,,$(INS_ROOT)/libdl.so))
HELLO_SOURCES=test/hello.c
$(foreach src,$(HELLO_SOURCES),$(eval $(call BASIC_COMPILE_TARGET,$(basename $(src)).o,$(SRC_ROOT)/$(src),$(CC),-std=gnu99 -g $(CFLAGS) $(LIBC_CFLAGS) $(ARCH_FLAGS) $(REGEX_FLAGS),,,$(INS_ROOT)/libc.a $(IRT_SYSCALLS_H))))
$(eval $(call BASIC_LINK_TARGET,test/hello.nexe, test/hello.o,$(LD),,,$(INS_ROOT)/crtbeginT.o $(INS_ROOT)/libc.a $(INS_ROOT)/crtend.o))
crt: $(INS_ROOT)/crtbegin.o $(INS_ROOT)/crtbeginS.o $(INS_ROOT)/crtbeginT.o $(INS_ROOT)/crtend.o $(INS_ROOT)/crtendS.o
static: $(INS_ROOT)/libc.a
dynamic: $(INS_ROOT)/libc.so
clean:
rm -f *.o */*.o */*/*.o */*/*/*.o
rm -f *.d */*.d */*/*.d */*/*/*.d
rm -f $(INS_ROOT)/libc.*
rm -f $(INS_ROOT)/crtbegin.o $(INS_ROOT)/crtbeginS.o
rm -f $(INS_ROOT)/crtend.o $(INS_ROOT)/crtendS.o