Как создать файл make для верифицированного (vx520 или vx820)

У меня есть проверенный терминал (vx520 и vx820). Я хочу создать make-файл для приложения компиляции для этого терминала. У меня "VRXSDK" версия 1.2.0

как это сделать?

или как скомпилировать файл типа "main.c" или "main.cpp", чтобы получить исполняемый файл для проверенного POS-терминала

1 ответ

Где бы вы ни получили свой "VRXSDK", вы также сможете получить несколько примеров файлов проекта. Там вы найдете файл make (вероятно, с расширением.smk). Я бы порекомендовал вам начать с этого, и по мере того, как вы его читаете, это должно дать вам более конкретные вопросы и вопросы, которые вы можете найти с помощью своей любимой поисковой системы.

По сути, make-файл - это программа, которая вызывает компилятор с входными параметрами, которые вы определяете на основе различных факторов. Это также вызовет компоновщик, чтобы связать все это вместе. То, как вы это делаете, сильно разнится от одной реализации к другой, поэтому "Как мне создать файл make" примерно так же широко, как "Как мне написать программу?". что делает ответ здесь довольно сложным. Однако, чтобы вы начали...

Я использую Visual Studio в качестве своей IDE, и я использую NMake. У меня на самом деле есть 2 слоя make-файлов. Внешний слой - это то, что называется, когда я говорю "build" из моей IDE, и он очень короткий:

# Pick one of the following (for LOG_PRINTF messages)
#CompileWithLogSys = -DLOGSYS_FLAG 
CompileWithLogSys =

all:
    $(MAKE) /i /f coreBuild.smk /a TerminalType=$(Configuration) CompileWithLogSys=$(CompileWithLogSys) VMACMode=Multi
    $(MAKE) /i /f coreBuild.smk /a TerminalType=$(Configuration) CompileWithLogSys=$(CompileWithLogSys) VMACMode=Single

Строки, начинающиеся с #, являются комментариями.

Этот внешний файл позволяет мне легко переключать некоторые вещи, когда я хочу создавать различные варианты. Вы можете видеть, что я выключил совместимость с LogSys. Более важная вещь, которую дает мне двухслойный подход, - это простой способ компилировать 2 разные версии одной командой для сборки. Это запускает nmake с "VMACMode", установленным в "Multi", а затем запускает его снова с "Single". Внутренний make-файл увидит этот параметр и скомпилирует в свою корневую папку для каждой, так что в итоге я получу 2 папки, каждая с разной версией.

Вы можете выполнить веб-поиск по "параметрам nmake", чтобы увидеть, что делают такие, как /i и /f, а также другие параметры, которые я здесь не использую. Тем не менее, я хотел бы обратить ваше внимание на TerminalType=$(Configuration), В Visual Studio вы можете выбрать из выпадающего списка, если вы хотите "Отладка" или "Выпуск". Эти 2 параметра являются параметрами по умолчанию, но вы можете изменить их; в моем случае я изменил их на "eVo" и "Vx". Теперь я просто выбираю в раскрывающемся списке, какую версию я хочу скомпилировать, и которая будет передана. С другой стороны, я мог бы просто жестко кодировать оба в свой внешний make-файл. Это просто предпочтение.

Мой внутренний make-файл (который называется "coreBuild.smk") становится намного интереснее. Как правило, вы начинаете с определения переменных, таких как "пути включения":

# Includes
SDKIncludes = -I$(EVOSDK)\include
ACTIncludes = -I$(EVOACT)include
VCSIncludes = -I$(EVOVCS)include
EOSIncludes = -I$(EOSSDK)\include\ssl2

И / или библиотеки:

#Libraries
ACTLibraries    = $(EVOACT)OutPut\RV\Files\Static\Release

#Others you may want to include, but I am not using:
#LOGSYSLibraries = $(EVOVMAC)\Output\RV\Lib\Files\Debug
#EOSLibraries   = $(EOSSDK)\lib

