Skip to content

Commit 615f007

Browse files
committed
android: detect NDK path from environmental variable, starting to fix Swift default linker flags, attempt at copying libicu libraries automatically (doesn't work)
1 parent 65921fc commit 615f007

File tree

6 files changed

+58
-7
lines changed

6 files changed

+58
-7
lines changed

CMakeLists.txt

+5-2
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ set(SWIFT_NATIVE_CLANG_TOOLS_PATH "" CACHE STRING
117117
set(SWIFT_NATIVE_SWIFT_TOOLS_PATH "" CACHE STRING
118118
"Path to the directory that contains Swift tools that are executable on the build machine")
119119

120-
set(SWIFT_ANDROID_NDK_PATH "/home/zhuowei/ndk" CACHE STRING
120+
set(SWIFT_ANDROID_NDK_PATH "$ENV{ANDROID_NDK_HOME}" CACHE STRING
121121
"Path to the directory that contains the Android NDK tools that are executable on the build machine")
122122
# The following only works with the Ninja generator in CMake >= 3.0.
123123
set(SWIFT_PARALLEL_COMPILE_JOBS "" CACHE STRING
@@ -431,8 +431,11 @@ if("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux")
431431

432432
is_sdk_requested(ANDROID swift_build_android)
433433
if(swift_build_android AND ${swift_can_crosscompile_stdlib})
434+
if("${SWIFT_ANDROID_NDK_PATH}" STREQUAL "")
435+
message(FATAL_ERROR "environmental variable ANDROID_NDK_HOME not set")
436+
endif()
434437
configure_sdk_unix(ANDROID "Android" "android" "android" "armv7" "armv7-none-linux-androideabi")
435-
set(SWIFT_SDK_ANDROID_PATH "/home/zhuowei/ndk/platforms/android-16/arch-arm")
438+
set(SWIFT_SDK_ANDROID_PATH "${SWIFT_ANDROID_NDK_PATH}/platforms/android-16/arch-arm")
436439

437440
set(SWIFT_PRIMARY_VARIANT_SDK_default "ANDROID")
438441
set(SWIFT_PRIMARY_VARIANT_ARCH_default "armv7")

cmake/modules/AddSwift.cmake

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ function(_add_variant_link_flags
169169
"-ldl"
170170
"-L${SWIFT_ANDROID_NDK_PATH}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/lib/gcc/arm-linux-androideabi/4.8"
171171
"${SWIFT_ANDROID_NDK_PATH}/sources/cxx-stl/llvm-libc++/libs/armeabi-v7a/libc++_shared.so"
172-
"-L/home/zhuowei/libiconv-libicu-android/armeabi-v7a")
172+
"-L${CMAKE_SOURCE_DIR}/../libiconv-libicu-android/armeabi-v7a")
173173
else()
174174
list(APPEND result "-lobjc")
175175
endif()

cmake/modules/FindICU.cmake

+2-2
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ foreach(MODULE ${ICU_FIND_COMPONENTS})
2727
endif()
2828
endforeach()
2929
message("FIXME Android: ICU")
30-
set(ICU_I18N_INCLUDE_DIR "/home/zhuowei/icu/source/i18n")
31-
set(ICU_UC_INCLUDE_DIR "/home/zhuowei/icu/source/common")
30+
set(ICU_I18N_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../icu/source/i18n")
31+
set(ICU_UC_INCLUDE_DIR "${CMAKE_SOURCE_DIR}/../icu/source/common")
3232

3333
find_package_handle_standard_args(ICU DEFAULT_MSG ${ICU_REQUIRED})
3434
mark_as_advanced(${ICU_REQUIRED})

lib/Driver/Driver.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -1075,6 +1075,16 @@ void Driver::buildOutputInfo(const ToolChain &TC, const DerivedArgList &Args,
10751075
});
10761076
}
10771077
}
1078+
} else if (TC.getTriple().isAndroid()) {
1079+
const char* ndkhome = getenv("ANDROID_NDK_HOME");
1080+
if (!ndkhome) {
1081+
llvm::errs() <<
1082+
"ANDROID_NDK_HOME environmental variable not set; "
1083+
"won't be able to build Android programs. Please "
1084+
"set it to the path of the NDK\n";
1085+
} else {
1086+
OI.SDKPath = std::string(ndkhome) + "/platforms/android-16/arch-arm";
1087+
}
10781088
}
10791089

