pref: fix cross-compiling graphical apps to Windows (#7449)

pull/7432/head
spaceface 2020-12-21 18:45:12 +01:00 committed by GitHub
parent dc3a6bb169
commit c544cc508b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 34 additions and 14 deletions

View File

@ -153,6 +153,7 @@ jobs:
brew install postgresql
brew install glfw
## brew install sdl2 sdl2_ttf sdl2_mixer sdl2_image
brew install mingw-w64
export LIBRARY_PATH="$LIBRARY_PATH:/usr/local/opt/openssl/lib/"
- name: Build V
run: make -j4 && ./v -cg -cflags -Werror -o v cmd/v
@ -189,7 +190,13 @@ jobs:
run: |
./v doctor
- name: Cross-compilation to Linux
run: ./v -os linux cmd/v
run: |
./v -os linux cmd/v
# TODO: fix this: ./v -os linux examples/2048/2048.v
- name: Cross-compilation to Windows
run: |
./v -os windows cmd/v
./v -os windows examples/2048/2048.v
# - name: Test vsh
# run: ./v examples/v_script.vsh
- name: Test ved
@ -576,6 +583,10 @@ jobs:
./v -os windows examples/hello_world.v
ls -lart examples/hello_world.exe
wine examples/hello_world.exe
- name: 2048.v can be cross compiled to 2048.exe
run: |
./v -os windows examples/2048/2048.v
ls -lart examples/2048/2048.exe
ubuntu-c-plus-plus:
runs-on: ubuntu-18.04

View File

@ -703,6 +703,9 @@ fn (mut v Builder) cc() {
}
fn (mut b Builder) cc_linux_cross() {
b.setup_ccompiler_options(b.pref.ccompiler)
b.build_thirdparty_obj_files()
b.setup_output_name()
parent_dir := os.vmodules_dir()
if !os.exists(parent_dir) {
os.mkdir(parent_dir)
@ -763,6 +766,9 @@ fn (mut b Builder) cc_linux_cross() {
fn (mut c Builder) cc_windows_cross() {
println('Cross compiling for Windows...')
c.setup_ccompiler_options(c.pref.ccompiler)
c.build_thirdparty_obj_files()
c.setup_output_name()
if !c.pref.out_name.ends_with('.exe') {
c.pref.out_name += '.exe'
}
@ -865,12 +871,6 @@ fn (mut v Builder) build_thirdparty_obj_files() {
fn (mut v Builder) build_thirdparty_obj_file(path string, moduleflags []cflag.CFlag) {
obj_path := os.real_path(path)
if v.pref.os == .windows {
// Cross compiling for Windows
$if !windows {
v.pref.ccompiler = mingw_cc
}
}
cfile := '${obj_path[..obj_path.len - 2]}.c'
btarget := moduleflags.c_options_before_target()
atarget := moduleflags.c_options_after_target()

View File

@ -10,13 +10,6 @@ import v.table
import v.token
import vweb.tmpl
// #flag darwin -I.
const (
supported_platforms = ['windows', 'macos', 'darwin', 'linux', 'freebsd', 'openbsd', 'netbsd',
'dragonfly', 'android', 'js', 'solaris', 'haiku', 'linux_or_macos']
supported_ccompilers = ['tinyc', 'clang', 'mingw', 'msvc', 'gcc']
)
// // #include, #flag, #v
fn (mut p Parser) hash() ast.HashStmt {
mut pos := p.prev_tok.position()

View File

@ -68,6 +68,7 @@ pub fn (mut p Preferences) fill_with_defaults() {
if p.ccompiler == '' {
p.ccompiler = default_c_compiler()
}
p.find_cc_if_cross_compiling()
p.ccompiler_type = cc_from_string(p.ccompiler)
p.is_test = p.path.ends_with('_test.v')
p.is_vsh = p.path.ends_with('.vsh')
@ -98,6 +99,21 @@ pub fn (mut p Preferences) fill_with_defaults() {
// p.use_cache = os.user_os() != 'windows'
}
fn (mut p Preferences) find_cc_if_cross_compiling() {
if p.os == .windows {
$if !windows {
// Cross compiling to Windows
p.ccompiler = 'x86_64-w64-mingw32-gcc'
}
}
if p.os == .linux {
$if !linux {
// Cross compiling to Linux
p.ccompiler = 'clang'
}
}
}
fn (mut p Preferences) try_to_use_tcc_by_default() {
if p.ccompiler == 'tcc' {
p.ccompiler = default_tcc_compiler()