purebasic.info

PureBasic forum
Текущее время: Вс окт 21, 2018 6:19 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: Вс сен 20, 2015 5:03 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
по мотивам: http://www.purebasic.fr/english/viewtop ... 12&t=30864
Отличается:
1) Путь к компилятору берет из переменной среды (правильно работает с портабельными версиями)
2) Использует все доступные флаги компиляции (Unicode, ThreadSafe, итд), никто это не учитывал.
3) ASM файл кладет рядом с исходником, с именем исходника + ".asm"
4) Временный бинарник кладет во временную папку, и удаляет, по окончании работы.
Известные проблемы:
1) Нет кросс-платформенности (надо допиливать ключи компилятора, мне лень)

Использование:
1) Компилируем и кладем куда угодно
2) Подключаем в IDE в качестве нового инструмента:
a) Параметр: "%FILE"
б) Рабочая папка: пусто
в) Имя: задать любое
г) Событие: Меню или клавиша
д) другие опции - не активировать

3) Запускаем через меню (или клавишу)
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
;*********************************
; FileName: AsmTools.pb
; Author:   void
; Compiler: PB531 (Windows only)
; Ver:      001
;
;  Запускать как Tools из IDE с параметром "%FILE" (ручной запуск, без условий)
;
;  по мотивам: http://www.purebasic.fr/english/viewtopic.php?f=12&t=30864
;  Отличается:
;  1) Путь к компилятору берет из переменной среды (правильно работает с портабельными версиями)
;  2) Использует все доступные флаги компиляции (Unicode, ThreadSafe, итд), никто это не учитывал.
;  3) ASM файл кладет рядом с исходником, с именем исходника + ".asm"
;  4) Временный бинарник кладет во временную папку, и удаляет, по окончании работы.
;  Известные проблемы:
;  1) Нет кросс-платформенности (надо допиливать ключи компилятора, мне лень)
;*********************************
EnableExplicit
 
Define compiler$ = GetEnvironmentVariable("PB_TOOL_Compiler")
If Not (Len(compiler$) And FileSize(compiler$) > 0)
  MessageRequester("ERROR!!!", "Run only as <PB_Tools>")
  End
EndIf
 
Define srcFile$ = ProgramParameter(0)  
If Not (Len(srcFile$) > 0 And FileSize(srcFile$) > 0)  
  MessageRequester("ERROR!!!", "Not found source file: " + srcFile$)
  End
EndIf
 
Define options$ = #DQUOTE$ + srcFile$ + #DQUOTE$ + " /COMMENTED"
If Val(GetEnvironmentVariable("PB_TOOL_Debugger"))
  options$ + " /DEBUGGER"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_Unicode"))
  options$ + " /UNICODE"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_Thread"))
  options$ + " /THREAD"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_XPSkin"))
  options$ + " /XP"
EndIf
If Val(GetEnvironmentVariable("PB_TOOL_OnError"))
  options$ + " /LINENUMBERING"
EndIf
If Len(GetEnvironmentVariable("PB_TOOL_SubSystem"))
  options$ + " /SUBSYSTEM " + #DQUOTE$ + GetEnvironmentVariable("PB_TOOL_SubSystem") + #DQUOTE$
EndIf
Define tmpBin$ = GetTemporaryDirectory() + "~tmpcompile"
options$ + " /EXE " + #DQUOTE$ + tmpBin$ + #DQUOTE$
 
