From ee1edab2a9e0ed816d06b769b2bd753cbf286bc9 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Sun, 1 Dec 2019 15:12:51 +0200 Subject: [PATCH] implement 'v build-vbinaries' tooling --- .github/workflows/alpine.test.sh | 2 + .github/workflows/ci.yml | 36 +++++++++++------ .gitignore | 15 +++---- tools/modules/testing/common.v | 67 ++++++++++++++++++++++++++++---- tools/vbuild-vbinaries.v | 9 +++++ tools/vtest-compiler.v | 25 ++++++------ v.v | 2 +- 7 files changed, 115 insertions(+), 41 deletions(-) create mode 100644 tools/vbuild-vbinaries.v diff --git a/.github/workflows/alpine.test.sh b/.github/workflows/alpine.test.sh index 784a849aa1..781d65880e 100755 --- a/.github/workflows/alpine.test.sh +++ b/.github/workflows/alpine.test.sh @@ -12,4 +12,6 @@ ls -lat ./v test-compiler +./v build-vbinaries + echo "DONE" diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0ffda1dee8..cd6f951052 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -37,6 +37,8 @@ jobs: run: ./v -o v2 v.v && ./v2 -o v3 v.v - name: Test v->c run: ./v test-compiler + - name: Test v binaries + run: ./v build-vbinaries # - name: Test v->js # run: ./v -o hi.js examples/hello_v_js.v && node hi.js - name: Test symlink @@ -59,6 +61,8 @@ jobs: run: make && ./v -cc gcc -o v v.v - name: Test V run: ./v test-compiler + - name: Test v binaries + run: ./v build-vbinaries # - name: Test v->js # run: ./v -o hi.js examples/hello_v_js.v && node hi.js - name: Build Vorum @@ -97,23 +101,27 @@ jobs: ubuntu-tcc: runs-on: ubuntu-18.04 + env: + VFLAGS: -cc tcc steps: - uses: actions/checkout@v1 - name: Install dependencies run: sudo apt-get update; sudo apt-get install --quiet -y libglfw3 libglfw3-dev libfreetype6-dev libssl-dev sqlite3 libsqlite3-dev - name: Build v - run: make && ./v -o v v.v - - name: Test v->c with tcc - env: - VFLAGS: -cc tcc + run: echo $VFLAGS && make && ./v -o v v.v + - name: Test v->c run: | sudo ln -s /var/tmp/tcc/bin/tcc /usr/local/bin/tcc tcc -version ./v -o v2 v.v # Make sure vtcc can build itself ./v test-compiler + - name: Test v binaries + run: ./v build-vbinaries ubuntu-musl: runs-on: ubuntu-18.04 + env: + VFLAGS: -cc musl-gcc steps: - uses: actions/checkout@v1 - uses: actions/setup-node@v1 @@ -122,14 +130,16 @@ jobs: - name: Install dependencies run: sudo apt-get update; sudo apt-get install --quiet -y musl musl-tools - name: Build v - run: make && ./v -cc musl-gcc -o v v.v -# - name: Test v->c -# run: ./v test-compiler + run: echo $VFLAGS && make && ./v -o v v.v + - name: Test v binaries + run: ./v build-vbinaries # - name: Test v->js # run: ./v -o hi.js examples/hello_v_js.v && node hi.js windows-gcc: runs-on: windows-2019 + env: + VFLAGS: -cc gcc steps: - uses: actions/checkout@v1 #- uses: actions/setup-node@v1 @@ -146,26 +156,30 @@ jobs: ## 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 build-vbinaries windows-msvc: runs-on: windows-2019 + env: + VFLAGS: -cc msvc steps: - uses: actions/checkout@v1 #- uses: actions/setup-node@v1 # with: # node-version: 12.x - name: Build - env: - VFLAGS: -cc msvc run: | + echo %VFLAGS% + echo $VFLAGS git clone --depth=1 https://github.com/ubawurinna/freetype-windows-binaries.git thirdparty/freetype/ .\make.bat -msvc - name: Test - env: - VFLAGS: -cc msvc run: | .\v.exe 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 build-vbinaries diff --git a/.gitignore b/.gitignore index c47b41c540..28ed09ae0e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,25 +6,22 @@ fns.txt /v.c /v.*.c /v.c.out -/v.exe /tools/performance_compare /tools/performance_compare.exe /tools/vrepl -/tools/vrepl.exe /tools/vtest -/tools/vtest.exe /tools/vtest-compiler -/tools/vtest-compiler.exe /tools/vup -/tools/vup.exe /tools/vpm -/tools/vpm.exe /tools/vcreate -/tools/vcreate.exe /tools/vbuild-examples -/tools/vbuild-examples.exe /tools/vbuild-tools -/tools/vbuild-tools.exe +/tools/vbuild-vbinaries +/v_g +/v_cg +/v_prod +/v_prod_cg +/v_prod_g *.exe *.o .*.c diff --git a/tools/modules/testing/common.v b/tools/modules/testing/common.v index 64b5077078..8a5254dfe3 100644 --- a/tools/modules/testing/common.v +++ b/tools/modules/testing/common.v @@ -62,7 +62,7 @@ pub fn (ts mut TestSession) test() { ts.benchmark.step() if show_stats { - println('-------------------------------------------------') + eprintln('-------------------------------------------------') status := os.system(cmd) if status == 0 { ts.benchmark.ok() @@ -75,16 +75,16 @@ pub fn (ts mut TestSession) test() { r := os.exec(cmd) or { ts.benchmark.fail() ts.failed = true - println(ts.benchmark.step_message('$relative_file ${ts.fail}')) + eprintln(ts.benchmark.step_message('$relative_file ${ts.fail}')) continue } if r.exit_code != 0 { ts.benchmark.fail() ts.failed = true - println(ts.benchmark.step_message('$relative_file ${ts.fail}\n`$file`\n (\n$r.output\n)')) + eprintln(ts.benchmark.step_message('$relative_file ${ts.fail}\n`$file`\n (\n$r.output\n)')) } else { ts.benchmark.ok() - println(ts.benchmark.step_message('$relative_file ${ts.ok}')) + eprintln(ts.benchmark.step_message('$relative_file ${ts.ok}')) } } os.rm( tmpc_filepath ) @@ -95,7 +95,7 @@ pub fn (ts mut TestSession) test() { pub fn vlib_should_be_present( parent_dir string ) { vlib_dir := filepath.join( parent_dir, 'vlib' ) if !os.dir_exists( vlib_dir ){ - println('$vlib_dir is missing, it must be next to the V executable') + eprintln('$vlib_dir is missing, it must be next to the V executable') exit(1) } } @@ -107,7 +107,7 @@ pub fn v_build_failing(vargs string, folder string) bool { parent_dir := os.dir(vexe) vlib_should_be_present( parent_dir ) - println(main_label) + eprintln(main_label) mut session := new_test_sesion( vargs ) files := os.walk_ext(filepath.join(parent_dir, folder),'.v') mains := files.filter(!it.contains('modules')) @@ -120,7 +120,60 @@ pub fn v_build_failing(vargs string, folder string) bool { } session.files << rebuildable_mains session.test() - println( session.benchmark.total_message( finish_label ) ) + eprintln( session.benchmark.total_message( finish_label ) ) return session.failed } + +pub fn build_v_cmd_failed (cmd string) bool { + res := os.exec(cmd) or { + return true + } + if res.exit_code != 0 { + eprintln('') + eprintln( res.output ) + return true + } + return false +} + +pub fn building_any_v_binaries_failed() bool { + eprintln('Building V binaries...') + eprintln('VFLAGS is: "' + os.getenv('VFLAGS') + '"') + vexe := testing.vexe_path() + parent_dir := os.dir(vexe) + testing.vlib_should_be_present( parent_dir ) + os.chdir( parent_dir ) + + mut failed := false + v_build_commands := [ + + // '$vexe -o v_g -g v.v', + // '$vexe -o v_prod_g -prod -g v.v', + + '$vexe -o v_cg -cg v.v', + '$vexe -o v_prod_cg -prod -cg v.v', + + '$vexe -o v_prod -prod v.v', + ] + + mut bmark := benchmark.new_benchmark() + bok := term.ok_message('OK') + bfail := term.fail_message('FAIL') + for cmd in v_build_commands { + bmark.step() + if build_v_cmd_failed(cmd) { + bmark.fail() + failed = true + eprintln(bmark.step_message('$cmd => ${bfail} . See details above ^^^^^^^')) + eprintln('') + continue + } + bmark.ok() + eprintln(bmark.step_message('$cmd => ${bok}')) + } + bmark.stop() + eprintln( bmark.total_message( 'building v binaries' ) ) + + return failed +} diff --git a/tools/vbuild-vbinaries.v b/tools/vbuild-vbinaries.v new file mode 100644 index 0000000000..a4d959e0f4 --- /dev/null +++ b/tools/vbuild-vbinaries.v @@ -0,0 +1,9 @@ +module main + +import testing + +fn main() { + if testing.building_any_v_binaries_failed() { + exit(1) + } +} diff --git a/tools/vtest-compiler.v b/tools/vtest-compiler.v index 1c34ef8811..67d697a448 100644 --- a/tools/vtest-compiler.v +++ b/tools/vtest-compiler.v @@ -27,7 +27,7 @@ fn v_test_compiler(vargs string){ /* if !os.file_exists(parent_dir + '/v.v') { - println('v.v is missing, it must be next to the V executable') + eprintln('v.v is missing, it must be next to the V executable') exit(1) } */ @@ -37,38 +37,37 @@ fn v_test_compiler(vargs string){ if os.file_exists('/v.v') { os.system('$vexe -o v.c v.v') if os.system('cc -Werror v.c') != 0 { - println('cc failed to build v.c without warnings') + eprintln('cc failed to build v.c without warnings') exit(1) } - println('v.c can be compiled without warnings. This is good :)') + eprintln('v.c can be compiled without warnings. This is good :)') } } building_tools_failed := testing.v_build_failing(vargs, 'tools') - println('\nTesting all _test.v files...') + eprintln('\nTesting all _test.v files...') mut compiler_test_session := testing.new_test_sesion( vargs ) compiler_test_session.files << os.walk_ext(parent_dir, '_test.v') compiler_test_session.test() - println( compiler_test_session.benchmark.total_message('running V tests') ) + eprintln( compiler_test_session.benchmark.total_message('running V tests') ) - println('') + eprintln('') building_examples_failed := testing.v_build_failing(vargs, 'examples') - + + eprintln('') v_module_install_cmd := '$vexe install nedpals.args' - println('\nInstalling a v module with: $v_module_install_cmd ') + eprintln('\nInstalling a v module with: $v_module_install_cmd ') mut vmark := benchmark.new_benchmark() ret := os.system(v_module_install_cmd) if ret != 0 { - println('failed to run v install') - exit(1) + eprintln('failed to run v install') } if !os.file_exists(v_modules_path + '/nedpals/args') { - println('v failed to install a test module') - exit(1) + eprintln('v failed to install a test module') } vmark.stop() - println( 'Installing a v module took: ' + vmark.total_duration().str() + 'ms') + eprintln( 'Installing a v module took: ' + vmark.total_duration().str() + 'ms') if building_tools_failed || compiler_test_session.failed || building_examples_failed { exit(1) diff --git a/v.v b/v.v index 33b7a1fbe6..1d62e2c4de 100755 --- a/v.v +++ b/v.v @@ -25,7 +25,7 @@ fn main() { stuff_after_executable := os.args[1..] commands := stuff_after_executable.filter(!it.starts_with('-')) - simple_tools := ['up', 'create', 'test', 'test-compiler', 'build-tools', 'build-examples'] + simple_tools := ['up', 'create', 'test', 'test-compiler', 'build-tools', 'build-examples', 'build-vbinaries'] for tool in simple_tools { if tool in commands { compiler.launch_tool('v$tool')