From 1d0dc7c9f556b7003ab72e7c9c119b54e854f872 Mon Sep 17 00:00:00 2001 From: John Koleszar Date: Fri, 2 Nov 2012 15:17:36 -0700 Subject: [PATCH] build: merge with master Change-Id: I8ea836ce92c1c96f1e2bdf45e704d36ec9dbc401 --- build/make/Android.mk | 210 +++++++++++++++++++++ build/make/Makefile | 10 +- build/make/ads2gas.pl | 54 ++++-- build/make/ads2gas_apple.pl | 19 +- build/make/configure.sh | 351 +++++++++++++++++++++++++++-------- build/make/gen_asm_deps.sh | 2 +- build/make/obj_int_extract.c | 8 +- 7 files changed, 555 insertions(+), 99 deletions(-) create mode 100644 build/make/Android.mk diff --git a/build/make/Android.mk b/build/make/Android.mk new file mode 100644 index 000000000..afd27597c --- /dev/null +++ b/build/make/Android.mk @@ -0,0 +1,210 @@ +## +## Copyright (c) 2012 The WebM project authors. All Rights Reserved. +## +## Use of this source code is governed by a BSD-style license +## that can be found in the LICENSE file in the root of the source +## tree. An additional intellectual property rights grant can be found +## in the file PATENTS. All contributing project authors may +## be found in the AUTHORS file in the root of the source tree. +## + +# +# This file is to be used for compiling libvpx for Android using the NDK. +# In an Android project place a libvpx checkout in the jni directory. +# Run the configure script from the jni directory. Base libvpx +# encoder/decoder configuration will look similar to: +# ./libvpx/configure --target=armv7-android-gcc --disable-examples \ +# --sdk-path=/opt/android-ndk-r6b/ +# +# When targeting Android, realtime-only is enabled by default. This can +# be overridden by adding the command line flag: +# --disable-realtime-only +# +# This will create .mk files that contain variables that contain the +# source files to compile. +# +# Place an Android.mk file in the jni directory that references the +# Android.mk file in the libvpx directory: +# LOCAL_PATH := $(call my-dir) +# include $(CLEAR_VARS) +# include libvpx/build/make/Android.mk +# +# There are currently two TARGET_ARCH_ABI targets for ARM. +# armeabi and armeabi-v7a. armeabi-v7a is selected by creating an +# Application.mk in the jni directory that contains: +# APP_ABI := armeabi-v7a +# +# By default libvpx will detect at runtime the existance of NEON extension. +# For this we import the 'cpufeatures' module from the NDK sources. +# libvpx can also be configured without this runtime detection method. +# Configuring with --disable-runtime-cpu-detect will assume presence of NEON. +# Configuring with --disable-runtime-cpu-detect --disable-neon will remove any +# NEON dependency. + +# To change to building armeabi, run ./libvpx/configure again, but with +# --target=arm5te-android-gcc and modify the Application.mk file to +# set APP_ABI := armeabi +# +# Running ndk-build will build libvpx and include it in your project. +# + +CONFIG_DIR := $(LOCAL_PATH) +LIBVPX_PATH := $(LOCAL_PATH)/libvpx +ASM_CNV_PATH_LOCAL := $(TARGET_ARCH_ABI)/ads2gas +ASM_CNV_PATH := $(LOCAL_PATH)/$(ASM_CNV_PATH_LOCAL) + +# Makefiles created by the libvpx configure process +# This will need to be fixed to handle x86. +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + include $(CONFIG_DIR)/libs-armv7-android-gcc.mk +else + include $(CONFIG_DIR)/libs-armv5te-android-gcc.mk +endif + +# Rule that is normally in Makefile created by libvpx +# configure. Used to filter out source files based on configuration. +enabled=$(filter-out $($(1)-no),$($(1)-yes)) + +# Override the relative path that is defined by the libvpx +# configure process +SRC_PATH_BARE := $(LIBVPX_PATH) + +# Include the list of files to be built +include $(LIBVPX_PATH)/libs.mk + +# Want arm, not thumb, optimized +LOCAL_ARM_MODE := arm +LOCAL_CFLAGS := -O3 + +# ----------------------------------------------------------------------------- +# Template : asm_offsets_template +# Arguments : 1: assembly offsets file to be created +# 2: c file to base assembly offsets on +# Returns : None +# Usage : $(eval $(call asm_offsets_template,, +# Rationale : Create offsets at compile time using for structures that are +# defined in c, but used in assembly functions. +# ----------------------------------------------------------------------------- +define asm_offsets_template + +_SRC:=$(2) +_OBJ:=$(ASM_CNV_PATH)/$$(notdir $(2)).S + +_FLAGS = $$($$(my)CFLAGS) \ + $$(call get-src-file-target-cflags,$(2)) \ + $$(call host-c-includes,$$(LOCAL_C_INCLUDES) $$(CONFIG_DIR)) \ + $$(LOCAL_CFLAGS) \ + $$(NDK_APP_CFLAGS) \ + $$(call host-c-includes,$$($(my)C_INCLUDES)) \ + -DINLINE_ASM \ + -S \ + +_TEXT = "Compile $$(call get-src-file-text,$(2))" +_CC = $$(TARGET_CC) + +$$(eval $$(call ev-build-file)) + +$(1) : $$(_OBJ) $(2) + @mkdir -p $$(dir $$@) + @grep $(OFFSET_PATTERN) $$< | tr -d '\#' | $(CONFIG_DIR)/$(ASM_CONVERSION) > $$@ +endef + +# Use ads2gas script to convert from RVCT format to GAS format. This passes +# puts the processed file under $(ASM_CNV_PATH). Local clean rule +# to handle removing these +ASM_CNV_OFFSETS_DEPEND = $(ASM_CNV_PATH)/asm_com_offsets.asm +ifeq ($(CONFIG_VP8_DECODER), yes) + ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_dec_offsets.asm +endif +ifeq ($(CONFIG_VP8_ENCODER), yes) + ASM_CNV_OFFSETS_DEPEND += $(ASM_CNV_PATH)/asm_enc_offsets.asm +endif + +.PRECIOUS: %.asm.s +$(ASM_CNV_PATH)/libvpx/%.asm.s: $(LIBVPX_PATH)/%.asm $(ASM_CNV_OFFSETS_DEPEND) + @mkdir -p $(dir $@) + @$(CONFIG_DIR)/$(ASM_CONVERSION) <$< > $@ + +# For building vpx_rtcd.h, which has a rule in libs.mk +TGT_ISA:=$(word 1, $(subst -, ,$(TOOLCHAIN))) +target := libs + +LOCAL_SRC_FILES += vpx_config.c + +# Remove duplicate entries +CODEC_SRCS_UNIQUE = $(sort $(CODEC_SRCS)) + +# Pull out C files. vpx_config.c is in the immediate directory and +# so it does not need libvpx/ prefixed like the rest of the source files. +CODEC_SRCS_C = $(filter %.c, $(CODEC_SRCS_UNIQUE)) +LOCAL_CODEC_SRCS_C = $(filter-out vpx_config.c, $(CODEC_SRCS_C)) + +LOCAL_SRC_FILES += $(foreach file, $(LOCAL_CODEC_SRCS_C), libvpx/$(file)) + +# Pull out assembly files, splitting NEON from the rest. This is +# done to specify that the NEON assembly files use NEON assembler flags. +CODEC_SRCS_ASM_ALL = $(filter %.asm.s, $(CODEC_SRCS_UNIQUE)) +CODEC_SRCS_ASM = $(foreach v, \ + $(CODEC_SRCS_ASM_ALL), \ + $(if $(findstring neon,$(v)),,$(v))) +CODEC_SRCS_ASM_ADS2GAS = $(patsubst %.s, \ + $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \ + $(CODEC_SRCS_ASM)) +LOCAL_SRC_FILES += $(CODEC_SRCS_ASM_ADS2GAS) + +ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) + CODEC_SRCS_ASM_NEON = $(foreach v, \ + $(CODEC_SRCS_ASM_ALL),\ + $(if $(findstring neon,$(v)),$(v),)) + CODEC_SRCS_ASM_NEON_ADS2GAS = $(patsubst %.s, \ + $(ASM_CNV_PATH_LOCAL)/libvpx/%.s, \ + $(CODEC_SRCS_ASM_NEON)) + LOCAL_SRC_FILES += $(patsubst %.s, \ + %.s.neon, \ + $(CODEC_SRCS_ASM_NEON_ADS2GAS)) +endif + +LOCAL_CFLAGS += \ + -DHAVE_CONFIG_H=vpx_config.h \ + -I$(LIBVPX_PATH) \ + -I$(ASM_CNV_PATH) + +LOCAL_MODULE := libvpx + +LOCAL_LDLIBS := -llog + +ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes) + LOCAL_STATIC_LIBRARIES := cpufeatures +endif + +$(foreach file, $(LOCAL_SRC_FILES), $(LOCAL_PATH)/$(file)): vpx_rtcd.h + +.PHONY: clean +clean: + @echo "Clean: ads2gas files [$(TARGET_ARCH_ABI)]" + @$(RM) $(CODEC_SRCS_ASM_ADS2GAS) $(CODEC_SRCS_ASM_NEON_ADS2GAS) + @$(RM) $(patsubst %.asm, %.*, $(ASM_CNV_OFFSETS_DEPEND)) + @$(RM) -r $(ASM_CNV_PATH) + @$(RM) $(CLEAN-OBJS) + +include $(BUILD_SHARED_LIBRARY) + +$(eval $(call asm_offsets_template,\ + $(ASM_CNV_PATH)/asm_com_offsets.asm, \ + $(LIBVPX_PATH)/vp8/common/asm_com_offsets.c)) + +ifeq ($(CONFIG_VP8_DECODER), yes) + $(eval $(call asm_offsets_template,\ + $(ASM_CNV_PATH)/asm_dec_offsets.asm, \ + $(LIBVPX_PATH)/vp8/decoder/asm_dec_offsets.c)) +endif + +ifeq ($(CONFIG_VP8_ENCODER), yes) + $(eval $(call asm_offsets_template,\ + $(ASM_CNV_PATH)/asm_enc_offsets.asm, \ + $(LIBVPX_PATH)/vp8/encoder/asm_enc_offsets.c)) +endif + +ifeq ($(CONFIG_RUNTIME_CPU_DETECT),yes) +$(call import-module,cpufeatures) +endif diff --git a/build/make/Makefile b/build/make/Makefile index f05867f04..92113ccb8 100644 --- a/build/make/Makefile +++ b/build/make/Makefile @@ -21,6 +21,7 @@ all: .DEFAULT clean:: .DEFAULT install:: .DEFAULT test:: .DEFAULT +testdata:: .DEFAULT # Note: md5sum is not installed on OS X, but openssl is. Openssl may not be @@ -66,6 +67,7 @@ endif BUILD_ROOT?=. VPATH=$(SRC_PATH_BARE) CFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH) +CXXFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT) -I$(SRC_PATH) ASFLAGS+=-I$(BUILD_PFX)$(BUILD_ROOT)/ -I$(SRC_PATH)/ DIST_DIR?=dist HOSTCC?=gcc @@ -98,6 +100,8 @@ dist: install:: .PHONY: test test:: +.PHONY: testdata +testdata:: $(BUILD_PFX)%.c.d: %.c $(if $(quiet),@echo " [DEP] $@") @@ -111,11 +115,11 @@ $(BUILD_PFX)%.c.o: %.c $(BUILD_PFX)%.cc.d: %.cc $(if $(quiet),@echo " [DEP] $@") $(qexec)mkdir -p $(dir $@) - $(qexec)g++ $(INTERNAL_CFLAGS) $(CFLAGS) -M $< | $(fmt_deps) > $@ + $(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -M $< | $(fmt_deps) > $@ $(BUILD_PFX)%.cc.o: %.cc $(if $(quiet),@echo " [CXX] $@") - $(qexec)g++ $(INTERNAL_CFLAGS) $(CFLAGS) -c -o $@ $< + $(qexec)$(CXX) $(INTERNAL_CFLAGS) $(CXXFLAGS) -c -o $@ $< $(BUILD_PFX)%.asm.d: %.asm $(if $(quiet),@echo " [DEP] $@") @@ -213,7 +217,7 @@ define linkerxx_template $(1): $(filter-out -%,$(2)) $(1): $(if $(quiet),@echo " [LD] $$@") - $(qexec)g++ $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs)) + $(qexec)$$(CXX) $$(strip $$(INTERNAL_LDFLAGS) $$(LDFLAGS) -o $$@ $(2) $(3) $$(extralibs)) endef # make-3.80 has a bug with expanding large input strings to the eval function, # which was triggered in some cases by the following component of diff --git a/build/make/ads2gas.pl b/build/make/ads2gas.pl index 388133aa2..ba70242dc 100755 --- a/build/make/ads2gas.pl +++ b/build/make/ads2gas.pl @@ -26,12 +26,22 @@ print "\t.equ DO1STROUNDING, 0\n"; while () { + undef $comment; + undef $line; + $comment_char = ";"; + $comment_sub = "@"; + + # Handle comments. + if (/$comment_char/) + { + $comment = ""; + ($line, $comment) = /(.*?)$comment_char(.*)/; + $_ = $line; + } + # Load and store alignment s/@/,:/g; - # Comment character - s/;/@/g; - # Hexadecimal constants prefaced by 0x s/#&/#0x/g; @@ -62,6 +72,17 @@ while () # Convert LTORG to .ltorg s/LTORG/.ltorg/g; + # Convert endfunc to nothing. + s/endfunc//ig; + + # Convert FUNCTION to nothing. + s/FUNCTION//g; + s/function//g; + + s/ENTRY//g; + s/MSARMASM/0/g; + s/^\s+end\s+$//g; + # Convert IF :DEF:to .if # gcc doesn't have the ability to do a conditional # if defined variable that is set by IF :DEF: on @@ -106,6 +127,7 @@ while () if (s/RN\s+([Rr]\d+|lr)/.req $1/) { print; + print "$comment_sub$comment\n" if defined $comment; next; } @@ -114,6 +136,9 @@ while () s/EXPORT\s+\|([\$\w]*)\|/.global $1 \n\t.type $1, function/; s/IMPORT\s+\|([\$\w]*)\|/.global $1/; + s/EXPORT\s+([\$\w]*)/.global $1/; + s/export\s+([\$\w]*)/.global $1/; + # No vertical bars required; make additional symbol with prepended # underscore s/^\|(\$?\w+)\|/_$1\n\t$1:/g; @@ -126,15 +151,21 @@ while () # ALIGN directive s/ALIGN/.balign/g; - # Strip ARM - s/\sARM/@ ARM/g; + # ARM code + s/\sARM/.arm/g; + + # NEON code + s/(vld1.\d+\s+)(q\d+)/$1\{$2\}/g; + s/(vtbl.\d+\s+[^,]+),([^,]+)/$1,\{$2\}/g; + + # eabi_attributes numerical equivalents can be found in the + # "ARM IHI 0045C" document. - # Strip REQUIRE8 - #s/\sREQUIRE8/@ REQUIRE8/g; - s/\sREQUIRE8/@ /g; #EQU cause problem + # REQUIRE8 Stack is required to be 8-byte aligned + s/\sREQUIRE8/.eabi_attribute 24, 1 \@Tag_ABI_align_needed/g; - # Strip PRESERVE8 - s/\sPRESERVE8/@ PRESERVE8/g; + # PRESERVE8 Stack 8-byte align is preserved + s/\sPRESERVE8/.eabi_attribute 25, 1 \@Tag_ABI_align_preserved/g; # Use PROC and ENDP to give the symbols a .size directive. # This makes them show up properly in debugging tools like gdb and valgrind. @@ -155,7 +186,7 @@ while () } # EQU directive - s/(.*)EQU(.*)/.equ $1, $2/; + s/(\S+\s+)EQU(\s+\S+)/.equ $1, $2/; # Begin macro definition if (/MACRO/) { @@ -170,6 +201,7 @@ while () s/MEND/.endm/; # No need to tell it where to stop assembling next if /^\s*END\s*$/; print; + print "$comment_sub$comment\n" if defined $comment; } # Mark that this object doesn't need an executable stack. diff --git a/build/make/ads2gas_apple.pl b/build/make/ads2gas_apple.pl index 78f4a97f5..81280bf78 100755 --- a/build/make/ads2gas_apple.pl +++ b/build/make/ads2gas_apple.pl @@ -30,6 +30,8 @@ my @mapping_list = ("\$0", "\$1", "\$2", "\$3", "\$4", "\$5", "\$6", "\$7", "\$8 my @incoming_array; +my @imported_functions; + # Perl trim function to remove whitespace from the start and end of the string sub trim($) { @@ -132,7 +134,18 @@ while () # Make function visible to linker, and make additional symbol with # prepended underscore s/EXPORT\s+\|([\$\w]*)\|/.globl _$1\n\t.globl $1/; - s/IMPORT\s+\|([\$\w]*)\|/.globl $1/; + + # Prepend imported functions with _ + if (s/IMPORT\s+\|([\$\w]*)\|/.globl $1/) + { + $function = trim($1); + push(@imported_functions, $function); + } + + foreach $function (@imported_functions) + { + s/$function/_$function/; + } # No vertical bars required; make additional symbol with prepended # underscore @@ -157,8 +170,8 @@ while () s/\sPRESERVE8/@ PRESERVE8/g; # Strip PROC and ENDPROC - s/PROC/@/g; - s/ENDP/@/g; + s/\bPROC\b/@/g; + s/\bENDP\b/@/g; # EQU directive s/(.*)EQU(.*)/.set $1, $2/; diff --git a/build/make/configure.sh b/build/make/configure.sh index 00c27c261..05bbabe77 100755 --- a/build/make/configure.sh +++ b/build/make/configure.sh @@ -166,6 +166,17 @@ is_in(){ add_cflags() { CFLAGS="${CFLAGS} $@" + CXXFLAGS="${CXXFLAGS} $@" +} + + +add_cflags_only() { + CFLAGS="${CFLAGS} $@" +} + + +add_cxxflags_only() { + CXXFLAGS="${CXXFLAGS} $@" } @@ -277,6 +288,13 @@ check_cc() { check_cmd ${CC} ${CFLAGS} "$@" -c -o ${TMP_O} ${TMP_C} } +check_cxx() { + log check_cxx "$@" + cat >${TMP_C} + log_file ${TMP_C} + check_cmd ${CXX} ${CXXFLAGS} "$@" -c -o ${TMP_O} ${TMP_C} +} + check_cpp() { log check_cpp "$@" cat > ${TMP_C} @@ -310,8 +328,25 @@ int x; EOF } +check_cxxflags() { + log check_cxxflags "$@" + + # Catch CFLAGS that trigger CXX warnings + case "$CXX" in + *g++*) check_cxx -Werror "$@" < config.mk + print_webm_license config.mk "##" "" + echo '# This file automatically generated by configure. Do not edit!' >> config.mk echo "TOOLCHAIN := ${toolchain}" >> config.mk case ${toolchain} in @@ -366,9 +402,12 @@ true write_common_target_config_mk() { local CC=${CC} + local CXX=${CXX} enabled ccache && CC="ccache ${CC}" + enabled ccache && CXX="ccache ${CXX}" + print_webm_license $1 "##" "" - cat > $1 << EOF + cat >> $1 << EOF # This file automatically generated by configure. Do not edit! SRC_PATH="$source_path" SRC_PATH_BARE=$source_path @@ -377,6 +416,7 @@ TOOLCHAIN=${toolchain} ASM_CONVERSION=${asm_conversion_cmd:-${source_path}/build/make/ads2gas.pl} CC=${CC} +CXX=${CXX} AR=${AR} LD=${LD} AS=${AS} @@ -384,11 +424,13 @@ STRIP=${STRIP} NM=${NM} CFLAGS = ${CFLAGS} +CXXFLAGS = ${CXXFLAGS} ARFLAGS = -rus\$(if \$(quiet),c,v) LDFLAGS = ${LDFLAGS} ASFLAGS = ${ASFLAGS} extralibs = ${extralibs} AS_SFX = ${AS_SFX:-.asm} +EXE_SFX = ${EXE_SFX} RTCD_OPTIONS = ${RTCD_OPTIONS} EOF @@ -411,7 +453,8 @@ EOF write_common_target_config_h() { - cat > ${TMP_H} << EOF + print_webm_license ${TMP_H} "/*" " */" + cat >> ${TMP_H} << EOF /* This file automatically generated by configure. Do not edit! */ #ifndef VPX_CONFIG_H #define VPX_CONFIG_H @@ -454,9 +497,12 @@ process_common_cmdline() { eval `echo "$opt" | sed 's/--/action=/;s/-/ option=/;s/-/_/g'` if echo "${ARCH_EXT_LIST}" | grep "^ *$option\$" >/dev/null; then [ $action = "disable" ] && RTCD_OPTIONS="${RTCD_OPTIONS}${opt} " - else - echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null || - die_unknown $opt + elif [ $action = "disable" ] && ! disabled $option ; then + echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null || + die_unknown $opt + elif [ $action = "enable" ] && ! enabled $option ; then + echo "${CMDLINE_SELECT}" | grep "^ *$option\$" >/dev/null || + die_unknown $opt fi $action $option ;; @@ -488,7 +534,11 @@ process_common_cmdline() { --libdir=*) libdir="${optval}" ;; - --libc|--as|--prefix|--libdir) + --sdk-path=*) + [ -d "${optval}" ] || die "Not a directory: ${optval}" + sdk_path="${optval}" + ;; + --libc|--as|--prefix|--libdir|--sdk-path) die "Option ${opt} requires argument" ;; --help|-h) show_help @@ -527,20 +577,31 @@ post_process_cmdline() { setup_gnu_toolchain() { CC=${CC:-${CROSS}gcc} + CXX=${CXX:-${CROSS}g++} AR=${AR:-${CROSS}ar} LD=${LD:-${CROSS}${link_with_cc:-ld}} AS=${AS:-${CROSS}as} STRIP=${STRIP:-${CROSS}strip} NM=${NM:-${CROSS}nm} AS_SFX=.s + EXE_SFX= } process_common_toolchain() { if [ -z "$toolchain" ]; then - gcctarget="$(gcc -dumpmachine 2> /dev/null)" + gcctarget="${CHOST:-$(gcc -dumpmachine 2> /dev/null)}" # detect tgt_isa case "$gcctarget" in + armv6*) + tgt_isa=armv6 + ;; + armv7*) + tgt_isa=armv7 + ;; + armv5te*) + tgt_isa=armv5te + ;; *x86_64*|*amd64*) tgt_isa=x86_64 ;; @@ -572,6 +633,14 @@ process_common_toolchain() { tgt_isa=x86_64 tgt_os=darwin10 ;; + *darwin11*) + tgt_isa=x86_64 + tgt_os=darwin11 + ;; + *darwin12*) + tgt_isa=x86_64 + tgt_os=darwin12 + ;; *mingw32*|*cygwin*) [ -z "$tgt_isa" ] && tgt_isa=x86 tgt_os=win32 @@ -582,6 +651,9 @@ process_common_toolchain() { *solaris2.10) tgt_os=solaris ;; + *os2*) + tgt_os=os2 + ;; esac if [ -n "$tgt_isa" ] && [ -n "$tgt_os" ]; then @@ -610,39 +682,60 @@ process_common_toolchain() { # Enable the architecture family case ${tgt_isa} in - arm*|iwmmxt*) enable arm;; - mips*) enable mips;; + arm*) enable arm;; + mips*) enable mips;; esac # PIC is probably what we want when building shared libs enabled shared && soft_enable pic - # Handle darwin variants + # Handle darwin variants. Newer SDKs allow targeting older + # platforms, so find the newest SDK available. + case ${toolchain} in + *-darwin*) + if [ -z "${DEVELOPER_DIR}" ]; then + DEVELOPER_DIR=`xcode-select -print-path 2> /dev/null` + [ $? -ne 0 ] && OSX_SKIP_DIR_CHECK=1 + fi + if [ -z "${OSX_SKIP_DIR_CHECK}" ]; then + OSX_SDK_ROOTS="${DEVELOPER_DIR}/SDKs" + OSX_SDK_VERSIONS="MacOSX10.4u.sdk MacOSX10.5.sdk MacOSX10.6.sdk" + OSX_SDK_VERSIONS="${OSX_SDK_VERSIONS} MacOSX10.7.sdk" + for v in ${OSX_SDK_VERSIONS}; do + if [ -d "${OSX_SDK_ROOTS}/${v}" ]; then + osx_sdk_dir="${OSX_SDK_ROOTS}/${v}" + fi + done + fi + ;; + esac + + if [ -d "${osx_sdk_dir}" ]; then + add_cflags "-isysroot ${osx_sdk_dir}" + add_ldflags "-isysroot ${osx_sdk_dir}" + fi + case ${toolchain} in *-darwin8-*) - add_cflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk" add_cflags "-mmacosx-version-min=10.4" - add_ldflags "-isysroot /Developer/SDKs/MacOSX10.4u.sdk" add_ldflags "-mmacosx-version-min=10.4" ;; *-darwin9-*) - add_cflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk" add_cflags "-mmacosx-version-min=10.5" - add_ldflags "-isysroot /Developer/SDKs/MacOSX10.5.sdk" add_ldflags "-mmacosx-version-min=10.5" ;; *-darwin10-*) - add_cflags "-isysroot /Developer/SDKs/MacOSX10.6.sdk" add_cflags "-mmacosx-version-min=10.6" - add_ldflags "-isysroot /Developer/SDKs/MacOSX10.6.sdk" add_ldflags "-mmacosx-version-min=10.6" ;; *-darwin11-*) - add_cflags "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk" add_cflags "-mmacosx-version-min=10.7" - add_ldflags "-isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.7.sdk" add_ldflags "-mmacosx-version-min=10.7" ;; + *-darwin12-*) + add_cflags "-mmacosx-version-min=10.8" + add_ldflags "-mmacosx-version-min=10.8" + ;; esac # Handle Solaris variants. Solaris 10 needs -lposix4 @@ -658,44 +751,54 @@ process_common_toolchain() { # Process ARM architecture variants case ${toolchain} in - arm*|iwmmxt*) - # on arm, isa versions are supersets - enabled armv7a && soft_enable armv7 ### DEBUG - enabled armv7 && soft_enable armv6 - enabled armv7 || enabled armv6 && soft_enable armv5te - enabled armv7 || enabled armv6 && soft_enable fast_unaligned - enabled iwmmxt2 && soft_enable iwmmxt - enabled iwmmxt && soft_enable armv5te + arm*) + # on arm, isa versions are supersets + case ${tgt_isa} in + armv7) + soft_enable neon + soft_enable media + soft_enable edsp + soft_enable fast_unaligned + ;; + armv6) + soft_enable media + soft_enable edsp + soft_enable fast_unaligned + ;; + armv5te) + soft_enable edsp + ;; + esac - asm_conversion_cmd="cat" + asm_conversion_cmd="cat" case ${tgt_cc} in gcc) - if enabled iwmmxt || enabled iwmmxt2 - then - CROSS=${CROSS:-arm-iwmmxt-linux-gnueabi-} - elif enabled symbian; then - CROSS=${CROSS:-arm-none-symbianelf-} - else - CROSS=${CROSS:-arm-none-linux-gnueabi-} - fi + CROSS=${CROSS:-arm-none-linux-gnueabi-} link_with_cc=gcc setup_gnu_toolchain arch_int=${tgt_isa##armv} arch_int=${arch_int%%te} check_add_asflags --defsym ARCHITECTURE=${arch_int} tune_cflags="-mtune=" - if enabled iwmmxt || enabled iwmmxt2 - then - check_add_asflags -mcpu=${tgt_isa} - elif enabled armv7 - then - check_add_cflags -march=armv7-a -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-ftree-vectorize - check_add_asflags -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp #-march=armv7-a + if [ ${tgt_isa} == "armv7" ]; then + check_add_cflags -march=armv7-a -mfloat-abi=softfp + check_add_asflags -march=armv7-a -mfloat-abi=softfp + + if enabled neon + then + check_add_cflags -mfpu=neon #-ftree-vectorize + check_add_asflags -mfpu=neon + fi + + if [ -z "${tune_cpu}" ]; then + tune_cpu=cortex-a8 + fi else check_add_cflags -march=${tgt_isa} check_add_asflags -march=${tgt_isa} fi + enabled debug && add_asflags -g asm_conversion_cmd="${source_path}/build/make/ads2gas.pl" ;; @@ -709,10 +812,14 @@ process_common_toolchain() { tune_cflags="--cpu=" tune_asflags="--cpu=" if [ -z "${tune_cpu}" ]; then - if enabled armv7 - then - check_add_cflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3 - check_add_asflags --cpu=Cortex-A8 --fpu=softvfp+vfpv3 + if [ ${tgt_isa} == "armv7" ]; then + if enabled neon + then + check_add_cflags --fpu=softvfp+vfpv3 + check_add_asflags --fpu=softvfp+vfpv3 + fi + check_add_cflags --cpu=Cortex-A8 + check_add_asflags --cpu=Cortex-A8 else check_add_cflags --cpu=${tgt_isa##armv} check_add_asflags --cpu=${tgt_isa##armv} @@ -733,12 +840,58 @@ process_common_toolchain() { disable multithread disable os_support ;; + + android*) + SDK_PATH=${sdk_path} + COMPILER_LOCATION=`find "${SDK_PATH}" \ + -name "arm-linux-androideabi-gcc*" -print -quit` + TOOLCHAIN_PATH=${COMPILER_LOCATION%/*}/arm-linux-androideabi- + CC=${TOOLCHAIN_PATH}gcc + CXX=${TOOLCHAIN_PATH}g++ + AR=${TOOLCHAIN_PATH}ar + LD=${TOOLCHAIN_PATH}gcc + AS=${TOOLCHAIN_PATH}as + STRIP=${TOOLCHAIN_PATH}strip + NM=${TOOLCHAIN_PATH}nm + + if [ -z "${alt_libc}" ]; then + alt_libc=`find "${SDK_PATH}" -name arch-arm -print | \ + awk '{n = split($0,a,"/"); \ + split(a[n-1],b,"-"); \ + print $0 " " b[2]}' | \ + sort -g -k 2 | \ + awk '{ print $1 }' | tail -1` + fi + + add_cflags "--sysroot=${alt_libc}" + add_ldflags "--sysroot=${alt_libc}" + + # linker flag that routes around a CPU bug in some + # Cortex-A8 implementations (NDK Dev Guide) + add_ldflags "-Wl,--fix-cortex-a8" + + enable pic + soft_enable realtime_only + if [ ${tgt_isa} == "armv7" ]; then + soft_enable runtime_cpu_detect + fi + if enabled runtime_cpu_detect; then + add_cflags "-I${SDK_PATH}/sources/android/cpufeatures" + fi + ;; + darwin*) - SDK_PATH=/Developer/Platforms/iPhoneOS.platform/Developer + if [ -z "${sdk_path}" ]; then + SDK_PATH=`xcode-select -print-path 2> /dev/null` + SDK_PATH=${SDK_PATH}/Platforms/iPhoneOS.platform/Developer + else + SDK_PATH=${sdk_path} + fi TOOLCHAIN_PATH=${SDK_PATH}/usr/bin + CXX=${TOOLCHAIN_PATH}/g++ CC=${TOOLCHAIN_PATH}/gcc AR=${TOOLCHAIN_PATH}/ar - LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-gcc-4.2.1 + LD=${TOOLCHAIN_PATH}/arm-apple-darwin10-llvm-gcc-4.2 AS=${TOOLCHAIN_PATH}/as STRIP=${TOOLCHAIN_PATH}/strip NM=${TOOLCHAIN_PATH}/nm @@ -752,13 +905,14 @@ process_common_toolchain() { add_cflags -arch ${tgt_isa} add_ldflags -arch_only ${tgt_isa} - add_cflags "-isysroot ${SDK_PATH}/SDKs/iPhoneOS4.3.sdk" + if [ -z "${alt_libc}" ]; then + alt_libc=${SDK_PATH}/SDKs/iPhoneOS5.1.sdk + fi - # This should be overridable - alt_libc=${SDK_PATH}/SDKs/iPhoneOS4.3.sdk + add_cflags "-isysroot ${alt_libc}" # Add the paths for the alternate libc - for d in usr/include usr/include/gcc/darwin/4.2/ usr/lib/gcc/arm-apple-darwin10/4.2.1/include/; do + for d in usr/include; do try_dir="${alt_libc}/${d}" [ -d "${try_dir}" ] && add_cflags -I"${try_dir}" done @@ -795,29 +949,19 @@ process_common_toolchain() { fi ;; - symbian*) - enable symbian - # Add the paths for the alternate libc - for d in include/libc; do - try_dir="${alt_libc}/${d}" - [ -d "${try_dir}" ] && add_cflags -I"${try_dir}" - done - for d in release/armv5/urel; do - try_dir="${alt_libc}/${d}" - [ -d "${try_dir}" ] && add_ldflags -L"${try_dir}" - done - add_cflags -DIMPORT_C= - esac ;; mips*) - CROSS=${CROSS:-mipsel-linux-uclibc-} link_with_cc=gcc setup_gnu_toolchain tune_cflags="-mtune=" + if enabled dspr2; then + check_add_cflags -mips32r2 -mdspr2 + disable fast_unaligned + fi check_add_cflags -march=${tgt_isa} - check_add_asflags -march=${tgt_isa} - check_add_asflags -KPIC + check_add_asflags -march=${tgt_isa} + check_add_asflags -KPIC ;; ppc*) enable ppc @@ -845,6 +989,11 @@ process_common_toolchain() { x86*) bits=32 enabled x86_64 && bits=64 + check_cpp </dev/null 2>&1 && AS=yasm [ "${AS}" = auto -o -z "${AS}" ] \ && die "Neither yasm nor nasm have been found" - ;; + ;; esac log_echo " using $AS" [ "${AS##*/}" = nasm ] && add_asflags -Ox AS_SFX=.asm case ${tgt_os} in - win*) - add_asflags -f win${bits} + win32) + add_asflags -f win32 + enabled debug && add_asflags -g cv8 + ;; + win64) + add_asflags -f x64 enabled debug && add_asflags -g cv8 ;; linux*|solaris*) @@ -928,6 +1091,11 @@ process_common_toolchain() { # enabled icc && ! enabled pic && add_cflags -fno-pic -mdynamic-no-pic enabled icc && ! enabled pic && add_cflags -fno-pic ;; + os2) + add_asflags -f aout + enabled debug && add_asflags -g + EXE_SFX=.exe + ;; *) log "Warning: Unknown os $tgt_os while setting up $AS flags" ;; esac @@ -989,11 +1157,24 @@ EOF # Almost every platform uses pthreads. if enabled multithread; then case ${toolchain} in - *-win*);; + *-win*-vs*);; + *-android-gcc);; *) check_header pthread.h && add_extralibs -lpthread esac fi + # only for MIPS platforms + case ${toolchain} in + mips*) + if enabled dspr2; then + if enabled big_endian; then + echo "dspr2 optimizations are available only for little endian platforms" + disable dspr2 + fi + fi + ;; + esac + # for sysconf(3) and friends. check_header unistd.h @@ -1040,6 +1221,22 @@ print_config_h() { done } +print_webm_license() { + local destination=$1 + local prefix=$2 + local suffix=$3 + shift 3 + cat < ${destination} +${prefix} Copyright (c) 2011 The WebM project authors. All Rights Reserved.${suffix} +${prefix} ${suffix} +${prefix} Use of this source code is governed by a BSD-style license${suffix} +${prefix} that can be found in the LICENSE file in the root of the source${suffix} +${prefix} tree. An additional intellectual property rights grant can be found${suffix} +${prefix} in the file PATENTS. All contributing project authors may${suffix} +${prefix} be found in the AUTHORS file in the root of the source tree.${suffix} +EOF +} + process_targets() { true; } diff --git a/build/make/gen_asm_deps.sh b/build/make/gen_asm_deps.sh index a75418aa6..0b4e3aa84 100755 --- a/build/make/gen_asm_deps.sh +++ b/build/make/gen_asm_deps.sh @@ -42,7 +42,7 @@ done [ -n "$srcfile" ] || show_help sfx=${sfx:-asm} -includes=$(egrep -i "include +\"?[a-z0-9_/]+\.${sfx}" $srcfile | +includes=$(LC_ALL=C egrep -i "include +\"?[a-z0-9_/]+\.${sfx}" $srcfile | perl -p -e "s;.*?([a-z0-9_/]+.${sfx}).*;\1;") #" restore editor state for inc in ${includes}; do diff --git a/build/make/obj_int_extract.c b/build/make/obj_int_extract.c index fc7460050..f86cec2ac 100644 --- a/build/make/obj_int_extract.c +++ b/build/make/obj_int_extract.c @@ -602,7 +602,7 @@ int parse_coff(uint8_t *buf, size_t sz) { uint32_t symoffset; char **sectionlist; // this array holds all section names in their correct order. - // it is used to check if the symbol is in .bss or .data section. + // it is used to check if the symbol is in .bss or .rdata section. nsections = get_le16(buf + 2); symtab_ptr = get_le32(buf + 8); @@ -643,15 +643,15 @@ int parse_coff(uint8_t *buf, size_t sz) { } strcpy(sectionlist[i], sectionname); - if (!strcmp(sectionname, ".data")) sectionrawdata_ptr = get_le32(ptr + 20); + if (!strcmp(sectionname, ".rdata")) sectionrawdata_ptr = get_le32(ptr + 20); ptr += 40; } // log_msg("COFF: Symbol table at offset %u\n", symtab_ptr); - // log_msg("COFF: raw data pointer ofset for section .data is %u\n", sectionrawdata_ptr); + // log_msg("COFF: raw data pointer ofset for section .rdata is %u\n", sectionrawdata_ptr); - /* The compiler puts the data with non-zero offset in .data section, but puts the data with + /* The compiler puts the data with non-zero offset in .rdata section, but puts the data with zero offset in .bss section. So, if the data in in .bss section, set offset=0. Note from Wiki: In an object module compiled from C, the bss section contains the local variables (but not functions) that were declared with the static keyword, -- 2.40.0