218 lines
9.2 KiB
Makefile
218 lines
9.2 KiB
Makefile
# Copyright (C) 2009 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
# These definitions contain a few host-specific functions. I.e. they are
|
|
# typically used to generate shell commands during the build and their
|
|
# implementation will depend on the value of the HOST_OS variable.
|
|
#
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-path
|
|
# Arguments: 1: file path
|
|
# Returns : file path, as understood by the host file system
|
|
# Usage : $(call host-path,<path>)
|
|
# Rationale: This function is used to translate Cygwin paths into
|
|
# Cygwin-specific ones. On other platforms, it will just
|
|
# return its argument.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),cygwin)
|
|
host-path = $(if $(strip $1),$(call cygwin-to-host-path,$1))
|
|
else
|
|
host-path = $1
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-rm
|
|
# Arguments: 1: list of files
|
|
# Usage : $(call host-rm,<files>)
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to remove some files.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-rm = \
|
|
$(eval __host_rm_files := $(foreach __host_rm_file,$1,$(subst /,\,$(wildcard $(__host_rm_file)))))\
|
|
$(if $(__host_rm_files),del /f/q $(__host_rm_files) >NUL 2>NUL)
|
|
else
|
|
host-rm = rm -f $1
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-rmdir
|
|
# Arguments: 1: list of files or directories
|
|
# Usage : $(call host-rm,<files>)
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to remove some files _and_ directories.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-rmdir = \
|
|
$(eval __host_rmdir_files := $(foreach __host_rmdir_file,$1,$(subst /,\,$(wildcard $(__host_rmdir_file)))))\
|
|
$(if $(__host_rmdir_files),del /f/s/q $(__host_rmdir_files) >NUL 2>NUL)
|
|
else
|
|
host-rmdir = rm -rf $1
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-mkdir
|
|
# Arguments: 1: directory path
|
|
# Usage : $(call host-mkdir,<path>
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to create a path if it doesn't exist.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-mkdir = md $(subst /,\,"$1") >NUL 2>NUL || rem
|
|
else
|
|
host-mkdir = mkdir -p $1
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-cp
|
|
# Arguments: 1: source file
|
|
# 2: target file
|
|
# Usage : $(call host-cp,<src-file>,<dst-file>)
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to copy a single file
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-cp = copy /b/y $(subst /,\,"$1" "$2") > NUL
|
|
else
|
|
host-cp = cp -f $1 $2
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-mv
|
|
# Arguments: 1: source file
|
|
# 2: target file
|
|
# Usage : $(call host-mv,<src-file>,<dst-file>)
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to move a single file
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-mv = move /y $(subst /,\,"$1" "$2") > NUL
|
|
else
|
|
host-mv = mv -f $1 $2
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-install
|
|
# Arguments: 1: source file
|
|
# 2: target file
|
|
# Usage : $(call host-install,<src-file>,<dst-file>)
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to install a file or directory, while preserving its timestamps
|
|
# (if possible).
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-install = copy /b/y $(subst /,\,"$1" "$2") > NUL
|
|
else
|
|
host-install = install -p $1 $2
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-echo-build-step
|
|
# Arguments: 1: ABI
|
|
# 2: Step description (e.g. 'Compile C++', or 'StaticLibrary')
|
|
# Usage : ---->|$(call host-echo-build-step,Compile) ....other text...
|
|
# Rationale: This function expands to the host-specific shell command used
|
|
# to print the prefix of a given build step / command.
|
|
# -----------------------------------------------------------------------------
|
|
host-echo-build-step = @ $(HOST_ECHO) [$1] $(call left-justify-quoted-15,$2):
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-c-includes
|
|
# Arguments: 1: list of file paths (e.g. "foo bar")
|
|
# Returns : list of include compiler options (e.g. "-Ifoo -Ibar")
|
|
# Usage : $(call host-c-includes,<paths>)
|
|
# Rationale: This function is used to translate Cygwin paths into
|
|
# Cygwin-specific ones. On other platforms, it will just
|
|
# return its argument.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),cygwin)
|
|
host-c-includes = $(patsubst %,-I%,$(call host-path,$1))
|
|
else
|
|
host-c-includes = $(1:%=-I%)
|
|
endif
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-copy-if-differ
|
|
# Arguments: 1: source file
|
|
# 2: destination file
|
|
# Usage : $(call host-copy-if-differ,<src-file>,<dst-file>)
|
|
# Rationale: This function copy source file to destination file if contents are
|
|
# different.
|
|
# -----------------------------------------------------------------------------
|
|
ifeq ($(HOST_OS),windows)
|
|
host-copy-if-differ = $(HOST_CMP) -s $1 $2 > NUL || copy /b/y $(subst /,\,"$1" "$2") > NUL
|
|
else
|
|
host-copy-if-differ = $(HOST_CMP) -s $1 $2 > /dev/null 2>&1 || cp -f $1 $2
|
|
endif
|
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
# Function : host-path-is-absolute
|
|
# Arguments: 1: file path
|
|
# Usage : $(call host-path-is-absolute,<path>)
|
|
# Rationale: This function returns a non-empty result if the input path is
|
|
# absolute on the host filesystem.
|
|
# -----------------------------------------------------------------------------
|
|
|
|
# On Windows, we need to take care drive prefix in file paths, e.g.:
|
|
# /foo -> top-level 'foo' directory on current drive.
|
|
# //bar/foo -> top-level 'foo' on network share 'bar'
|
|
# c:/foo -> top-level 'foo' directory on C drive.
|
|
# c:foo -> 'foo' subdirectory on C drive's current directory.
|
|
#
|
|
# Treat all of them as absolute. Filtering the first two cases is easy
|
|
# by simply looking at the first character. The other ones are more
|
|
# complicated and the simplest way is still to try all alphabet letters
|
|
# directly. Anything else involves very complicated GNU Make parsing
|
|
# voodoo.
|
|
ndk-windows-drive-letters := a b c d e f g h i j k l m n o p q r s t u v w x y z \
|
|
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
|
|
|
|
ndk-windows-drive-patterns := $(foreach _drive,$(ndk-windows-drive-letters),$(_drive):%)
|
|
|
|
windows-path-is-absolute = $(if $(filter /% $(ndk-windows-drive-patterns),$(subst \,/,$1)),true)
|
|
|
|
ifeq ($(HOST_OS),windows)
|
|
host-path-is-absolute = $(call windows-path-is-absolute,$1)
|
|
else
|
|
host-path-is-absolute = $(if $(filter /%,$1),true)
|
|
endif
|
|
|
|
-test-host-path-is-absolute.relative-paths = \
|
|
$(call test-expect,,$(call host-path-is-absolute,foo))\
|
|
$(call test-expect,,$(call host-path-is-absolute,foo/bar))\
|
|
$(call test-expect,,$(call host-path-is-absolute,.))\
|
|
$(call test-expect,,$(call host-path-is-absolute,..))
|
|
|
|
-test-host-path-is-absolute.absolute-paths = \
|
|
$(call test-expect,true,$(call host-path-is-absolute,/))\
|
|
$(call test-expect,true,$(call host-path-is-absolute,/foo))\
|
|
$(call test-expect,true,$(call host-path-is-absolute,/foo/bar))\
|
|
$(call test-expect,true,$(call host-path-is-absolute,//foo))\
|
|
$(call test-expect,true,$(call host-path-is-absolute,/.))
|
|
|
|
-test-host-path-is-asbolute.windows-relative-paths = \
|
|
$(call test-expect,$(call windows-path-is-absolute,foo))\
|
|
$(call test-expect,$(call windows-path-is-absolute,foo/bar))\
|
|
$(call test-expect,$(call windows-path-is-absolute,.))\
|
|
$(call test-expect,$(call windows-path-is-absolute,..))
|
|
|
|
-test-host-path-is-asbolute.windows-absolute-paths = \
|
|
$(call test-expect,true,$(call windows-path-is-absolute,c:/))\
|
|
$(call test-expect,true,$(call windows-path-is-absolute,x:))\
|
|
$(call test-expect,true,$(call windows-path-is-absolute,K:foo))\
|
|
$(call test-expect,true,$(call windows-path-is-absolute,C:\Foo\Bar))\
|
|
$(call test-expect,true,$(call windows-path-is-absolute,\Foo))
|