10801090
if (!OI.SDKPath.empty()) {

lib/Driver/ToolChains.cpp

+27-1
Original file line numberDiff line numberDiff line change
@@ -1010,6 +1010,31 @@ toolchains::Linux::constructInvocation(const LinkJobAction &job,
10101010
Arguments.push_back(context.Args.MakeArgString(LibProfile));
10111011
}
10121012

1013+
if (getTriple().isAndroid()) {
1014+
// FIXME: Android: hard-coded paths to arm; needs to fix for arm64, x86
1015+
Arguments.push_back("-target");
1016+
Arguments.push_back("armv7-none-linux-androideabi");
1017+
//Arguments.push_back(context.Args.MakeArgString(getTriple().str()));
1018+
1019+
const char* ndkhome = getenv("ANDROID_NDK_HOME");
1020+
assert(ndkhome && "ANDROID_NDK_HOME needs to be set to NDK "
1021+
"install directory for linking");
1022+
1023+
auto libgccpath = Twine(ndkhome) + "/toolchains/"
1024+
"arm-linux-androideabi-4.8/prebuilt/linux-x86_64/"
1025+
"lib/gcc/arm-linux-androideabi/4.8";
1026+
Arguments.push_back("-L");
1027+
Arguments.push_back(context.Args.MakeArgString(libgccpath));
1028+
1029+
auto libcxxpath = Twine(ndkhome) + "/sources/"
1030+
"cxx-stl/llvm-libc++/libs/armeabi-v7a";
1031+
Arguments.push_back("-L");
1032+
Arguments.push_back(context.Args.MakeArgString(libcxxpath));
1033+
1034+
Arguments.push_back("-lgcc");
1035+
Arguments.push_back("-lc");
1036+
}
1037+
10131038
// FIXME: We probably shouldn't be adding an rpath here unless we know ahead
10141039
// of time the standard library won't be copied.
10151040
Arguments.push_back("-Xlinker");
@@ -1032,7 +1057,8 @@ toolchains::Linux::constructInvocation(const LinkJobAction &job,
10321057
Arguments.push_back("-Xlinker");
10331058
Arguments.push_back("-T");
10341059
Arguments.push_back(
1035-
context.Args.MakeArgString(Twine(RuntimeLibPath) + "/x86_64/swift.ld"));
1060+
context.Args.MakeArgString(Twine(RuntimeLibPath) + "/" +
1061+
getTriple().getArchName() + "/swift.ld"));
10361062

10371063
// This should be the last option, for convenience in checking output.
10381064
Arguments.push_back("-o");

stdlib/public/Bionic/CMakeLists.txt

+13-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ foreach(input ${sources})
1414
# "${output_dir}/${input}")
1515
list(APPEND commands
1616
COMMAND
17-
"sed" "-e" "s@SYSROOT@/home/zhuowei/ndk/platforms/android-16/arch-arm@g"
17+
"sed" "-e" "s@SYSROOT@${SWIFT_ANDROID_NDK_PATH}/platforms/android-16/arch-arm@g"
1818
"${CMAKE_CURRENT_SOURCE_DIR}/${input}"
1919
">"
2020
"${output_dir}/${input}")
@@ -39,3 +39,15 @@ add_swift_library(swiftGlibc IS_SDK_OVERLAY
3939
TARGET_SDKS ANDROID
4040
INSTALL_IN_COMPONENT stdlib-experimental)
4141

42+
# FIXME: Android: find where this belongs
43+
set(iculibs
44+
"${CMAKE_SOURCE_DIR}/../libiconv-libicu-android/armeabi-v7a/libicudata.so"
45+
"${CMAKE_SOURCE_DIR}/../libiconv-libicu-android/armeabi-v7a/libicuuc.so"
46+
"${CMAKE_SOURCE_DIR}/../libiconv-libicu-android/armeabi-v7a/libicui18n.so"
47+
)
48+
49+
# TODO: Android: copy this during build as well
50+
51+
swift_install_in_component(stdlib
52+
FILES ${iculibs}
53+
DESTINATION "lib/swift/android/armv7")

0 commit comments

Comments
 (0)