А также путь (и) к вашим файлам

#  App Paths
AppIncludes = .\include
SrcDir      = .\source
ObjDir      = .\obj
OutDir      = .\Output\$(TerminalType)\$(VMACMode)\Files
ResDir      = .\Resource

Я также хотел бы определить название моего проекта здесь:

ProjectName = MakeFileTest

Обратите внимание, что OutDir использует TerminalType а также VMACMode что мы передали, чтобы перейти к уникальной папке.

Далее вы обычно устанавливаете параметры компилятора

#   Compiler Options
#  Switch based on terminal type
!IF "$(TerminalType)"=="eVo"
CompilerCompatibility=-p
DefineTerminalType = -DEVO_TERMINAL
!ELSE
CompilerCompatibility=
DefineTerminalType = -DVX_TERMINAL
!ENDIF

#  Switch based on Multi or Single mode (VMACMode)
!if "$(VMACMode)"=="Multi"
VMACIncludes = -I$(EVOVMAC)include
DefineMulti = -DMULTI_APP_ENABLED
!else
VMACIncludes = 
DefineMulti = 
!endif

Интересно отметить, что выше -DMULTI_APP_ENABLED, В программе, которую я написал, есть несколько блоков, которые зависят от #ifdef MULTI_APP_ENABLED, Это не какое-то специальное имя - это просто имя, которое я придумал, но компилятор определит его прямо перед тем, как начнет компилировать мой код, поэтому я могу включать и выключать эти блоки кода прямо здесь.

Далее мы собираемся все собрать вместе. Мы начнем с определения новой переменной "Includes", которая будет иметь флаг "-I" (для обозначения "include"), а затем все то, что мы сказали выше, что мы хотели включить:

Includes    = -I$(AppIncludes) $(SDKIncludes) $(ACTIncludes) $(VMACIncludes) $(VCSIncludes)

Обратите внимание, что вы можете просто набрать здесь все длинные руки и не выполнять дополнительные шаги по определению переменных в первую очередь, но это облегчает чтение, так что я думаю, что это довольно нормально.

Мы делаем почти то же самое с опциями компилятора, хотя обратите внимание, что определенные флаги (ex, "-D" "-p") уже были включены в исходные объявления var, поэтому мы оставляем их здесь:

COptions    =$(CompilerCompatibility) $(CompileWithLogSys) $(DefineTerminalType) $(DefineMulti) -DDEV_TOGGLES_FOR_SYNTAX 

Затем мы устанавливаем переменную, которая сообщит компоновщику, где находятся объектные файлы, которые необходимо сшить вместе. Обратите внимание, что если вы вставляете новые строки, как у меня, вам нужно '\', чтобы сказать ему, что это продолжается на следующей строке

# Dependencies
AppObjects = \
        $(ObjDir)\$(ProjectName).o \
        $(ObjDir)\Base.o \
        $(ObjDir)\printer.o \
        $(ObjDir)\UI.o \
        $(ObjDir)\Comm.o

Мы также установим один для любых библиотек, на которые мы хотим связать:

Libs = $(ACTLibraries)\act2000.a

ОК, затем мы должны подписать файл (ы). Мы пытаемся сказать nMake, что мы также будем создавать файл ресурсов и компилировать фактический код. Если мы делаем сборку из нескольких приложений, то псевдо-выход зависит от файлов.res и.out. Если нет, то это зависит только от.out, потому что нет.res. Если зависимый файл (-ы) изменился / изменился более недавно, чем pseudoOut, запустите команды vrxhdr..., filesignature... и move... Обратите внимание, что для правильной работы nMake требуются отступы, показанные ниже.