;ищем недостающие настройки (выходной формат) в конце файла
Define tmpStr$
Define srcFile = ReadFile(#PB_Any, srcFile$)
Define format = ReadStringFormat(srcFile)
While Not Eof(srcFile)
  tmpStr$ = ReadString(srcFile, format)
  If Left(tmpStr$,21) = "; ExecutableFormat = "
    tmpStr$ = LCase(Trim(Mid(tmpStr$,22)))
    Select tmpStr$
      Case "console"  
        options$ + " /CONSOLE"
      Case "shared dll"
        options$ + " /DLL"
    EndSelect
    Break
  EndIf
Wend  
CloseFile(srcFile)  
 
Define srcPath$ = GetPathPart(srcFile$)
Define asmFile$ = srcPath$ +"PureBasic.asm"
Define trgName$ = srcPath$ + GetFilePart(srcFile$) + ".asm"
 
DeleteFile(asmFile$, #PB_FileSystem_Force)
DeleteFile(trgName$, #PB_FileSystem_Force)
 
;MessageRequester("Compiler options:", options$) ;For Debug
 
RunProgram(compiler$, options$, srcPath$, #PB_Program_Hide|#PB_Program_Wait)
Delay(500)
DeleteFile(tmpBin$, #PB_FileSystem_Force)
 
If Not (FileSize(asmFile$)>0)
  MessageRequester("ERROR!!!", "Not create ASM file: " + asmFile$ + #CRLF$ + "Compiler options: " + options$)
  End
EndIf
 
RenameFile(asmFile$, trgName$)
 
RunProgram("notepad", trgName$, srcPath$)
 
 
 



зы. если есть желающие допилить для других систем, милости просим.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн сен 21, 2015 10:23 am 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
ещё бы обратно из *.asm также легко собрать..


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн сен 21, 2015 4:27 pm 
Не в сети
док

Зарегистрирован: Сб окт 31, 2009 7:44 am
Сообщений: 168
Благодарил (а): 92 раз.
Поблагодарили: 5 раз.
Пункты репутации: 0
Kuzmat
доделаете или мне сделать?
строка компиляции:
Цитата:
C:\PureBasic\Compilers\pbcompiler.exe /REASM C:\PureBasic.asm

название файла принимает только "PureBasic.asm", поэтому "в) Имя: задать любое" - тоже лучше по умолчанию выставить "PureBasic.asm". Также, собрать получается только с диска "С", поэтому, возможно, лучше сразу кидать файл в корень диска "С"..
п.с. похоже, придется два разных инструмента делать. Или даже четыре - если у файла есть ресурсы, то учитывать параметр /RESOURCE
Наверное, проще на батниках остановиться:)


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн сен 21, 2015 4:53 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Название должно любое приниматься (иначе зачем его передавать вообще), скорее всего надо верно выставить рабочую папку еще.
Тут вопрос другой интересен, есть-ли необходимость повторять флаги компиляции? (или в .asm файле уже все есть), надо экспериментировать вопчем.
Но я склоняюсь к другому пути, тот что используется в DeadProcedureRemover (От "Danilo мастера" http://www.purebasic.fr/english/viewtopic.php?p=441366#p441366).
Но окончательно мысль еще не сформировалась :roll:

зы. учитывать желательно все (и ресурсы, и иконку, итд) иначе это баловство, батник - конечно можно, но а зачем он нам, когда у нас пурик есть :wink:


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн сен 21, 2015 7:21 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
bizdon писал(а):
"в) Имя: задать любое" - тоже лучше по умолчанию выставить "PureBasic.asm

В пункте в) речь идет о имени пункта меню для инструмента.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн сен 21, 2015 9:07 pm 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 257
Благодарил (а): 34 раз.
Поблагодарили: 25 раз.
Пункты репутации: 0
Копаем процесс компиляции дальше, хочется узнать всю последовательность шагов по созданию исполняемого файла, написол вот такую прокси-обманку:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
EnableExplicit
OpenConsole()
 
Define WrkDir$  = GetCurrentDirectory()
Define MyDir$ = GetPathPart(ProgramFilename())
Define MyName$ = GetFilePart(ProgramFilename(),#PB_FileSystem_NoExtension)
Define RealExe$ = MyDir$ + MyName$ + "_real.exe"
Define LogName$ = MyDir$ + "Proxy.log"
 
Define ComStr$, i, count
count = CountProgramParameters() - 1
For i=0 To count
  ComStr$ + ProgramParameter(i) + " "
Next
 
Define LogFile = OpenFile(#PB_Any, LogName$, #PB_File_Append)
WriteStringN(LogFile, "Start! " + MyName$)
WriteStringN(LogFile, "WrkDir:<" + WrkDir$ + ">")
WriteStringN(LogFile, "ComStr:<" + ComStr$ + ">")
CloseFile(LogFile)
 
Define realPrg, tmp$
realPrg = RunProgram(RealExe$, ComStr$, WrkDir$, #PB_Program_Hide|#PB_Program_Open|#PB_Program_Read|#PB_Program_Error)
 
While ProgramRunning(realPrg)
  tmp$ = ReadProgramError(realPrg, #PB_Ascii)
  If Len(tmp$)
    ConsoleError(tmp$)
  EndIf
  If AvailableProgramOutput(realPrg)
    tmp$ = ReadProgramString(realPrg, #PB_Ascii)
    PrintN(tmp$)
  EndIf
  Delay(1)
Wend
Define exitCode = ProgramExitCode(realPrg)
 
End exitCode
 
 
 
; IDE Options = PureBasic 5.31 (Windows - x86)
; ExecutableFormat = Console
; CursorPosition = 23
; FirstLine = 3
; Executable = Huker.exe
; DisableDebugger
; CompileSourceDirectory

настоящие переименовываем:
pbcompiler.exe => pbcompiler_real.exe
Fasm.exe => FAsm_real.exe
polink.exe => polink_real.exe
а на ихместо копируем нашу проксю (она прозрачно передает управление на соответствующие инструменты, и сохраняет лог запусков, командных строк, рабочих папок)
Компилируем всеми любимый:
Код:
1
2
3
If OpenWindow(0, 0, 0, 400, 200, "win", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf

и видим:
Код:
1
2
3
4
5
6
7
8
9
10
Start! pbcompiler
WrkDir:<z:\PB531x32\>
ComStr:</STANDBY /LANGUAGE Russian >
Start! FAsm
WrkDir:<C:\Temp\PureBasic1336056984\>
ComStr:<PureBasic.asm PureBasic.obj >
Start! polink
WrkDir:<C:\Temp\PureBasic1336056984\>
ComStr:</FORCE:MULTIPLE /OUT:"Z:\My_SRC\My_SRC\TOOLS\test.exe" /ENTRY:PureBasicStart /SUBSYSTEM:Windows /NODEFAULTLIB /LIBPATH:"z:\PB531x32\Compilers" /LIBPATH:"z:\PB531x32\PureLibraries\Windows\Libraries" PureBasic.obj SystemBase.lib StringUtility.lib UnicodeFunctions.lib MSVCRT.lib KERNEL32.lib USER32.lib GDI32.lib COMDLG32.lib ADVAPI32.lib COMCTL32.lib OLEAUT32.lib Window.lib Event.lib Map.lib Gadget.lib System.lib Date.lib 2DDrawing.lib Image.lib AlphaImage.lib ImagePlugin.lib Memory.lib z:\PB531x32\compilers/objectmanager.lib SimpleList.lib z:\PB531x32\compilers/stringmanager.lib OLEAUT32.LIB ADVAPI32.LIB OLE32.LIB SHELL32.LIB COMCTL32.LIB UUID.LIB SHELL32.LIB WINMM.LIB MSVCRT.LIB KERNEL32.LIB >
 


1) pbcompiler - запускается 1 раз и встает резидентом (надо подумать как отследить дальнейшее общение IDE с ним)
2) FAsm - всезда запускается очень примитивно (с командой "PureBasic.asm PureBasic.obj") и интереса не представляет.
3) А вот у линкера, оочень кудрявая строка запуска (видимо из соображений, как-бы чего не забыть :D ) и это 531, на 540 видимо еще круче.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB