tcc_win: fix tests
parent
e8b21b4242
commit
624005bbd0
|
@ -222,7 +222,7 @@ jobs:
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: |
|
||||||
gcc --version
|
gcc --version
|
||||||
.\make.bat -gcc
|
.\make.bat -gcc -skip-path
|
||||||
- name: Test new v.c
|
- name: Test new v.c
|
||||||
run: .\v.exe -o v.c cmd/v && gcc -municode -w v.c
|
run: .\v.exe -o v.c cmd/v && gcc -municode -w v.c
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
@ -256,7 +256,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
echo %VFLAGS%
|
echo %VFLAGS%
|
||||||
echo $VFLAGS
|
echo $VFLAGS
|
||||||
.\make.bat -msvc
|
.\make.bat -msvc -skip-path
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
.\v.exe setup-freetype
|
.\v.exe setup-freetype
|
||||||
|
@ -274,6 +274,44 @@ jobs:
|
||||||
# - name: Test v binaries
|
# - name: Test v binaries
|
||||||
# run: ./v -silent build-vbinaries
|
# run: ./v -silent build-vbinaries
|
||||||
|
|
||||||
|
windows-tcc:
|
||||||
|
runs-on: windows-2019
|
||||||
|
# We are simulating a user with no cc installed.
|
||||||
|
# This way, v's cc detection on Windows is also tested.
|
||||||
|
# env:
|
||||||
|
# VFLAGS: -cc tcc
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
#- uses: actions/setup-node@v1
|
||||||
|
# with:
|
||||||
|
# node-version: 12.x
|
||||||
|
- name: Build
|
||||||
|
# We need to move gcc and msvc, so that V doesn't find a C compiler
|
||||||
|
run: |
|
||||||
|
'for /f "usebackq tokens=*" %i in (`where gcc.exe`) do move /Y "%i" "%i.old"' | cmd
|
||||||
|
'for /f "usebackq tokens=*" %i in (`where vswhere.exe`) do move /Y "%i" "%i.old"' | cmd
|
||||||
|
move "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe" "${env:ProgramFiles(x86)}\Microsoft Visual Studio\Installer\vswhere.exe.old"
|
||||||
|
.\make.bat -skip-path
|
||||||
|
- name: Test new v.c
|
||||||
|
run: .\v.exe -o v.c cmd/v && .\thirdparty\tcc\tcc.exe -w -ladvapi32 -bt10 v.c
|
||||||
|
- name: Install dependencies
|
||||||
|
run: |
|
||||||
|
.\v.exe setup-freetype
|
||||||
|
.\.github\workflows\windows-install-sdl.bat
|
||||||
|
- name: Fixed tests
|
||||||
|
run: |
|
||||||
|
.\v.exe test-fixed
|
||||||
|
# - name: Test
|
||||||
|
# run: |
|
||||||
|
# .\v.exe -silent test-compiler
|
||||||
|
## v.js dosent work on windows
|
||||||
|
#.\v.exe -o hi.js examples/hello_v_js.v
|
||||||
|
#node hi.js
|
||||||
|
# - name: Test v binaries
|
||||||
|
# run: ./v -silent build-vbinaries
|
||||||
|
# - name: v2 self compilation
|
||||||
|
# run: .\v.exe -o v2.exe cmd/v && .\v2.exe -o v3.exe cmd/v
|
||||||
|
|
||||||
docs-line-len-check:
|
docs-line-len-check:
|
||||||
runs-on: ubuntu-18.04
|
runs-on: ubuntu-18.04
|
||||||
steps:
|
steps:
|
||||||
|
|
|
@ -68,5 +68,6 @@ cachegrind.out.*
|
||||||
._*
|
._*
|
||||||
thumbs.db
|
thumbs.db
|
||||||
/.symlink/*
|
/.symlink/*
|
||||||
|
/.bin/*
|
||||||
|
|
||||||
_docs
|
_docs
|
|
@ -2,10 +2,17 @@ import os
|
||||||
import v.pref
|
import v.pref
|
||||||
|
|
||||||
const (
|
const (
|
||||||
hkey_local_machine = voidptr(0x80000002)
|
hkey_current_user = voidptr(0x80000001)
|
||||||
hwnd_broadcast = voidptr(0xffff)
|
hwnd_broadcast = voidptr(0xffff)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
$if windows {
|
||||||
|
$if tinyc {
|
||||||
|
#flag -lAdvapi32
|
||||||
|
#flag -lUser32
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn main(){
|
fn main(){
|
||||||
$if windows {
|
$if windows {
|
||||||
setup_symlink_on_windows()
|
setup_symlink_on_windows()
|
||||||
|
@ -45,16 +52,16 @@ fn setup_symlink_on_windows(){
|
||||||
// make.bat being global, which is NOT what we want.
|
// make.bat being global, which is NOT what we want.
|
||||||
//
|
//
|
||||||
// Instead, we create a small launcher v.bat, in a new local
|
// Instead, we create a small launcher v.bat, in a new local
|
||||||
// folder .symlink/ . That .symlink/ folder can then be put
|
// folder .bin/ . That .bin/ folder can then be put in PATH
|
||||||
// in PATH without poluting it with anything else - just a
|
// without poluting it with anything else - just a `v`
|
||||||
// `v` command will be available, similar to unix.
|
// command will be available, similar to unix.
|
||||||
//
|
//
|
||||||
// Creating a real NTFS symlink to the real executable was also
|
// Creating a real NTFS symlink to the real executable was also
|
||||||
// tried, but then os.real_path( os.executable() ) returns the
|
// tried, but then os.real_path( os.executable() ) returns the
|
||||||
// path to the symlink, unfortunately, unlike on posix systems
|
// path to the symlink, unfortunately, unlike on posix systems
|
||||||
// ¯\_(ツ)_/¯
|
// ¯\_(ツ)_/¯
|
||||||
vdir := os.real_path(os.dir(vexe))
|
vdir := os.real_path(os.dir(vexe))
|
||||||
vsymlinkdir := os.join_path(vdir, '.symlink')
|
vsymlinkdir := os.join_path(vdir, '.bin')
|
||||||
vsymlinkbat := os.join_path(vsymlinkdir, 'v.bat')
|
vsymlinkbat := os.join_path(vsymlinkdir, 'v.bat')
|
||||||
if os.exists(vsymlinkbat) {
|
if os.exists(vsymlinkbat) {
|
||||||
print('Batch script $vsymlinkbat already exists, checking system %PATH%...')
|
print('Batch script $vsymlinkbat already exists, checking system %PATH%...')
|
||||||
|
@ -128,9 +135,9 @@ fn warn_and_exit(err string) {
|
||||||
fn get_reg_sys_env_handle() ?voidptr {
|
fn get_reg_sys_env_handle() ?voidptr {
|
||||||
$if windows {
|
$if windows {
|
||||||
// open the registry key
|
// open the registry key
|
||||||
reg_key_path := 'SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment'
|
reg_key_path := 'Environment'
|
||||||
reg_env_key := voidptr(0) // or HKEY (HANDLE)
|
reg_env_key := voidptr(0) // or HKEY (HANDLE)
|
||||||
if C.RegOpenKeyEx(hkey_local_machine, reg_key_path.to_wide(), 0, 1 | 2, ®_env_key) != 0 {
|
if C.RegOpenKeyEx(hkey_current_user, reg_key_path.to_wide(), 0, 1 | 2, ®_env_key) != 0 {
|
||||||
return error('Could not open "$reg_key_path" in the registry')
|
return error('Could not open "$reg_key_path" in the registry')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +153,7 @@ fn get_reg_value(reg_env_key voidptr, key string) ?string {
|
||||||
reg_value_size := 4095 // this is the max length (not for the registry, but for the system %PATH%)
|
reg_value_size := 4095 // this is the max length (not for the registry, but for the system %PATH%)
|
||||||
mut reg_value := &u16(malloc(reg_value_size))
|
mut reg_value := &u16(malloc(reg_value_size))
|
||||||
if C.RegQueryValueEx(reg_env_key, key.to_wide(), 0, 0, reg_value, ®_value_size) != 0 {
|
if C.RegQueryValueEx(reg_env_key, key.to_wide(), 0, 0, reg_value, ®_value_size) != 0 {
|
||||||
return error('Unable to get registry value for "$key", are you running as an Administrator?')
|
return error('Unable to get registry value for "$key", try rerunning as an Administrator')
|
||||||
}
|
}
|
||||||
|
|
||||||
return string_from_wide(reg_value)
|
return string_from_wide(reg_value)
|
||||||
|
|
164
make.bat
164
make.bat
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
echo Building V
|
echo Building V
|
||||||
|
|
||||||
|
set tcc_path=%~dp0thirdparty\tcc\
|
||||||
pushd %~dp0
|
pushd %~dp0
|
||||||
|
|
||||||
if "%~1"=="-local" goto :compile
|
if "%~1"=="-local" goto :compile
|
||||||
|
@ -18,41 +19,39 @@ if exist "vc" (
|
||||||
)
|
)
|
||||||
|
|
||||||
:compile
|
:compile
|
||||||
REM option to force msvc or gcc
|
REM option to disable adding V to PATH
|
||||||
if "%~1"=="-gcc" goto :gcc_strap
|
if "%~1"=="-skip-path" set skip_path=1
|
||||||
if "%~2"=="-gcc" goto :gcc_strap
|
if "%~2"=="-skip-path" set skip_path=1
|
||||||
if "%~1"=="-msvc" goto :msvc_strap
|
|
||||||
if "%~2"=="-msvc" goto :msvc_strap
|
REM option to force msvc, gcc or tcc
|
||||||
|
if "%~1"=="-gcc" set force_gcc=1 & goto :gcc_strap
|
||||||
|
if "%~2"=="-gcc" set force_gcc=1 & goto :gcc_strap
|
||||||
|
if "%~1"=="-msvc" set force_msvc=1 & goto :msvc_strap
|
||||||
|
if "%~2"=="-msvc" set force_msvc=1 & goto :msvc_strap
|
||||||
|
if "%~1"=="-tcc" set force_tcc=1 & goto :tcc_strap
|
||||||
|
if "%~2"=="-tcc" set force_tcc=1 & goto :tcc_strap
|
||||||
|
|
||||||
:gcc_strap
|
:gcc_strap
|
||||||
|
echo.
|
||||||
echo Attempting to build v.c with GCC...
|
echo Attempting to build v.c with GCC...
|
||||||
|
|
||||||
for /f "usebackq tokens=*" %%i in (`where gcc`) do (
|
where /q gcc
|
||||||
set gcc_path=%%i
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
)
|
echo ^> GCC not found
|
||||||
|
if "%force_gcc%" NEQ "" goto :error
|
||||||
if not exist "%gcc_path%" (
|
|
||||||
goto :msvc_strap
|
goto :msvc_strap
|
||||||
)
|
)
|
||||||
|
|
||||||
gcc -std=c99 -municode -w -o v.exe vc\v_win.c
|
gcc -std=c99 -municode -w -o v.exe vc\v_win.c
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
echo gcc failed to compile - Create an issue at 'https://github.com/vlang'
|
|
||||||
rd /s /q vc
|
|
||||||
goto :error
|
|
||||||
)
|
|
||||||
|
|
||||||
v.exe self
|
v.exe self > NUL
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
echo v.exe failed to compile itself - Create an issue at 'https://github.com/vlang'
|
|
||||||
goto :error
|
|
||||||
)
|
|
||||||
|
|
||||||
del v_old.exe
|
|
||||||
goto :success
|
goto :success
|
||||||
|
|
||||||
:msvc_strap
|
:msvc_strap
|
||||||
echo Attempting to build v.c with MSVC...
|
echo.
|
||||||
|
echo Attempting to build v.c with MSVC...
|
||||||
set VsWhereDir=%ProgramFiles(x86)%
|
set VsWhereDir=%ProgramFiles(x86)%
|
||||||
set HostArch=x64
|
set HostArch=x64
|
||||||
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
|
if "%PROCESSOR_ARCHITECTURE%" == "x86" (
|
||||||
|
@ -60,58 +59,123 @@ if "%PROCESSOR_ARCHITECTURE%" == "x86" (
|
||||||
set VsWhereDir=%ProgramFiles%
|
set VsWhereDir=%ProgramFiles%
|
||||||
set HostArch=x86
|
set HostArch=x86
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if not exist "%VsWhereDir%\Microsoft Visual Studio\Installer\vswhere.exe" (
|
||||||
|
echo ^> MSVC not found
|
||||||
|
if "%force_msvc%" NEQ "" goto :error
|
||||||
|
goto :tcc_strap
|
||||||
|
)
|
||||||
|
|
||||||
for /f "usebackq tokens=*" %%i in (`"%VsWhereDir%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do (
|
for /f "usebackq tokens=*" %%i in (`"%VsWhereDir%\Microsoft Visual Studio\Installer\vswhere.exe" -latest -prerelease -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath`) do (
|
||||||
set InstallDir=%%i
|
set InstallDir=%%i
|
||||||
)
|
)
|
||||||
|
|
||||||
if exist "%InstallDir%\Common7\Tools\vsdevcmd.bat" (
|
if exist "%InstallDir%\Common7\Tools\vsdevcmd.bat" (
|
||||||
call "%InstallDir%\Common7\Tools\vsdevcmd.bat" -arch=%HostArch% -host_arch=%HostArch% -no_logo
|
call "%InstallDir%\Common7\Tools\vsdevcmd.bat" -arch=%HostArch% -host_arch=%HostArch% -no_logo > NUL
|
||||||
) else if exist "%VsWhereDir%\Microsoft Visual Studio 14.0\Common7\Tools\vsdevcmd.bat" (
|
) else if exist "%VsWhereDir%\Microsoft Visual Studio 14.0\Common7\Tools\vsdevcmd.bat" (
|
||||||
call "%VsWhereDir%\Microsoft Visual Studio 14.0\Common7\Tools\vsdevcmd.bat" -arch=%HostArch% -host_arch=%HostArch% -no_logo
|
call "%VsWhereDir%\Microsoft Visual Studio 14.0\Common7\Tools\vsdevcmd.bat" -arch=%HostArch% -host_arch=%HostArch% -no_logo > NUL
|
||||||
) else (
|
|
||||||
goto :no_compiler
|
|
||||||
)
|
)
|
||||||
|
|
||||||
set ObjFile=.v.c.obj
|
set ObjFile=.v.c.obj
|
||||||
|
|
||||||
cl.exe /nologo /w /volatile:ms /Fo%ObjFile% /O2 /MD /D_VBOOTSTRAP vc\v_win.c user32.lib kernel32.lib advapi32.lib shell32.lib /link /NOLOGO /OUT:v.exe /INCREMENTAL:NO
|
cl.exe /nologo /w /volatile:ms /Fo%ObjFile% /O2 /MD /D_VBOOTSTRAP vc\v_win.c user32.lib kernel32.lib advapi32.lib shell32.lib /link /NOLOGO /OUT:v.exe /INCREMENTAL:NO > NUL
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
echo cl.exe failed to build V
|
|
||||||
goto :compile_error
|
|
||||||
)
|
|
||||||
|
|
||||||
v.exe -cc msvc self
|
v.exe -cc msvc self
|
||||||
if %ERRORLEVEL% NEQ 0 (
|
|
||||||
echo V failed to build itself with error %ERRORLEVEL%
|
|
||||||
del %ObjFile%
|
|
||||||
goto :compile_error
|
|
||||||
)
|
|
||||||
|
|
||||||
del v_old.exe
|
|
||||||
del %ObjFile%
|
del %ObjFile%
|
||||||
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
goto :success
|
goto :success
|
||||||
|
|
||||||
:no_compiler
|
:clone_tcc
|
||||||
echo You do not appear to have a GCC installation on your PATH and also do not have an MSVC installation
|
git clone --depth 1 --quiet https://github.com/vlang/tccbin_win %tcc_path%
|
||||||
echo - this means that you cannot bootstrap a V installation at this time...
|
set cloned_tcc=1
|
||||||
|
goto :tcc_strap
|
||||||
|
|
||||||
|
:tcc_strap
|
||||||
echo.
|
echo.
|
||||||
echo Head to 'https://github.com/vlang/v/releases/download/v0.1.10/mingw-w64-install.exe' to download and install GCC
|
echo Attempting to build v.c with TCC...
|
||||||
echo or head to 'https://visualstudio.microsoft.com/downloads/' to download and install MSVC
|
|
||||||
echo (look for the Build Tools if you don't want to install the Visual Studio IDE)
|
where /q tcc
|
||||||
echo.
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
goto :error
|
if exist "%tcc_path%" (
|
||||||
|
set tcc_exe=%tcc_path%tcc.exe
|
||||||
|
) else if "%cloned_tcc%"=="" (
|
||||||
|
echo ^> TCC not found
|
||||||
|
echo ^> Downloading TCC from https://github.com/vlang/tccbin_win
|
||||||
|
goto :clone_tcc
|
||||||
|
) else (
|
||||||
|
echo ^> TCC not found, even after cloning
|
||||||
|
goto :error
|
||||||
|
)
|
||||||
|
) else (
|
||||||
|
for /f "delims=" %%i in ('where tcc') do set tcc_exe=%%i
|
||||||
|
)
|
||||||
|
|
||||||
|
if exist "%tcc_path%" (
|
||||||
|
if "%cloned_tcc%"=="" (
|
||||||
|
echo ^> Updating prebuilt TCC...
|
||||||
|
pushd "%tcc_path%"
|
||||||
|
git pull -q > NUL
|
||||||
|
popd
|
||||||
|
)
|
||||||
|
)
|
||||||
|
call "%tcc_exe%" -std=c99 -municode -lws2_32 -lshell32 -ladvapi32 -bt10 -w -o v.exe vc\v_win.c
|
||||||
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
|
|
||||||
|
REM TODO: delete this when the tcc bootstrapping logic is merged to master
|
||||||
|
v.exe -o vtcc.c cmd\v
|
||||||
|
call "%tcc_exe%" -std=c99 -municode -lws2_32 -lshell32 -ladvapi32 -bt10 -w -o v.exe vtcc.c
|
||||||
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
|
del vtcc.c
|
||||||
|
|
||||||
|
v.exe -cc "%tcc_exe%" self > NUL
|
||||||
|
if %ERRORLEVEL% NEQ 0 goto :compile_error
|
||||||
|
goto :success
|
||||||
|
|
||||||
:compile_error
|
:compile_error
|
||||||
echo Failed to compile - Create an issue at 'https://github.com/vlang' and tag '@emily33901'!
|
echo Failed to compile - Create an issue at 'https://github.com/vlang'
|
||||||
goto :error
|
goto :error
|
||||||
|
|
||||||
:error
|
:error
|
||||||
|
echo.
|
||||||
echo Exiting from error
|
echo Exiting from error
|
||||||
popd
|
popd
|
||||||
exit /b 1
|
exit /b 1
|
||||||
|
|
||||||
:success
|
:success
|
||||||
echo V build OK!
|
echo ^> V built successfully!
|
||||||
|
del v_old.exe
|
||||||
|
|
||||||
|
:path
|
||||||
|
if "%skip_path%" NEQ "" goto :version
|
||||||
|
echo.
|
||||||
|
echo Adding V to PATH...
|
||||||
|
v.exe symlink > NUL
|
||||||
|
if %ERRORLEVEL% NEQ 0 (
|
||||||
|
echo ^> Could not add V to %%PATH%%, try rebuilding as admin.
|
||||||
|
goto :error
|
||||||
|
)
|
||||||
|
echo ^> V added to %%PATH%%
|
||||||
|
|
||||||
|
if "%cloned_tcc%" NEQ "" (
|
||||||
|
echo @echo off> "%~dp0.bin\tcc.bat"
|
||||||
|
echo %tcc_path%tcc %%^*>> "%~dp0.bin\tcc.bat"
|
||||||
|
echo ^> TCC added to %%PATH%%
|
||||||
|
)
|
||||||
|
|
||||||
|
echo ^> Restart your shell/IDE to reload it
|
||||||
|
|
||||||
|
:version
|
||||||
|
echo.
|
||||||
|
echo | set /p="V version: "
|
||||||
v.exe version
|
v.exe version
|
||||||
|
if "%cloned_tcc%" NEQ "" (
|
||||||
|
echo.
|
||||||
|
echo WARNING: No C compiler was detected in your PATH. `tcc` was used temporarily
|
||||||
|
echo to build V, but it may have some bugs and may not work in all cases.
|
||||||
|
echo A more advanced C compiler like GCC or MSVC is recommended.
|
||||||
|
echo https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows
|
||||||
|
echo.
|
||||||
|
)
|
||||||
|
|
||||||
popd
|
popd
|
||||||
|
|
|
@ -7,3 +7,4 @@ SDL2_image/
|
||||||
SDL2_mixer/
|
SDL2_mixer/
|
||||||
SDL2_ttf/
|
SDL2_ttf/
|
||||||
pg/
|
pg/
|
||||||
|
tcc/
|
|
@ -2961,7 +2961,7 @@ _SOKOL_PRIVATE const _sapp_gl_fbconfig* _sapp_gl_choose_fbconfig(const _sapp_gl_
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#include <windowsx.h>
|
#include <windowsx.h>
|
||||||
#include <shellapi.h>
|
#include <shellapi.h>
|
||||||
#pragma comment (lib, "Shell32.lib")
|
#pragma comment (lib, "Shell32")
|
||||||
|
|
||||||
#if defined(SOKOL_D3D11)
|
#if defined(SOKOL_D3D11)
|
||||||
#ifndef D3D11_NO_HELPERS
|
#ifndef D3D11_NO_HELPERS
|
||||||
|
|
|
@ -279,7 +279,7 @@ static INT connect_to_server(TlsContext *tls_ctx, LPWSTR host, INT port_number)
|
||||||
WCHAR service_name[10];
|
WCHAR service_name[10];
|
||||||
int res = wsprintf(service_name, L"%d", port_number);
|
int res = wsprintf(service_name, L"%d", port_number);
|
||||||
|
|
||||||
if(WSAConnectByName(Socket,connect_name, service_name, &local_address_length,
|
if(WSAConnectByNameA(Socket,connect_name, service_name, &local_address_length,
|
||||||
&local_address, &remote_address_length, &remote_address, &tv, NULL) == SOCKET_ERROR) {
|
&local_address, &remote_address_length, &remote_address, &tv, NULL) == SOCKET_ERROR) {
|
||||||
wprintf(L"Error %d connecting to \"%s\" (%s)\n",
|
wprintf(L"Error %d connecting to \"%s\" (%s)\n",
|
||||||
WSAGetLastError(),
|
WSAGetLastError(),
|
||||||
|
|
|
@ -2,6 +2,8 @@ module clipboard
|
||||||
|
|
||||||
import time
|
import time
|
||||||
|
|
||||||
|
#flag -lUser32
|
||||||
|
|
||||||
struct WndClassEx {
|
struct WndClassEx {
|
||||||
cb_size u32
|
cb_size u32
|
||||||
style u32
|
style u32
|
||||||
|
|
|
@ -5,6 +5,12 @@ module math
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
$if windows {
|
||||||
|
$if tinyc {
|
||||||
|
#flag @VROOT/thirdparty/tcc/lib/openlibm.o
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn C.acos(x f64) f64
|
fn C.acos(x f64) f64
|
||||||
fn C.asin(x f64) f64
|
fn C.asin(x f64) f64
|
||||||
fn C.atan(x f64) f64
|
fn C.atan(x f64) f64
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
module http
|
module http
|
||||||
|
|
||||||
#flag windows -I @VROOT/thirdparty/vschannel
|
#flag windows -I @VROOT/thirdparty/vschannel
|
||||||
#flag -l ws2_32 -l crypt32 -l secur32
|
#flag -l ws2_32 -l crypt32 -l secur32 -l user32
|
||||||
|
|
||||||
#include "vschannel.c"
|
#include "vschannel.c"
|
||||||
|
|
||||||
|
|
|
@ -139,9 +139,13 @@ pub fn (mut f File) flush() {
|
||||||
pub fn file_size(path string) int {
|
pub fn file_size(path string) int {
|
||||||
mut s := C.stat{}
|
mut s := C.stat{}
|
||||||
$if windows {
|
$if windows {
|
||||||
C._wstat(path.to_wide(), voidptr(&s))
|
$if tinyc {
|
||||||
|
C.stat(charptr(path.str), voidptr(&s))
|
||||||
|
} $else {
|
||||||
|
C._wstat(path.to_wide(), voidptr(&s))
|
||||||
|
}
|
||||||
} $else {
|
} $else {
|
||||||
C.stat(charptr(path.str), &s)
|
C.stat(charptr(path.str), voidptr(&s))
|
||||||
}
|
}
|
||||||
return s.st_size
|
return s.st_size
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,9 @@ pub fn (mut b Builder) compile_c() {
|
||||||
println('all .v files before:')
|
println('all .v files before:')
|
||||||
// println(files)
|
// println(files)
|
||||||
}
|
}
|
||||||
|
$if windows {
|
||||||
|
b.pref.ccompiler = b.find_win_cc() or { panic(no_compiler_error) }
|
||||||
|
}
|
||||||
// v1 compiler files
|
// v1 compiler files
|
||||||
// v.add_v_files_to_compile()
|
// v.add_v_files_to_compile()
|
||||||
// v.files << v.dir
|
// v.files << v.dir
|
||||||
|
|
|
@ -19,7 +19,21 @@ If you were not working with C interop, please raise an issue on GitHub:
|
||||||
https://github.com/vlang/v/issues/new/choose
|
https://github.com/vlang/v/issues/new/choose
|
||||||
|
|
||||||
You can also use #help on Discord: https://discord.gg/vlang
|
You can also use #help on Discord: https://discord.gg/vlang
|
||||||
')
|
'
|
||||||
|
no_compiler_error = '
|
||||||
|
==================
|
||||||
|
Error: no C compiler detected.
|
||||||
|
|
||||||
|
You can find instructions on how to install one in the V wiki:
|
||||||
|
https://github.com/vlang/v/wiki/Installing-a-C-compiler-on-Windows
|
||||||
|
|
||||||
|
If you think you have one installed, make sure it is in your PATH.
|
||||||
|
If you do have one in your PATH, please raise an issue on GitHub:
|
||||||
|
https://github.com/vlang/v/issues/new/choose
|
||||||
|
|
||||||
|
You can also use #help on Discord: https://discord.gg/vlang
|
||||||
|
'
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
mingw_cc = 'x86_64-w64-mingw32-gcc'
|
mingw_cc = 'x86_64-w64-mingw32-gcc'
|
||||||
|
@ -29,16 +43,30 @@ const (
|
||||||
fn todo() {
|
fn todo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (v &Builder) no_cc_installed() bool {
|
fn (v &Builder) find_win_cc() ?string {
|
||||||
$if windows {
|
$if !windows { return none }
|
||||||
os.exec('$v.pref.ccompiler -v') or {
|
|
||||||
if v.pref.is_verbose {
|
os.exec('$v.pref.ccompiler -v') or {
|
||||||
println('C compiler not found, trying to build with msvc...')
|
if v.pref.is_verbose {
|
||||||
}
|
println('$v.pref.ccompiler not found, looking for msvc...')
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
find_msvc() or {
|
||||||
|
if v.pref.is_verbose {
|
||||||
|
println('msvc not found, looking for thirdparty/tcc...')
|
||||||
|
}
|
||||||
|
vpath := os.dir(os.getenv('VEXE'))
|
||||||
|
thirdparty_tcc := os.join_path(vpath, 'thirdparty', 'tcc', 'tcc.exe')
|
||||||
|
os.exec('$thirdparty_tcc -v') or {
|
||||||
|
if v.pref.is_verbose {
|
||||||
|
println('No C compiler found')
|
||||||
|
}
|
||||||
|
return none
|
||||||
|
}
|
||||||
|
return thirdparty_tcc
|
||||||
|
}
|
||||||
|
return 'msvc'
|
||||||
}
|
}
|
||||||
return false
|
return v.pref.ccompiler
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut v Builder) cc() {
|
fn (mut v Builder) cc() {
|
||||||
|
@ -95,8 +123,9 @@ fn (mut v Builder) cc() {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
mut ccompiler := v.pref.ccompiler
|
||||||
$if windows {
|
$if windows {
|
||||||
if v.pref.ccompiler == 'msvc' || v.no_cc_installed() {
|
if ccompiler == 'msvc' {
|
||||||
v.cc_msvc()
|
v.cc_msvc()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -191,9 +220,9 @@ fn (mut v Builder) cc() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
is_cc_clang := v.pref.ccompiler.contains('clang') || guessed_compiler == 'clang'
|
is_cc_tcc := ccompiler.contains('tcc') || guessed_compiler == 'tcc'
|
||||||
is_cc_tcc := v.pref.ccompiler.contains('tcc') || guessed_compiler == 'tcc'
|
is_cc_clang := !is_cc_tcc && (ccompiler.contains('clang') || guessed_compiler == 'clang')
|
||||||
is_cc_gcc := v.pref.ccompiler.contains('gcc') || guessed_compiler == 'gcc'
|
is_cc_gcc := !is_cc_tcc && !is_cc_clang && (ccompiler.contains('gcc') || guessed_compiler == 'gcc')
|
||||||
// is_cc_msvc := v.pref.ccompiler.contains('msvc') || guessed_compiler == 'msvc'
|
// is_cc_msvc := v.pref.ccompiler.contains('msvc') || guessed_compiler == 'msvc'
|
||||||
//
|
//
|
||||||
if is_cc_clang {
|
if is_cc_clang {
|
||||||
|
@ -227,7 +256,7 @@ fn (mut v Builder) cc() {
|
||||||
if debug_mode && os.user_os() != 'windows' {
|
if debug_mode && os.user_os() != 'windows' {
|
||||||
linker_flags << ' -rdynamic ' // needed for nicer symbolic backtraces
|
linker_flags << ' -rdynamic ' // needed for nicer symbolic backtraces
|
||||||
}
|
}
|
||||||
if v.pref.ccompiler != 'msvc' && v.pref.os != .freebsd {
|
if ccompiler != 'msvc' && v.pref.os != .freebsd {
|
||||||
a << '-Werror=implicit-function-declaration'
|
a << '-Werror=implicit-function-declaration'
|
||||||
}
|
}
|
||||||
if v.pref.is_liveshared || v.pref.is_livemain {
|
if v.pref.is_liveshared || v.pref.is_livemain {
|
||||||
|
@ -365,7 +394,7 @@ fn (mut v Builder) cc() {
|
||||||
start:
|
start:
|
||||||
todo()
|
todo()
|
||||||
// TODO remove
|
// TODO remove
|
||||||
cmd := '${v.pref.ccompiler} $args'
|
cmd := '${ccompiler} $args'
|
||||||
// Run
|
// Run
|
||||||
if v.pref.is_verbose || v.pref.show_cc {
|
if v.pref.is_verbose || v.pref.show_cc {
|
||||||
println('\n==========')
|
println('\n==========')
|
||||||
|
@ -391,7 +420,7 @@ fn (mut v Builder) cc() {
|
||||||
if res.exit_code == 127 {
|
if res.exit_code == 127 {
|
||||||
$if linux {
|
$if linux {
|
||||||
// TCC problems on linux? Try GCC.
|
// TCC problems on linux? Try GCC.
|
||||||
if v.pref.ccompiler.contains('tcc') {
|
if ccompiler.contains('tcc') {
|
||||||
v.pref.ccompiler = 'cc'
|
v.pref.ccompiler = 'cc'
|
||||||
goto start
|
goto start
|
||||||
}
|
}
|
||||||
|
@ -424,7 +453,7 @@ fn (mut v Builder) cc() {
|
||||||
diff := time.ticks() - ticks
|
diff := time.ticks() - ticks
|
||||||
// Print the C command
|
// Print the C command
|
||||||
if v.pref.is_verbose {
|
if v.pref.is_verbose {
|
||||||
println('${v.pref.ccompiler} took $diff ms')
|
println('${ccompiler} took $diff ms')
|
||||||
println('=========\n')
|
println('=========\n')
|
||||||
}
|
}
|
||||||
// Link it if we are cross compiling and need an executable
|
// Link it if we are cross compiling and need an executable
|
||||||
|
@ -624,7 +653,7 @@ fn (c &Builder) build_thirdparty_obj_files() {
|
||||||
for flag in c.get_os_cflags() {
|
for flag in c.get_os_cflags() {
|
||||||
if flag.value.ends_with('.o') {
|
if flag.value.ends_with('.o') {
|
||||||
rest_of_module_flags := c.get_rest_of_module_cflags(flag)
|
rest_of_module_flags := c.get_rest_of_module_cflags(flag)
|
||||||
if c.pref.ccompiler == 'msvc' || c.no_cc_installed() {
|
if c.pref.ccompiler == 'msvc' {
|
||||||
build_thirdparty_obj_file_with_msvc(flag.value, rest_of_module_flags)
|
build_thirdparty_obj_file_with_msvc(flag.value, rest_of_module_flags)
|
||||||
} else {
|
} else {
|
||||||
c.build_thirdparty_obj_file(flag.value, rest_of_module_flags)
|
c.build_thirdparty_obj_file(flag.value, rest_of_module_flags)
|
||||||
|
@ -661,7 +690,7 @@ fn (mut v Builder) build_thirdparty_obj_file(path string, moduleflags []cflag.CF
|
||||||
btarget := moduleflags.c_options_before_target()
|
btarget := moduleflags.c_options_before_target()
|
||||||
atarget := moduleflags.c_options_after_target()
|
atarget := moduleflags.c_options_after_target()
|
||||||
cppoptions := if v.pref.ccompiler.contains('++') { ' -fpermissive -w ' } else { '' }
|
cppoptions := if v.pref.ccompiler.contains('++') { ' -fpermissive -w ' } else { '' }
|
||||||
cmd := '$v.pref.ccompiler $cppoptions $v.pref.third_party_option $btarget -c -o "$obj_path" $cfiles $atarget '
|
cmd := '$v.pref.ccompiler $cppoptions $v.pref.third_party_option $btarget -c -o "$obj_path" $cfiles $atarget'
|
||||||
res := os.exec(cmd) or {
|
res := os.exec(cmd) or {
|
||||||
println('failed thirdparty object build cmd: $cmd')
|
println('failed thirdparty object build cmd: $cmd')
|
||||||
verror(err)
|
verror(err)
|
||||||
|
|
|
@ -226,7 +226,7 @@ static inline bool _us64_ne(uint64_t a, int64_t b) { return a > INT64_MAX || (in
|
||||||
static inline bool _us64_le(uint64_t a, int64_t b) { return a <= INT64_MAX && (int64_t)a <= b; }
|
static inline bool _us64_le(uint64_t a, int64_t b) { return a <= INT64_MAX && (int64_t)a <= b; }
|
||||||
static inline bool _us64_lt(uint64_t a, int64_t b) { return a < INT64_MAX && (int64_t)a < b; }
|
static inline bool _us64_lt(uint64_t a, int64_t b) { return a < INT64_MAX && (int64_t)a < b; }
|
||||||
|
|
||||||
#if defined(__MINGW32__) || defined(__MINGW64__)
|
#if defined(__MINGW32__) || defined(__MINGW64__) || (defined(_WIN32) && defined(__TINYC__))
|
||||||
#undef PRId64
|
#undef PRId64
|
||||||
#undef PRIi64
|
#undef PRIi64
|
||||||
#undef PRIo64
|
#undef PRIo64
|
||||||
|
|
Loading…
Reference in New Issue