1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

v: support better separation of general Android vs Termux specific code (part 1)

This commit is contained in:
Delyan Angelov 2022-07-01 12:48:31 +03:00
parent ff0f75803d
commit 30401e003f
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
7 changed files with 57 additions and 11 deletions

View File

@ -108,9 +108,11 @@ see also `v help build`.
The compiler is known to also work, and has support for these operating The compiler is known to also work, and has support for these operating
systems also (although we do not test it as regularly as for the above): systems also (although we do not test it as regularly as for the above):
`android`, `ios`, `vinix`,
`ios`,
`android`, `termux`,
`freebsd`, `openbsd`, `netbsd`, `dragonfly`, `freebsd`, `openbsd`, `netbsd`, `dragonfly`,
`solaris`, `serenity`, `haiku`, `vinix`, `solaris`, `serenity`, `haiku`,
`wasm32`, `wasm32-wasi`, `wasm32-emscripten` `wasm32`, `wasm32-wasi`, `wasm32-emscripten`
Note that V has the concept of platform files, i.e. files ending Note that V has the concept of platform files, i.e. files ending

View File

@ -317,6 +317,9 @@ pub fn get_raw_lines_joined() string {
// user_os returns current user operating system name. // user_os returns current user operating system name.
pub fn user_os() string { pub fn user_os() string {
$if linux { $if linux {
if getenv('TERMUX_VERSION') != '' {
return 'termux'
}
return 'linux' return 'linux'
} }
$if macos { $if macos {
@ -340,6 +343,9 @@ pub fn user_os() string {
$if android { $if android {
return 'android' return 'android'
} }
// $if termux {
// return 'termux'
// }
$if solaris { $if solaris {
return 'solaris' return 'solaris'
} }

View File

@ -24,8 +24,8 @@ const (
pub const ( pub const (
valid_comptime_if_os = ['windows', 'ios', 'macos', 'mach', 'darwin', 'hpux', 'gnu', valid_comptime_if_os = ['windows', 'ios', 'macos', 'mach', 'darwin', 'hpux', 'gnu',
'qnx', 'linux', 'freebsd', 'openbsd', 'netbsd', 'bsd', 'dragonfly', 'android', 'solaris', 'qnx', 'linux', 'freebsd', 'openbsd', 'netbsd', 'bsd', 'dragonfly', 'android', 'termux',
'haiku', 'serenity', 'vinix'] 'solaris', 'haiku', 'serenity', 'vinix']
valid_comptime_compression_types = ['none', 'zlib'] valid_comptime_compression_types = ['none', 'zlib']
valid_comptime_if_compilers = ['gcc', 'tinyc', 'clang', 'mingw', 'msvc', 'cplusplus'] valid_comptime_if_compilers = ['gcc', 'tinyc', 'clang', 'mingw', 'msvc', 'cplusplus']
valid_comptime_if_platforms = ['amd64', 'i386', 'aarch64', 'arm64', 'arm32', 'rv64', 'rv32'] valid_comptime_if_platforms = ['amd64', 'i386', 'aarch64', 'arm64', 'arm32', 'rv64', 'rv32']

View File

@ -39,6 +39,7 @@ pub enum Platform {
dragonfly dragonfly
js // for interoperability in prefs.OS js // for interoperability in prefs.OS
android android
termux // like android, but note that termux is running on devices natively, not cross compiling from other platforms
solaris solaris
serenity serenity
vinix vinix
@ -64,6 +65,7 @@ pub fn platform_from_string(platform_str string) ?Platform {
'serenity' { return .serenity } 'serenity' { return .serenity }
'vinix' { return .vinix } 'vinix' { return .vinix }
'android' { return .android } 'android' { return .android }
'termux' { return .termux }
'haiku' { return .haiku } 'haiku' { return .haiku }
'nix' { return .linux } 'nix' { return .linux }
'' { return .auto } '' { return .auto }

View File

@ -636,6 +636,10 @@ fn (mut g Gen) comptime_if_to_ifdef(name string, is_comptime_optional bool) ?str
'android' { 'android' {
return '__ANDROID__' return '__ANDROID__'
} }
'termux' {
// Note: termux is running on Android natively
return '__ANDROID__'
}
'solaris' { 'solaris' {
return '__sun' return '__sun'
} }

View File

@ -3,6 +3,8 @@
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
module pref module pref
import os
pub enum OS { pub enum OS {
_auto // Reserved so .macos cannot be misunderstood as auto _auto // Reserved so .macos cannot be misunderstood as auto
ios ios
@ -17,6 +19,7 @@ pub enum OS {
js_browser js_browser
js_freestanding js_freestanding
android android
termux // like android, but compiling/running natively on the devices
solaris solaris
serenity serenity
vinix vinix
@ -47,6 +50,7 @@ pub fn os_from_string(os_str string) ?OS {
'serenity' { return .serenity } 'serenity' { return .serenity }
'vinix' { return .vinix } 'vinix' { return .vinix }
'android' { return .android } 'android' { return .android }
'termux' { return .termux }
'haiku' { return .haiku } 'haiku' { return .haiku }
'raw' { return .raw } 'raw' { return .raw }
'nix' { return .linux } 'nix' { return .linux }
@ -75,6 +79,7 @@ pub fn (o OS) str() string {
.js_freestanding { return 'JavaScript' } .js_freestanding { return 'JavaScript' }
.js_browser { return 'JavaScript(Browser)' } .js_browser { return 'JavaScript(Browser)' }
.android { return 'Android' } .android { return 'Android' }
.termux { return 'Termux' }
.solaris { return 'Solaris' } .solaris { return 'Solaris' }
.serenity { return 'SerenityOS' } .serenity { return 'SerenityOS' }
.vinix { return 'Vinix' } .vinix { return 'Vinix' }
@ -88,10 +93,13 @@ pub fn (o OS) str() string {
} }
pub fn get_host_os() OS { pub fn get_host_os() OS {
$if android {
return .android
}
$if linux { $if linux {
$if android {
if os.getenv('TERMUX_VERSION') != '' {
return .termux
}
return .android
}
return .linux return .linux
} }
$if ios { $if ios {

View File

@ -121,6 +121,10 @@ fn fname_without_platform_postfix(file string) string {
'_', '_',
'android.c.v', 'android.c.v',
'_', '_',
'termux.c.v',
'_',
'android_outside_termux.c.v',
'_',
'freebsd.c.v', 'freebsd.c.v',
'_', '_',
'openbsd.c.v', 'openbsd.c.v',
@ -178,10 +182,6 @@ pub fn (prefs &Preferences) should_compile_c(file string) bool {
if prefs.os != .ios && (file.ends_with('_ios.c.v') || file.ends_with('_ios.v')) { if prefs.os != .ios && (file.ends_with('_ios.c.v') || file.ends_with('_ios.v')) {
return false return false
} }
//
if prefs.os != .android && file.ends_with('_android.c.v') {
return false
}
if prefs.os != .freebsd && file.ends_with('_freebsd.c.v') { if prefs.os != .freebsd && file.ends_with('_freebsd.c.v') {
return false return false
} }
@ -203,6 +203,30 @@ pub fn (prefs &Preferences) should_compile_c(file string) bool {
if prefs.os != .vinix && file.ends_with('_vinix.c.v') { if prefs.os != .vinix && file.ends_with('_vinix.c.v') {
return false return false
} }
if prefs.os in [.android, .termux] {
// Note: Termux is running natively on Android devices, but the compilers there (clang) usually do not have access
// to the Android SDK. The code here ensures that you can have `_termux.c.v` and `_android_outside_termux.c.v` postfixes,
// to target both the cross compilation case (where the SDK headers are used and available), and the Termux case,
// where the Android SDK is not used.
if file.ends_with('_android.c.v') {
// common case, should compile for both cross android and termux
// eprintln('prefs.os: $prefs.os | file: $file | common')
return true
}
if file.ends_with('_android_outside_termux.c.v') {
// compile code that targets Android, but NOT Termux (i.e. the SDK is available)
// eprintln('prefs.os: $prefs.os | file: $file | android_outside_termux')
return prefs.os == .android
}
if file.ends_with('_termux.c.v') {
// compile Termux specific code
// eprintln('prefs.os: $prefs.os | file: $file | termux specific')
return prefs.os == .termux
}
} else if file.ends_with('_android.c.v') || file.ends_with('_termux.c.v')
|| file.ends_with('_android_outside_termux.c.v') {
return false
}
return true return true
} }