2016-04-11 9 views
1

'da belirtilen her platform için makefile yoluyla kabuk komut dosyasını çalıştırıyorum, platform x86, armeabi ve armeabi-v7a için geliştirilmiş bir Android uygulamasına sahibim. Artık platformun x86 veya kol olup olmamasına bağlı olarak, senaryoyu uygun argümanlarla uygun şekilde çalıştırmam gerekiyor, böylece uygun üçüncü parti araç ortamı değişkenleri ayarlanıyor.Android, APP_ABI

.o.cpp: 
     ifeq ($(TARGET_ARCH),x86) 
      $(info $(shell ($(CACHE_LOCAL_PATH_MAIN)/setup_tool.sh x86))) 
     else 
      $(info $(shell ($(CACHE_LOCAL_PATH_MAIN)/setup_tool.sh arm))) 
     endif 

Ama sorun makefile ayrıştırılır zaman, bu komut dosyaları her platformun derleme başlar önce değil başlangıç ​​safhasında kendisini 3 kez çalıştırmak ve almak,: Ben aşağıda yapıyor çalıştı. Bunu düzeltmenin bir yolu var mı? Bu yüzden, betik her platformun derlenmesinden hemen önce kaçıyor. Teşekkürler. dosya Android.mk ile GÜNCELLEME

:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_C_INCLUDES := \ <path_to_include_files> 

LOCAL_CFLAGS := <cflags included here> 

LOCAL_LDLIBS := <ld libs included here> 

LOCAL_SRC_FILES := <src files to be compiled> 

LOCAL_MODULE := <module_name> 

LOCAL_SHARED_LIBRARIES := <shared libs on which we are dependent> 

LOCAL_WHOLE_STATIC_LIBRARIES := <static libs> 

include $(BUILD_SHARED_LIBRARY) 
+0

** Android.mk ** 'e sahipseniz, o zaman en iyi uygulama tüm ilgili açıklamaları buraya koymaktır. Unutmayın ki, Android.mk ** sonunda bir makefile, ve aynı sözdizimi kurallarını ve yaşam döngüsünü her zamanki bir makefile olarak izler, sadece NDK'nın karmaşık çerçevesinden alınır ve birden çok kez kullanılır (ABI başına bir kez). ve yerel kitaplığı hedef olarak ayarlar. Böylece, 'setup_tool.sh' dosyasını yerel kitaplığın bir bağımlılığı olarak çalıştırabilirsiniz. –

+0

Evet, Android.mk kullanıyoruz. Kabuk betiğini, hedeflediğim paylaşılan nesneye bağımlılık olarak nasıl eklediğimi lütfen paylaşır mısınız? .so oluşturmak için format benim soruya eklediğim gibi görünüyor. –

+0

Bu çevresel değişkenleri ne zaman kullanmak istiyorsunuz? Bu kuralın uygulanmasında veya başka bir kuralda mı? – Beta

cevap

1

Basit ama zarif çözüm aşağıdaki gibidir:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 

LOCAL_C_INCLUDES := \ <path_to_include_files> 

LOCAL_CFLAGS := <cflags included here> 

LOCAL_LDLIBS := <ld libs included here> 

ifeq ($(TARGET_ARCH),x86) 
    LOCAL_SRC_FILES := /tmp/dummy.x86.c 
else 
    LOCAL_SRC_FILES := /tmp/dummy.arm.c 
     $(info $(shell ($(CACHE_LOCAL_PATH_MAIN)/setup_tool.sh arm))) 
endif 

LOCAL_SRC_FILES += <src files to be compiled> 

LOCAL_MODULE := <module_name> 

LOCAL_SHARED_LIBRARIES := <shared libs on which we are dependent> 

LOCAL_WHOLE_STATIC_LIBRARIES := <static libs> 

include $(BUILD_SHARED_LIBRARY) 

.PHONY: /tmp/dummy.x86.c /tmp/dummy.arm.c 

/tmp/dummy.x86.c: 
     $(CACHE_LOCAL_PATH_MAIN)/setup_tool.sh x86 
     @touch [email protected] 

/tmp/dummy.arm.c: 
     $(CACHE_LOCAL_PATH_MAIN)/setup_tool.sh arm 
     @touch [email protected] 

Bir ihtar: Bu bile, kütüphaneye her zaman bağlayacak hiçbir şey değişmezse. Bunu iyileştirmek için bağımlılıkları .PHONY yerine dikkatli bir şekilde ayarlayabilirsiniz.

+0

Bravo !!, komut yapısını bir kez kol yapısı için ve x86 yapısı için bir kez çalıştırıyor gibi görünüyor (ki bu yeterince iyi olmalı). Muhtemelen '.gitignore' için üretilen yeni dosyaları ekleyebilirim. Bu değişikliklerden sonra farklı bir sorunu çözmeye çalışıyorum. Kabuk betiği çalıştırıldıktan ve ortam değişkenleri kabuk kaynak kodundan sonra bile ayarlanmışsa, bu değişkenler derlemeyi tetiklediğim ana kabuk komut dosyasına ayarlanmamıştır, çünkü üçüncü parti aracının bu yana çalıştırılamaması nedeniyle. PATH 'güncellenmedi ve şu anda araştırmakta olduğum şey. GIT ile ilgili sorunları önlemek için –

+0

, dosyayı sürüm kontrollü dizinlerinizin dışına çıkarabilir ve bu dosyaların her yerine mutlak yolunu kullanabilirsiniz. –

+0

Haklısınız, ** make ** derlemek için kullanılan kabuklara yayılmayan ikincil bir kabuk açar. Komut dosyası, CPU'ya bağımlı dosyaları bir yerden diğerine kopyalarsa veya diğer genel değişiklikleri yaparsa, yukarıdaki saldırı yararlıdır. 'Setup_tool.sh' CFLAGS vb. Hazırlarsa, farklı bir teknik bilgiye ihtiyacınız vardır. –