# # Copyright (C) 2008 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. # # Assemble the Native Development Kit # Assembled using the generic build by default. # (set in device/config/product_config.make) # A macro to make rules to copy all newer files in a directory tree matching an # optional find filter and add the files to a list variable for dependencies. # Designed after copy_headers.make: Create a rule to copy each file; # copy-one-file defines the actual rule. # $(1): source directory tree root # $(2): destination directory tree root # $(3): list variable to append destination files to # $(4): optional find(1) arguments define define-tree-copy-rules $(eval _src_files := $(shell find $(1) -type f $(4))) \ $(foreach _src, $(_src_files), \ $(eval _dest := $(patsubst $(1)%,$(2)%,$(_src))) \ $(eval $(3) := $($(3)) $(_dest)) \ $(eval $(call copy-one-file,$(_src),$(_dest))) \ ) endef #------------------------------------------------------------------------------- # Install all the files needed to build the pndk. # We build three versions of the pndk # (1) The full version, with source. # (2) The full version, without source. # (3) A JNI-only version, with source. # # We make five sets of trees: # (A) Common files used in all versions of the pndk # (B) Common files used in the full versions of the pndk # (C) Files used in the standard pndk (no source files included) # (D) Files used in both the JNI-only and full-with-source version # (E) Files used in just the full-with-source version # # Each pndk version is created by combining the appropriate trees: # # (A) (B) (C) (D) (E) # (1) yes yes yes yes # (2) yes yes yes # (3) yes yes # # Source is provided for partners who want to recompile our libraries for optimization. # The JNI-only version is provided for partners that want to create shared # libraries that can be packaged with APK files and called from Java code. LOCAL_PATH := $(call my-dir) # Source trees for the pndk samples_src_dir := $(LOCAL_PATH)/samples sample_src_dir := $(samples_src_dir)/sample samplejni_src_dir := $(samples_src_dir)/samplejni config_src_dir := $(LOCAL_PATH)/config kernel_common_src_dir := $(KERNEL_HEADERS_COMMON) kernel_arch_src_dir := $(KERNEL_HEADERS_ARCH) bionic_src_dir := bionic jni_src_dir := $(JNI_H_INCLUDE) # Workspace directory pndk_intermediates := $(call intermediates-dir-for,PACKAGING,pndk) # Common destination trees for the pndk pndk_common_tree := $(pndk_intermediates)/common pndk_common_dest_dir := $(pndk_common_tree)/pndk samplejni_dest_dir := $(pndk_common_dest_dir)/samples/samplejni config_dest_dir := $(pndk_common_dest_dir)/config kernel_dest_dir := $(pndk_common_dest_dir)/include/kernel/include gcc_dest_dir := $(pndk_common_dest_dir)/toolchain jni_dest_dir := $(pndk_common_dest_dir)/include/nativehelper # Common-full destination trees for the pndk pndk_common_full_tree := $(pndk_intermediates)/common_full pndk_common_full_dest_dir := $(pndk_common_full_tree)/pndk sample_dest_dir := $(pndk_common_full_dest_dir)/samples/sample # Destination trees without source for the standard pndk (without source) pndk_no_src_tree := $(pndk_intermediates)/no_src pndk_no_src_dest_dir := $(pndk_no_src_tree)/pndk bionic_no_src_dest_dir := $(pndk_no_src_dest_dir)/include/bionic # Destination trees including source for the pndk with source pndk_src_tree := $(pndk_intermediates)/with_src pndk_src_dest_dir := $(pndk_src_tree)/pndk bionic_src_dest_dir := $(pndk_src_dest_dir)/include/bionic # Destinations of all common files (not picked up by tree rules below) pndk_common_dest_files := $(pndk_common_dest_dir)/Android_PNDK_README.html \ $(pndk_common_dest_dir)/config/armelf.x \ $(pndk_common_dest_dir)/config/armelflib.x \ $(pndk_common_dest_dir)/lib/crtbegin_dynamic.o \ $(pndk_common_dest_dir)/lib/crtend_android.o \ $(pndk_common_dest_dir)/lib/libc.so \ $(pndk_common_dest_dir)/lib/libm.so # Destinations of files used by the full, non-jni-only configurations pndk_common_full_dest_files := \ $(pndk_common_full_dest_dir)/lib/libdl.so \ $(pndk_common_full_dest_dir)/lib/libstdc++.so # Install common files outside common trees $(pndk_common_dest_dir)/Android_PNDK_README.html: $(LOCAL_PATH)/Android_PNDK_README.html | $(ACP) @echo "pndk Android_PNDK_README.html: from $? to $@" $(copy-file-to-target) $(pndk_common_dest_dir)/config/armelf.x: $(BUILD_SYSTEM)/armelf.x | $(ACP) @echo "pndk config: $@" $(copy-file-to-target) $(pndk_common_dest_dir)/config/armelflib.x: $(BUILD_SYSTEM)/armelflib.x | $(ACP) @echo "pndk config: $@" $(copy-file-to-target) $(pndk_common_dest_dir)/lib/%: $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/% | $(ACP) @echo "pndk lib: $@" $(copy-file-to-target) # Install common_full files outside common trees $(pndk_common_full_dest_dir)/lib/%: $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/% | $(ACP) @echo "pndk lib full: $@" $(copy-file-to-target) # Install files in common trees listvar := pndk_common_dest_files $(call define-tree-copy-rules,$(samplejni_src_dir),$(samplejni_dest_dir),$(listvar)) $(call define-tree-copy-rules,$(config_src_dir),$(config_dest_dir),$(listvar)) $(call define-tree-copy-rules,$(kernel_common_src_dir),$(kernel_dest_dir),$(listvar)) $(call define-tree-copy-rules,$(kernel_arch_src_dir),$(kernel_dest_dir),$(listvar)) $(call define-tree-copy-rules,$(jni_src_dir),$(jni_dest_dir),$(listvar), -name jni.h) # Install files common to the full builds but not the JNI build listvar := pndk_common_full_dest_files $(call define-tree-copy-rules,$(sample_src_dir),$(sample_dest_dir),$(listvar)) # Install files without sources listvar := pndk_no_src_dest_files $(call define-tree-copy-rules,$(bionic_src_dir),$(bionic_no_src_dest_dir),$(listvar),-name '*.h') # Install files including sources listvar := pndk_with_src_dest_files $(call define-tree-copy-rules,$(bionic_src_dir),$(bionic_src_dest_dir),$(listvar)) #------------------------------------------------------------------------------- # Create the multiple versions of the pndk: # pndk_no_src all files without source # pndk_with_source all files with source # pndk_jni_with_source just files for building JNI shared libraries with source. # Name the tar files name := android_pndk-$(TARGET_PRODUCT) ifeq ($(TARGET_BUILD_TYPE),debug) name := $(name)_debug endif name := $(name)-$(BUILD_NUMBER) pndk_tarfile := $(pndk_intermediates)/$(name).tar pndk_tarfile_zipped := $(pndk_tarfile).gz pndk_with_src_tarfile := $(pndk_intermediates)/$(name)-src.tar pndk_with_src_tarfile_zipped := $(pndk_with_src_tarfile).gz pndk_jni_with_src_tarfile := $(pndk_intermediates)/$(name)-jni-src.tar pndk_jni_with_src_tarfile_zipped := $(pndk_jni_with_src_tarfile).gz .PHONY: pndk pndk_with_src pndk_no_src pndk_jni_with_src pndk_debug pndk: pndk_no_src pndk_with_src pndk_jni_with_src pndk_no_src: $(pndk_tarfile_zipped) pndk_with_src: $(pndk_with_src_tarfile_zipped) pndk_jni_with_src: $(pndk_jni_with_src_tarfile_zipped) # Put the pndk zip files in the distribution directory $(call dist-for-goals,pndk,$(pndk_tarfile_zipped)) $(call dist-for-goals,pndk,$(pndk_with_src_tarfile_zipped)) $(call dist-for-goals,pndk,$(pndk_jni_with_src_tarfile_zipped)) # zip up tar files %.tar.gz: %.tar @echo "pndk: zipped $<" $(hide) gzip -cf $< > $@ # tar up the files without our sources to make the pndk. $(pndk_tarfile): $(pndk_common_dest_files) $(pndk_common_full_dest_files) $(pndk_no_src_dest_files) @echo "pndk: $@" @mkdir -p $(dir $@) @rm -f $@ $(hide) tar rf $@ -C $(pndk_common_tree) pndk $(hide) tar rf $@ -C $(pndk_common_full_tree) pndk $(hide) tar rf $@ -C $(pndk_no_src_tree) pndk # tar up the full sources to make the pndk with sources. $(pndk_with_src_tarfile): $(pndk_common_dest_files) $(pndk_common_full_dest_files) $(pndk_with_src_dest_files) $(pndk_full_with_src_dest_files) @echo "pndk: $@" @mkdir -p $(dir $@) @rm -f $@ $(hide) tar rf $@ -C $(pndk_common_tree) pndk $(hide) tar rf $@ -C $(pndk_common_full_tree) pndk $(hide) tar rf $@ -C $(pndk_src_tree) pndk # tar up the sources to make the pndk with JNI support. $(pndk_jni_with_src_tarfile): $(pndk_common_dest_files) $(pndk_with_src_dest_files) @echo "pndk: $@" @mkdir -p $(dir $@) @rm -f $@ $(hide) tar rf $@ -C $(pndk_common_tree) pndk $(hide) tar rf $@ -C $(pndk_src_tree) pndk # Debugging reporting can go here, add it as a target to get output. pndk_debug: pndk @echo "You are here: $@" @echo "pndk tar file: $(pndk_tarfile_zipped)" @echo "pndk_with_src tar file: $(pndk_with_src_tarfile_zipped)" @echo "pndk_jni_with_src tar file: $(pndk_jni_with_src_tarfile_zipped)" @echo "pndk_files: $(pndk_no_src_dest_files)" @echo "pndk_with_src files: $(pndk_with_src_dest_files)" @echo "pndk_full_with_src files: $(pndk_full_with_src_dest_files)" @echo "pndk_common_files: $(pndk_common_dest_files)" @echo "pndk_common_full_dest_files: $(pndk_common_full_dest_files)"