michaellukashov / Far-NetBox

SFTP/SCP/FTP/FTPS/WebDAV/S3 client for Far Manager 3 (http://farmanager.com/)
https://forum.farmanager.com/viewtopic.php?t=6317
GNU General Public License v2.0
157 stars 52 forks source link

Правка сборочных скриптов - проблема оказалась в них т.к. там команды EXIT не хватает #224

Open VictorVG opened 7 years ago

VictorVG commented 7 years ago

Меня то же крепко достали сборочные скрипты и я стал смотреть где происходит сбой? Всё оказалось просто до безобразия - при рекрсивном вызове скриптов из-за отсутствия в них команды RETURN (EXIT) получаем старую проблему известную ещё со времён OS/360 - попрограмма отрабатывает свой алгоритм, но возврата в вызывающую программу не происходит и задача переходит в состояние бесконечного ожидания. Особенно чётко это проявляется при последовательных вызовах одной цепочки скриптов с разными параметрами - первый вызов отработает, но один из вложенных скриптов не возвращает управление и обычно происходит прерывание пакетной задачи т.к. она не отвечает.

Повозился, поколдовал с вариантами, но т.к. хотел сделать монолитный пакет, то просто раскрыл сборочные скрипты ./src/NetBox/scripts/ , легонца перекомпоновал подстройку под среду, дописал систему сборки с небольшим изменением - имя выходного архива включает и номер ревизии: _FarNetBox-2.4.2.463_Far3x64.7z или так _FarNetBox-2.4.2.463_Far3x86.7z мне так проще архивы на FTP отслеживать, ну и механизм разброски результата с уборкой мусора. В итоге вот что вышло:

@echo off
@setlocal
@set ROOTDIR=%~dp0
@rem Don't chage %PROJECT_ROOT%!
rem Script adaptive configuration
rem VS2010 block begin, is default. Needed comment for use VS2015
@set VSVER=2010
@set VCVSRS="%VS100COMNTOOLS%..\..\VC\vcvarsall.bat"
@set VCC=VC10
rem VS2010 block end
rem VS2015 block begin. Uncoment if needed
rem @set VSVER=2015
rem @set VCVSRS="%VS140COMNTOOLS%..\..\VC\vcvarsall.bat"
rem @set VCC=VC14
rem VS2015 block end
rem
@set BLDDIR=%ROOTDIR%build
@set PKGDIR=%BLDDIR%\NetBox\Far3
@set PLGDIR=%BLDDIR%\NetBox
@set BIN=Far\Plugins\NetBox
@set PROJECT_KIT=vs%VSVER%
@git.exe pull origin -f
@git checkout far3
@git pull
@rm -fr ./build ./Far3_x64./Far3_x86 > NUL
@set PROJECT_GENERATOR=NMake Makefiles
@set FAR_VERSION=Far3
@set PROJECT_BUILD_TYPE=Release
@set PROJECT_BUIILDDIR=%ROOTDIR%build\%PROJECT_KIT%\%PROJECT_BUILD_TYPE%\x86
@if not exist %PROJECT_BUIILDDIR% ( md %PROJECT_BUIILDDIR% > NUL )
@cd /d %PROJECT_BUIILDDIR%
@call %VCVSRS% x86
@cmake.exe -D PROJECT_ROOT=%ROOTDIR% -D CMAKE_BUILD_TYPE=%PROJECT_BUILD_TYPE% -G "%PROJECT_GENERATOR%" -D FAR_VERSION=Far3 %ROOTDIR%src\NetBox
@nmake
@cd /d ..\..\..\
@set PROJECT_BUIILDDIR=%ROOTDIR%build\%PROJECT_KIT%\%PROJECT_BUILD_TYPE%\x64
@if not exist %PROJECT_BUIILDDIR% ( md %PROJECT_BUIILDDIR% > NUL )
@cd /d %PROJECT_BUIILDDIR%
@call %VCVSRS% x86_amd64
@cmake.exe -D PROJECT_ROOT=%ROOTDIR% -D CMAKE_BUILD_TYPE=%PROJECT_BUILD_TYPE% -G "%PROJECT_GENERATOR%" -D FAR_VERSION=Far3 %ROOTDIR%src\NetBox
@nmake
@endlocal
@cd /d %~dp0
@setlocal
@set PLUGINNAME=NetBox
@set FARVER=Far3
@set BLDDIR=..\..\..\build
@set PKGDIR=%BLDDIR%\%PLUGINNAME%\%FARVER%
@set PLGDIR=%BLDDIR%\%PLUGINNAME%
@set BIN=Far\Plugins\%PLUGINNAME%
@set VSVER=2010
@if not exist ".\build\x64\Far\Plugins\NetBox" (@mkdir "./build/x64/Far/Plugins/NetBox")
@if not exist ".\build\x86\Far\Plugins\NetBox" (@mkdir "./build/x86/Far/Plugins/NetBox")
@if not exist ".\build\NetBox\x64" (@mkdir "./build/NetBox/x64")
@if not exist ".\build\NetBox\x86" (@mkdir "./build/NetBox/x86")
@rm -f ./Far3_x64/Plugins/NetBox/*.lib ./Far3_x64/Plugins/NetBox/*.exp ./Far3_x86/Plugins/NetBox/*.lib ./Far3_x86/Plugins/NetBox/*.exp
@cp -f ./src/NetBox/*.lng ./Far3_x64/Plugins/NetBox
@cp -f ./src/NetBox/*.lng ./Far3_x86/Plugins/NetBox
@cp -f ./*.md ./Far3_x64/Plugins/NetBox
@cp -f ./*.md ./Far3_x86/Plugins/NetBox
@cp -f ./ChangeLog ./Far3_x64/Plugins/NetBox
@cp -f ./ChangeLog ./Far3_x86/Plugins/NetBox
@cp -f ./LICENSE.txt ./Far3_x64/Plugins/NetBox
@cp -f ./LICENSE.txt ./Far3_x86/Plugins/NetBox
@cp -f ./Far3_x64/Plugins/NetBox/* ./build/x64/Far/Plugins/NetBox
@cp -f ./Far3_x86/Plugins/NetBox/* ./build/x86/Far/Plugins/NetBox
@cp -f ./Far3_x86/Plugins/NetBox/* ./build/NetBox/x86
@cp -f ./Far3_x64/Plugins/NetBox/* ./build/NetBox/x64
@cd /d src\NetBox\scripts
@gawk "/PLUGIN_VERSION_TXT/ {print $3}" ../resource.h > version.tmp
@for /F %%i in (version.tmp) do set PLUGINVER=%%i
@gawk "/NETBOX_VERSION_BUILD/ {print $3}" ../plugin_version.hpp > version.tmp
@for /F %%i in (version.tmp) do set PLUGREV=%%i
@rm -f version.tmp
@set PKGNAME=Far%PLUGINNAME%-%PLUGINVER%.%PLUGREV%_%FARVER%
@set RLSDIR=%BLDDIR%\vs%VSVER%\Release
@if not exist %PKGDIR% mkdir %PKGDIR% > NUL
@if exist %PKGDIR%\x64 rmdir /S /Q %PKGDIR%\x64 > NUL
@mkdir %PKGDIR%\x64 > NUL
@if not exist %BLDDIR%\x64\%BIN% mkdir %BLDDIR%\x64\%BIN% > nul
@copy /b /y %PLGDIR%\x64\* %PKGDIR%\x64 > NUL
@copy /b /y %RLSDIR%\x64\%PLUGINNAME%.map %PKGDIR%\x64 > NUL
@copy /b /y %PLGDIR%\x64\* %BLDDIR%\x64\%BIN%> NUL
@copy /b /y %RLSDIR%\x64\%PLUGINNAME%.map %BLDDIR%\x64\%BIN% > NUL
@call "C:\Program Files\7-Zip\7z.exe" a -mx9 -t7z -r %BLDDIR%\%PKGNAME%_x64.7z %PKGDIR%\x64\* > NUL
@if exist %PKGDIR%\x86 rmdir /S /Q %PKGDIR%\x86 > NUL
@mkdir %PKGDIR%\x86 > NUL
@if not exist %BLDDIR%\x86\%BIN% mkdir %BLDDIR%\x86\%BIN% > nul
@copy /b /y %PLGDIR%\x86\* %PKGDIR%\x86 > NUL
@copy /b /y %RLSDIR%\x86\%PLUGINNAME%.map %PKGDIR%\x86 > NUL
@copy /b /y %PLGDIR%\x86\* %BLDDIR%\x86\%BIN%> NUL
@copy /b /y %RLSDIR%\x86\%PLUGINNAME%.map %BLDDIR%\x86\%BIN% > NUL
@call "C:\Program Files\7-Zip\7z.exe" a -mx9 -t7z -r %BLDDIR%\%PKGNAME%_x86.7z %PKGDIR%\x86\* > NUL
@rmdir /S /Q %PKGDIR%
@cd /d ..\..\..\
@rm -fR ./build/NetBox/x64/*.map  ./build/NetBox/x86/*.map > nul
@rm -fR ./build/NetBox/Far3 > nul
@rm -fR ./build/VC10 /build/VC14> nul
@rm -fR ./Build/Release > nul
@rm -fR ./Far3_x64 > nul
@rm -fR ./Far3_x86 > nul
@rm -fR ./build/vs2010 ./build/vs2015 > nul
@exit

несколько громоздко, зато надёжно - клонируем рабочую копию, копируем в её корень скрипт под именем bld.cmd и при обновлении исходников просто говорим cd /d ./Far-Netbox&bld после чего занимаемся другими делами а скрипт сам всё делает.

VictorVG commented 7 years ago

Да, забыл сказать - скрипт частично использует команды UNIX (cp, gawk, rm) - их можно или заменить на вин аналоги (cp и rm) или из того же Msys позвать. У меня они прямиком из UNIX-а зовутся.