!if "$(VMACMode)"=="Multi"
pseudoOut : $(ResDir)\$(ProjectName).res $(OutDir)\$(ProjectName).out
!else
pseudoOut : $(OutDir)\$(ProjectName).out 
!endif
#   This calls vrxhdr: the utility program that fixes the executable program’s header required to load and run the program. Vrxhdr is needed when you want to move a shared library around on the terminal.
    $(EVOSDK)\bin\vrxhdr -s 15000 -h 5000 $(OutDir)\$(ProjectName).out

# do the signing using the file signature tool and the .fst file associated with this TerminalType.
    "$(VSFSTOOL)\filesignature" $(TerminalType)$(VMACMode).fst -nogui
    @echo __________________ move files to out directory __________________
# rename the .p7s file we just created 
    move $(OutDir)\$(ProjectName).out.p7s $(OutDir)\$(ProjectName).p7s

!if "$(VMACMode)"=="Multi"
    copy $(ResDir)\imm.ini $(OutDir)\imm.ini
    copy $(ResDir)\$(ProjectName).INS $(OutDir)\$(ProjectName).INS
    copy $(ResDir)\$(ProjectName).res $(OutDir)\$(ProjectName).res
!endif
    @echo *****************************************************************

Обратите внимание, что команды "echo" предназначены только для того, чтобы при необходимости прочитать мои выходные журналы.

Хорошо, теперь мы связываемся.

"ПОДОЖДИТЕ!" Я слышу, как вы говорите: "Мы еще не скомпилировали, мы уже дали команду подписать, и теперь мы связываемся? Это совершенно не в порядке!" И да и нет. На самом деле мы еще не дали команду подписать, мы просто сказали nmake, что мы можем захотеть сделать это и как это сделать, если мы решим это сделать. Точно так же мы еще не даем команду на связывание, мы просто сообщаем nmake, как это сделать, когда будем готовы.

#  Link object files
$(OutDir)\$(ProjectName).out : $(AppObjects)
    $(EVOSDK)\bin\vrxcc $(COptions) $(AppObjects) $(Libs) -o $(OutDir)\$(ProjectName).out

Помните, что программам mutli-app нужен файл.res. Отдельные приложения этого не делают. Следующее фактически создаст файл.res, по мере необходимости.

!if "$(VMACMode)"=="Multi"
#  compile resource file
$(ResDir)\$(ProjectName).res : $(ResDir)\$(ProjectName).rck
    $(EVOTOOLS)rck2 -S$(ResDir)\$(ProjectName) -O$(ResDir)\$(ProjectName) -M
!endif

Помните эти AppObjects? Мы наконец готовы сделать их. Я использую следующие флаги

  • -c = только компиляция
  • -o = имя выходного файла
  • -e"-" => -e перенаправить вывод ошибок из подинструментов в... "-" на стандартный вывод (Все они затем перенаправляются через канал |)

Опять же, где бы вы ни получили свой VRXSDK, вы также сможете получить некоторую документацию от VeriFone. Смотрите "Verix_eVo_volume 3", стр. 59 для более подробной информации о флагах

$(ObjDir)\$(ProjectName).o : $(SrcDir)\$(ProjectName).c
!IF !EXISTS($(OutDir))
    !mkdir $(OutDir)
!ENDIF
    -$(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\$(ProjectName).o $(SrcDir)\$(ProjectName).c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"

$(ObjDir)\Base.o : $(SrcDir)\Base.c 
  $(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\base.o $(SrcDir)\Base.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"

$(ObjDir)\myprinter.o : $(SrcDir)\printer.c 
  $(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\printer.o $(SrcDir)\printer.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"

$(ObjDir)\UI.o : $(SrcDir)\UI.c 
  $(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\UI.o $(SrcDir)\UI.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"

$(ObjDir)\Comm.o : $(SrcDir)\Comm.c 
  $(EVOSDK)\bin\vrxcc -c $(COptions) $(Includes) -o $(ObjDir)\Comm.o $(SrcDir)\Comm.c -e"-" | "$(EVOTOOLS)fmterrorARM.exe"
Другие вопросы по тегам