makefile 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. .DEFAULT_GOAL := help
  2. PROJECTNAME=$(shell basename "$(PWD)")
  3. SOURCES=$(sort $(wildcard ./src/*.rs ./src/**/*.rs))
  4. OS_NAME=$(shell uname | tr '[:upper:]' '[:lower:]')
  5. PATH := $(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS_NAME)-x86_64/bin:$(PATH)
  6. ANDROID_AARCH64_LINKER=$(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS_NAME)-x86_64/bin/aarch64-linux-android29-clang
  7. ANDROID_ARMV7_LINKER=$(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS_NAME)-x86_64/bin/armv7a-linux-androideabi29-clang
  8. ANDROID_I686_LINKER=$(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS_NAME)-x86_64/bin/i686-linux-android29-clang
  9. ANDROID_X86_64_LINKER=$(ANDROID_NDK_HOME)/toolchains/llvm/prebuilt/$(OS_NAME)-x86_64/bin/x86_64-linux-android29-clang
  10. SHELL := /bin/bash
  11. # ##############################################################################
  12. # # GENERAL
  13. # ##############################################################################
  14. .PHONY: help
  15. help: makefile
  16. @echo
  17. @echo
  18. @echo " Available actions in "$(PROJECTNAME)":"
  19. @echo
  20. @sed -n 's/^##//p' $< | column -t -s ':' | sed -e 's/^/ /'
  21. @echo
  22. @echo " --------------------"
  23. @echo " P.S. Works with Android NDK 22"
  24. @echo
  25. ## init: Install missing dependencies.
  26. .PHONY: init
  27. init:
  28. rustup target add aarch64-apple-ios x86_64-apple-ios
  29. rustup target add aarch64-apple-darwin x86_64-apple-darwin
  30. #rustup target add armv7-apple-ios armv7s-apple-ios i386-apple-ios ## deprecated
  31. rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
  32. @if [ $$(uname) == "Darwin" ] ; then cargo install cargo-lipo ; fi
  33. cargo install cbindgen
  34. ## :
  35. # ##############################################################################
  36. # # RECIPES
  37. # ##############################################################################
  38. ## all: Compile iOS, Android and bindings targets
  39. all: ios macos android bindings
  40. ## ios: Compile the iOS universal library
  41. ios: target/universal/release/libexample.a
  42. target/universal/release/libexample.a: $(SOURCES) ndk-home
  43. @if [ $$(uname) == "Darwin" ] ; then \
  44. cargo lipo --release ; \
  45. else echo "Skipping iOS compilation on $$(uname)" ; \
  46. fi
  47. @echo "[DONE] $@"
  48. ## macos: Compile the macOS libraries
  49. macos: target/x86_64-apple-darwin/release/libexample.dylib target/aarch64-apple-darwin/release/libexample.dylib
  50. target/x86_64-apple-darwin/release/libexample.dylib: $(SOURCES)
  51. @if [ $$(uname) == "Darwin" ] ; then \
  52. cargo lipo --release --targets x86_64-apple-darwin ; \
  53. else echo "Skipping macOS compilation on $$(uname)" ; \
  54. fi
  55. @echo "[DONE] $@"
  56. target/aarch64-apple-darwin/release/libexample.dylib: $(SOURCES)
  57. @if [ $$(uname) == "Darwin" ] ; then \
  58. cargo lipo --release --targets aarch64-apple-darwin ; \
  59. else echo "Skipping macOS compilation on $$(uname)" ; \
  60. fi
  61. @echo "[DONE] $@"
  62. ## android: Compile the android targets (arm64, armv7 and i686)
  63. android: target/aarch64-linux-android/release/libexample.so target/armv7-linux-androideabi/release/libexample.so target/i686-linux-android/release/libexample.so target/x86_64-linux-android/release/libexample.so
  64. target/aarch64-linux-android/release/libexample.so: $(SOURCES) ndk-home
  65. CC_aarch64_linux_android=$(ANDROID_AARCH64_LINKER) \
  66. CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=$(ANDROID_AARCH64_LINKER) \
  67. cargo build --target aarch64-linux-android --release
  68. @echo "[DONE] $@"
  69. target/armv7-linux-androideabi/release/libexample.so: $(SOURCES) ndk-home
  70. CC_armv7_linux_androideabi=$(ANDROID_ARMV7_LINKER) \
  71. CARGO_TARGET_ARMV7_LINUX_ANDROIDEABI_LINKER=$(ANDROID_ARMV7_LINKER) \
  72. cargo build --target armv7-linux-androideabi --release
  73. @echo "[DONE] $@"
  74. target/i686-linux-android/release/libexample.so: $(SOURCES) ndk-home
  75. CC_i686_linux_android=$(ANDROID_I686_LINKER) \
  76. CARGO_TARGET_I686_LINUX_ANDROID_LINKER=$(ANDROID_I686_LINKER) \
  77. cargo build --target i686-linux-android --release
  78. @echo "[DONE] $@"
  79. target/x86_64-linux-android/release/libexample.so: $(SOURCES) ndk-home
  80. CC_x86_64_linux_android=$(ANDROID_X86_64_LINKER) \
  81. CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=$(ANDROID_X86_64_LINKER) \
  82. cargo build --target x86_64-linux-android --release
  83. @echo "[DONE] $@"
  84. .PHONY: ndk-home
  85. ndk-home:
  86. @if [ ! -d "${ANDROID_NDK_HOME}" ] ; then \
  87. echo "Error: Please, set the ANDROID_NDK_HOME env variable to point to your NDK folder" ; \
  88. exit 1 ; \
  89. fi
  90. ## bindings: Generate the .h file for iOS
  91. bindings: target/bindings.h
  92. target/bindings.h: $(SOURCES)
  93. cbindgen . -c cbindgen.toml | grep -v \#include | uniq > $@
  94. @echo "[DONE] $@"
  95. ## :
  96. # ##############################################################################
  97. # # OTHER
  98. # ##############################################################################
  99. ## clean:
  100. .PHONY: clean
  101. clean:
  102. cargo clean
  103. rm -f target/bindings.h target/bindings.src.h
  104. ## test:
  105. .PHONY: test
  106. test:
  107. cargo test