Подлая засада с .BAT файлами

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Подлая засада с .BAT файлами

Сообщение Cheb » 30.07.2018 09:10:09

Цитирую из своей другой темы:

Выглядит это так: из лазаруса вызывается build.bat, в котором стоит последовательность

[...]

Всё оказалось *гораздо* интереснее!
Обновил лазарус с 1.4.4 до 1.8.4, коий зело многословнее - выяснилось, что у него встроенный интерпретатор .BAT файлов, причём - неполноценный! Он парсит батник при запуске, вычисляя переменные окружения и вштыривая их напрямую.
И получалось, что переменная окружения, которая задавалась ниже по течению, внутри блока if, тупо не работала! :evil:
И екзешник собирался с неправильными ключами.
Может, из-за этого были все мои проблемы с фпц 3?

Перенёс все определения в самое начало - сразу всё заработало!


ИЧСХ, для линукса существует аналогичный build.sh - и в нём-то всё работает как надо

Подробнее: в свойствах проекта на вкладке Compiler Commands, поле "Compiler->Command" очищено и галки убраны, а в поле "Execute after->Command" стоит
./build.bat
и галки выставлены
И в такой конфигурации проект лет десять уже.
ЧСХ, в лазаре ранних версий (0.9.что-то-там) всё работало - он, похоже, через винду батники исполнял. Зачем в новых версиях запилили свой интерпретатор с преферансом и блудницами - то тайна великая есть.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подлая засада с .BAT файлами

Сообщение Alex2013 » 31.07.2018 11:34:36

В порядке мозгового штурма :
Возможно я не вник в вопрос... Но что мешает просто запустить батник через вызов СMD /C ./build.bat ? :idea:
Alex2013
долгожитель
 
Сообщения: 2923
Зарегистрирован: 03.04.2013 11:59:44

Re: Подлая засада с .BAT файлами

Сообщение serbod » 01.08.2018 10:56:18

Есть предположение, что встроенный интерпретатор батников сделан для кроссплатформенноcти, когда проект, начатый на Windows переносят на Linux или Darwin. На мой взгляд, не самое удачное решение, но и не самое плохое.
Аватара пользователя
serbod
постоялец
 
Сообщения: 449
Зарегистрирован: 16.09.2016 11:03:02
Откуда: Минск

Re: Подлая засада с .BAT файлами

Сообщение Cheb » 01.08.2018 20:03:53

Что мешает? Да ничего, собственно. Просто строку исходника по сообщению об ошибке сам тогда ищешь. Вручную этот исходник открывая.
Думаете, я почему вообще лазарусом пользуюсь, хотя движок у меня полностью лазарусонезависимый?
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подлая засада с .BAT файлами

Сообщение Cheb » 15.08.2018 13:59:07

что мешает просто запустить батник через вызов СMD /C ./build.bat ?

Добрался проверить.
Код: Выделить всё
Project: Executing command after: Exit code 1, Errors: 1
Debug: "." ? ???? ???७? ? ?譥?
Debug: ??, ?ᯮ?塞? ?ணࠬ? ? ??? 䠩?.
Panic: tool stopped with exit code 1. Use context menu to get more information.
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подлая засада с .BAT файлами

Сообщение скалогрыз » 16.08.2018 05:45:30

то что ты видишь намекает на то, что кодировка OEM не распозналась и интерпретируется как utf-8.
как-то я сомневаюсь что там есть интерпретатор .bat-ов

если твой проект сохранён в пути, где есть кирилица, попробуй перенести его в исключительно англоязычное место
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Подлая засада с .BAT файлами

Сообщение Cheb » 16.08.2018 17:30:07

если твой проект сохранён в пути, где есть кирилица,

Не пользую, т.к. привык (с версии 1.1) что фпц не умеет компилировать по таким путям.

как-то я сомневаюсь что там есть интерпретатор .bat-ов

А он - как суслик, он есть.

... ан нет, вы были правы, батенька: в батниках перезадание однажды заданных переменных окружения не работает внутри оператора if, и лазарь тут, возможно, ни при чём. Но почему тогда компиляция работала из cmd.exe но не работала из лазаря!

Доказательство: (выделяю цветом строка в батнике / строка в консоли лазаря высер cmd.exe)

В начале батника:

set CGE32_OPT=-Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel
set CODE32_OPT=-O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX
set DLL32_OPT=-dcgemodule -dcgehub %CGE32_OPT% %CODE32_OPT% -FU..\..\..\tmp\%MODNAME%\ -Fu..\..\..\tmp\%MODNAME%\

Debug: D:\chentrah\modules\chentrah\src>set CGE32_OPT=-Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel
Debug:
Debug: D:\chentrah\modules\chentrah\src>set CODE32_OPT=-O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX
Debug:
Debug: D:\chentrah\modules\chentrah\src>set DLL32_OPT=-dcgemodule -dcgehub -Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel -O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX -FU..\..\..\tmp\_hub\ -Fu..\..\..\tmp\_hub\


А потом, ниже, внутри условного оператора if NOT "%BUILD_DLL%" == "0" (

set CODE32_OPT=-O2
set DLL32_OPT=-dcgemodule -dcgehub %CGE32_OPT% %CODE32_OPT% -FU..\..\..\tmp\%MODNAME%\ -Fu..\..\..\tmp\%MODNAME%\
echo "suslik! %DLL32_OPT%"


Debug: set CODE32_OPT=-O2
Debug: set DLL32_OPT=-dcgemodule -dcgehub -Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel
-O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX -FU..\..\..\tmp\_hub\ -Fu..\..\..\tmp\_hub\
Debug: echo "suslik! -dcgemodule -dcgehub -Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel -
O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX -FU..\..\..\tmp\_hub\ -Fu..\..\..\tmp\_hub\"

"suslik! -dcgemodule -dcgehub -Twin32 -gl -gs -gp -dcge -dnotlaz -dcge_rc_directly -Mobjfpc -Rintel -O3 -OpPentiumM -CfSSE2 -vq -Sa -Sh -Sc -Xi -XX -FU..\..\.
.\tmp\_hub\ -Fu..\..\..\tmp\_hub\"
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34

Re: Подлая засада с .BAT файлами

Сообщение скалогрыз » 16.08.2018 17:59:46

не присваивай DLL32_OPT в IF-е, присваивай после:
Код: Выделить всё
set CODE32_OPT=-O3

if NOT "%BUILD_DLL%" == "0" (
  set CODE32_OPT=-O2
)
set DLL32_OPT=-dcgemodule -dcgehub %CGE32_OPT% %CODE32_OPT% -Foo


особенность развёртки значений внутри IF().
Код: Выделить всё
@echo off
set CODE32_OPT=-O3

echo "before %CODE32_OPT%"
if "0" == "0" (
  set CODE32_OPT=-O2
  echo "inside %CODE32_OPT%"
)
echo "after %CODE32_OPT%"
скалогрыз
долгожитель
 
Сообщения: 1803
Зарегистрирован: 03.09.2008 02:36:48

Re: Подлая засада с .BAT файлами

Сообщение Cheb » 17.08.2018 01:15:02

:shock: Тыдыщь жеж!

Спасибо.
Назвать эту логику "извращённой" - значит ничего не сказать. Но, по крайней мере, понятно!
Аватара пользователя
Cheb
энтузиаст
 
Сообщения: 994
Зарегистрирован: 06.06.2005 15:54:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 21

Рейтинг@Mail.ru