4.如何在Windows上构建Erlang / OTP | 4. How to Build Erlang/OTP on Windows
目录
Introduction
Short Version
Frequently Asked Questions
Tools you Need and Their Environment
The Shell Environment
Building and Installing
Development
Using GIT
4.1介绍
本节介绍如何在Windows上构建Erlang模拟器和OTP库。请注意,如果没有Microsoft的开发工具和/或不想安装Cygwin,MSYS或MSYS2,Windows二进制版本仍然是首选替代方案。
这些说明适用于支持Cygwin模拟gnuish环境或MSYS或MSYS2 ditto的Windows版本。我们构建在以下平台上:Windows 2012,Windows 7,Windows 8和Windows 10.也可以在较旧的平台上构建,但您可能无法在适当的Microsoft SDK,Visual Studio或OpenSSL中安装哪种情况下你需要返回到早期的编译器等。
所描述的过程使用Cygwin,MSYS或MSYS2作为构建环境。你在Cygwin / MSYS / MSYS2中运行bash shell并使用gnu make / configure / autoconf等来编译。但是,仿真器C源代码大多是使用Microsoft Visual C ++?编译生成本机Windows二进制文件。这与我们用于构建预构建二进制文件的过程相同。为什么我们使用VC ++而不是gcc在FAQ部分进一步解释。
如果你不熟悉Cygwin,MSYS,MSYS2或者Unix环境,你可能需要阅读一下它的工作原理。有很多关于这个在线的文档。
这些说明适用于32位和64位Windows。请注意,即使您构建了64位版本的Erlang,涉及的大多数目录和文件仍然命名为win32。然而,名称win64的一些发生却存在。例如,Erlang的64位Windows版本的安装文件是otp_win64_20.exe
。
如果您对环境和构建系统感到满意,并拥有所有必要的工具,那么您将有更好的机会让Windows的Erlang / OTP分发更好。请提交任何建议给我们JIRA
和补丁,git project
让他们找到进入下一版Erlang的方法。如果对构建系统进行更改(如makefile等),请记住在Unix / VxWorks上使用相同的makefile,以便您的更改不会破坏其他平台。这当然也适用于C代码。系统特定的代码主要驻留在$ERL_TOP/erts/emulator/sys/win32
和$ERL_TOP/erts/etc/win32
目录中。该$ERL_TOP/erts/emulator/beam
目录用于通用代码。
我们已经使用这个构建过程来发布几个版本,并且它对我们来说工作得很好。但是,不同的机器和不同的设置可能会有各种各样的麻烦。无论遇到什么困难,我们都会尽力给出提示,但请使用erlang-questions
邮件列表分享您的经验。当然,我们不能帮助所有人解决所有问题,所以请尝试解决这些问题并提交解决方案/解决方法。
让我们去吧!我们将从一个简短版本的设置程序开始,然后是一些常见问题解答,然后我们将详细介绍设置。
4.2短版
在下面的章节中,我们尽可能多地描述了所需工具的安装。一旦安装了这些工具,建筑物就非常容易。我们也试图让Unix操作系统有限的用户理解这些指令。Cygwin / MSYS / MSYS2对于一些Windows用户来说是一个全新的环境,为什么仔细解释环境变量等似乎已经到位。
尽管这是一个短小的故事,但对于经验丰富和急躁的人来说:
- 获取并安装完整的Cygwin(最新版),使用MSYS完成MinGW或完成MSYS2
- 安装Visual Studio 12.0(2013)
- 安装微软Windows SDK 8.1
- 获取并安装Sun的JDK 1.6.0或更高版本
- 获取并安装NSIS 2.01或更高版本(最高可尝试并工作2.46)
- 使用静态库获取,构建和安装OpenSSL 0.9.8r或更高版本(高达1.0.2d尝试&工作)。
- 从[`http://www.erlang.org/download.html`](http://www.erlang.org/download.html)获取Erlang源代码发行版),并使用Cygwin的/ MSYS / MSYS2的` tar`。
- 将`ERL_TOP`设置为解包源代码分发的位置
- `$ cd $ERL_TOP`
- 修改PATH和其他环境变量,以便所有这些工具都可以从bash shell运行。仍然站在`$ ERL_TOP`中,发出以下命令(对于32位Windows,从第一行中删除x64,并在最后一行将`otp_win64_20`改为`otp_win32_20`):$ eval ./otp\_build env\_win32 x64$ ./otp_build autoconf $。 / otp_build configure $ ./otp_build boot -a $ ./otp_build release -a $ ./otp_build installer_win32 $ release / win32 / otp_win64_20 / S
瞧!Start->Programs->Erlang OTP 20->Erlang
启动Erlang Windows shell。
4.3常见问题
- 问:那么,现在我可以在Windows上使用GCC来构建Erlang了?答:不,不幸的不是。您仍然需要Microsoft的Visual C ++。Bourne-shell脚本(cc.sh)封装了Visual C ++编译器并在Cygwin环境中运行它。构建Erlang所需的所有其他工具都是自由软件/开放源码,但不是C编译器。然而,Windows SDK足以构建Erlang,您无需购买Visual C ++,只需下载SDK(SDK版本8.1 == Visual studio 2013)即可。
- 问:那你为什么还没有摆脱VC ++呢?答:嗯,部分是因为它是一个好的编译器 - 真的!实际上,在后期的R11版本中,可以使用mingw而不是Visual C ++来构建(您可能会在某些脚本和目录中看到这些残留)。不幸的是,用于Windows的SMP版本的开发打破了mingw版本,并且我们选择专注于VC ++版本,因为在VC ++版本中性能更好。mingw build可能会回来,但只要VC ++提供更好的性能,商业版本将成为VC ++版本。
- 问:好的,你需要VC ++,但现在你已经开始要求一个相当新的(和昂贵的)版本的Visual Studio。为什么?A:嗯,它不贵,它是免费的(如免费啤酒)。只需从Microsoft下载并安装最新的Windows SDK,并且您需要的所有工具都在那里。包含的调试器(WinDbg)也非常实用。这就是我在将Erlang移植到64位Windows时所使用的。使用更高版本的Microsoft编译器的另一个原因是DLL兼容性。如果虚拟机使用旧的VC ++版本进行编译,那么使用新版标准库的DLL可能无法加载。所以我们应该瞄准使用最新的免费SDK和编译器。
- 问:我能/将用你描述的程序构建一个Cygwin二进制文件吗?答:不,结果将是一个纯粹的Windows二进制文件,据我所知,目前还无法制作Cygwin二进制文件。这当然是可取之事,但动态链接(动态Erlang驱动程序加载)以及Cygwin中的TCP / IP仿真仍然存在一些问题,我相信这一点会改进,但仍然存在一些问题。解决这些问题可能很简单,也可能很难。我建议你尝试一下,分享你的经验。如果一个简单的
./configure && make
产生完全成熟的Cygwin二进制文件,没有人会更高兴。 - 问:哈哈,我看到你了,尽管你说过你没用,但你还是使用了GCC!答:好的,我承认,其中一个文件是使用Cygwin或MinGW的GCC编译的,然后使用一个小的C hack将产生的目标代码转换为MS VC ++兼容的coff。这是因为该特定文件
beam_emu.c
能够使用GCC label-as-values扩展,从而使仿真器性能提高达50%,从而获益匪浅。遗憾的是,这并不意味着所有的OTP都可以使用GCC编译。这个特定的源代码没有做任何系统特定的事情,并且实际上被采用到了GCC被用来在Windows上编译它的事实。 - 问:那么现在有一个MS VC ++项目文件,我可以使用漂亮的VC ++ GUI构建OTP?答:不,从不。保持项目文件最新的麻烦以及从VC ++ GUI执行构建OTP构建的所有步骤简直是不值得的,甚至可能是不可能的。Erlang / OTP的VC ++项目文件永远不会发生。
- 问:那么它是如何工作的?答:Cygwin,MSYS或MSYS2是与任何Unix机器上的环境非常相似的环境。这几乎就像你在Windows里有一台虚拟的Unix机器一样。在给定某些参数的情况下配置,然后创建由环境的gnu-make用于构建系统的makefile。然而,大多数实际的编译器等并不是Cygwin / MSYS / MSYS2工具,所以我们编写了几个包装器(Bourne-shell脚本),它们驻留在
$ERL_TOP/etc/win32/cygwin_tools
和中$ERL_TOP/etc/win32/msys_tools
。他们都在Unix环境中进行通用参数和开关的转换,以适应本地Windows工具。最值得注意的是Cygwin / MSYS / MSYS2中的路径是带有“正斜杠”(/)且没有驱动器号的类Unix路径。Cygwin特定的命令cygpath
用于Cygwin环境中的大部分路径转换。在相应的MSYS和MSYS2环境中使用其他工具(需要时)。幸运的是,大多数编译器接受正斜杠而不是反斜杠作为路径分隔符,但仍然必须获得驱动器号等。包装器脚本不是通用的,例如,cc.sh会理解和翻译每个可能的gcc选项并将正确的选项传递给cl.exe。原则是这些脚本足够强大,足以允许构建Erlang / OTP,不多也不少。他们可能需要扩展来处理Erlang开发过程中的变化,这就是我们将它们制作成shell脚本而不是Perl脚本的原因之一。我们相信他们更容易理解和改变。在$ERL_TOP
,有一个脚本叫otp_build
。该脚本处理的给所有正确的参数的麻烦configure
/make
,还可以帮助你树立正确的环境变量与在Cygwin的/ MSYS / MSYS2 Erlang的源工作。 - 问:您使用并需要Cygwin,但您没有花时间将Erlang移植到Cygwin环境,而是专注于您的商业版本,这是否真的道德?答:不,不是,但将此视为朝着正确方向迈出的一步。
- 问:我可以制作与商业版本完全相同的内容吗?答:是的,我们使用完全相同的构建过程。
- 问:那么您使用的是哪种版本的Cygwin / MSYS / MSYS2和其他工具?答:对于Cygwin,MSYS和MSYS2,我们尝试使用构建时提供的最新版本。你使用什么版本应该不重要。我们尝试为我们在不同Cygwin / MSYS / MSYS2版本中发现的错误提供解决方法。请尽快为您遇到的新Cygwin / MSYS / MSYS2相关错误添加解决方法。也请将错误报告提交给适当的Cygwin,MSYS和/或MSYS2开发人员。我们用于20的GCC版本是4.8.1(MinGW 32bit)和4.8.5(MSYS2 64bit)。我们使用了VC ++ 12.0(即Visual Studio 2013),Sun的JDK 1.6.0_45(32位)和Sun的JDK 1.7.0_1(64位),NSIS 2.46和Win32 OpenSSL 1.0.2d。请阅读下一节,了解您需要的详细信息。
- 问:你能帮我在Cygwin / MSYS / MSYS2中设置X吗?答:不,很遗憾,我们没有时间帮助Cygwin / MSYS / MSYS2相关的用户问题,请阅读相关网站,新闻组和邮件列表。
4.4您需要的工具及其环境
您需要一些工具才能在Windows上构建Erlang / OTP。最值得注意的是,您需要Cygwin,MSYS或MSYS2,Visual Studio和Microsofts Windows SDK,但您可能还需要Java编译器,NSIS安装系统和OpenSSL。那么,这里有一些关于不同工具的信息:
- Cygwin,最新的通常是最好的。获取所有开发工具,当然还有所有基本的同上。确保获得jar并确保不要安装Cygwin'ish Java,因为使用了Cygwin jar命令,但使用了Sun的Java编译器和虚拟机。如果你打算建立一个64位的Windows版本,你应该确保使用Cygwin安装MinGW的64位gcc。它在其中一个开发包中。URL:
http://www.cygwin.com
从网站获取安装程序并使用它来安装Cygwin。一定要有公平的权利。如果您位于NT域,您应该考虑运行,mkpasswd -d
并mkgroup -d
在安装后使用户数据库正确。请参阅各自的手册页。当你开始你的第一个bash shell时,你会得到一个糟糕的提示。你也可能有一个PATH
包含反斜杠等的环境变量。编辑$HOME/.profile
并$HOME/.bashrc
设置公平提示和正确的PATH。还做了一个export SHELL
在.profile
。由于某些不明显的原因,该环境变量$SHELL
未在bash中导出。另外请注意,它.profile
是在登录时和.bashrc
子shell被创建时运行的。如果您想要在那里运行登录时的命令(如设置别名,shell函数等),您需要明确地.bashrc
从源代码中获取信息.profile
。例如,你可以在最后这样做.profile
:ENV = $ HOME / .bashrc export ENV。$ ENV您可能还想要设置X-windows(XFree86)。这可能与从命令提示符运行startx一样简单,可能会更困难。使用Google寻找帮助。如果您不使用X-windows,则可能需要通过在控制台系统菜单(窗口左上角,标题栏中的Cygwin图标)中选择属性来设置Windows控制台窗口。尤其是设置更大的屏幕缓冲区大小(线条)非常有用,因为它可以让您获得滚动条,因此您可以看到可能出现的任何错误消息。还有其他一些可用的shell,但是在下面的所有示例中,我们假设您使用bash。 - 或者你可以下载MinGW和MSYS。您可以在以下网址找到最新的安装程序:URL:
http://sourceforge.net/projects/mingw/files/Installer/mingw-get-inst/
确保安装基本的开发工具,但避免使用MinGW autoconf并安装msys。
为了能够构建64位虚拟机,您还需要64位MinGW编译器:
我们已经尝试了1.0,但最新版本应该做。确保你下载了mingw-w64-bin_i686-mingw_<something>.zip
,而不是Linux版本。您将MinGW安装(c:\MinGW
)的顶部解压缩包,就是这样。
- 第三种方法是从以下网址下载并安装MSYS2:
https://msys2.github.io/
当您按照说明操作时,还需要安装以下软件包:autoconf,make,perl和tar。您可以通过在msys控制台中运行以下命令来执行此操作:pacman -S msys / autoconf msys / make msys / perl msys / tar您还需要一个gcc。如果你安装了你运行的64位MSYS2:mingw64 / mingw-w64-x86_64-gcc和32位MSYS2:pacman -S mingw32 / mingw-w64-i686-gcc pacman -S mingw-w64-i686-editrights - Visual Studio 2013(Visual Studio 12.0)。从以下网址下载并运行Web安装程序:https: //www.visualstudio.com/
- 微软Windows SDK版本8.1(对应于VC ++ 12.0和Visual Studio 2013)。你可以在这里找到它:URL:
https://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx
- 为了帮助设置环境,有一个bat文件
%PROGRAMFILES%\Mirosoft Visual Studio 12.0\VC\vcvarsall.bat
,它是Windows命令提示符的适当环境。这不适用于bash,所以你需要通过编辑你的脚本来将它转换成bash风格的环境.bash_profile
。在我的情况下,SDK安装在默认目录中并且%PROGRAMFILES%
是C:\Program Files
,用于设置32位编译环境(在64位或32位机器上)的命令如下所示(在Cygwin中):一些常用路径C_DRV = / cygdrive / c PRG_FLS = $ C_DRV / Program \ Files#nsis NSIS_BIN = $ PRG_FLS / NSIS#java JAVA_BIN = $ PROGRAMFILES / Java / jdk1.7.0_02 / bin ## ## MS SDK ## CYGWIN = nowinsymlinks VISUAL_STUDIO_ROOT = $ PRG_FLS / Microsoft \ Visual \ Studio \ 12.0 WIN_VISUAL_STUDIO_ROOT =“C:\ Program Files \ Microsoft Visual Studio 12.0“SDK = $ PRG_FLS / Windows \ Kits / 8.1 WIN_SDK =”C:\ Program Files \ Windows Kits \ 8.1“PATH =”$ NSIS_BIN:\ $ VISUAL_STUDIO_ROOT / VC / bin:\ $ VISUAL_STUDIO_ROOT / VC / vcpackages:\ $ VISUAL_STUDIO_ROOT / Common7 / IDE:\ $ VISUAL_STUDIO_ROOT / Common7 / Tools:\ $ SDK / bin / x86 / usr / local / bin:/ usr / bin:/ bin:\ / cygdrive / c / WINDOWS / system32:/ cygdrive / c / WINDOWS:\ / cygdrive / c / WINDOWS / system32 / Wbem:\ $ JAVA_BIN“LIBPATH =”$ WIN_VISUAL_STUDIO_ROOT \ VC \ lib“LIB =”$ WIN_VISUAL_STUDIO_ROOT \ VC \ lib \; $ WIN_SDK \ lib \ winv6.3 \ um \ x86“INCLUDE =”$ WIN_VISUAL_STUDIO_ROOT \ VC \ include \; $ WIN_SDK \ include \ shared \ \ $ WIN_SDK \ include \ um; $ WIN_SDK \ include \ winrt \; $ WIN_SDK \ include \ um \ gl“export CYGWIN PATH LIBPATH LIB INCLUDEI如果您使用的是MinGW的MSYS,则需要更改C_DRV
设置,它将显示为:C_DRV = / c,并且还需要将PATH环境变量更改为:MINGW_BIN = / c / MinGW / bin PATH =“$ NSIS_BIN:\ $ VISUAL_STUDIO_ROOT / VC / bin:\ $ VISUAL_STUDIO_ROOT / VC / vcpackages:\ $ VISUAL_STUDIO_ROOT / Common7 / IDE:\ $ VISUAL_STUDIO_ROOT / Common7 / Tools:\ $ SDK / bin / x86:/ usr / local / bin:\ $ MINGW_BIN:\ / bin:/ c / Windows / system32:/ c / Windows:\ / c / Windows / System32 / Wbem:\ $ JAVA_BIN“对于MSYS2,您使用与C_DRV
MSYS 相同的PATH,只更新MINGW_BIN
:MINGW_BIN = / mingw32 / bin如果你正在构建一个64位版本的Erlang,你应该设置PATH等等。我们有两个模板可以在Cygwin和MSYS中使用,但需要进行编辑才能使用MSYS2(请参阅脚本中的注释)。以下是32位:make_winpath(){P = $ 1,如果“$ IN_CYGWIN”=“true”; 然后cygpath -d“$ P”else(cd“$ P”&& / bin / cmd // C“for%i in(”。“)do @echo%?fsi”)fi} make_upath(){P = $ 1如果“$ IN_CYGWIN”=“true”; 然后cygpath“$ P”else回显“$ P”| / bin / sed's,^(a-zA-Z):\,/ \ L \ 1 / ,; s,\,/,g'fi}#一些常用路径如果-x / usr / bin / msys- ?.0.dll; 那么#没有这个路径转换赢' \ $ SDK / bin / x86 ## Microsoft SDK库LIBPATH = $ WIN_VISUAL_STUDIO_ROOT \ VC \ lib \ amd64 LIB = $ WIN_VISUAL_STUDIO_ROOT \ VC \ lib \ amd64 \; \ $ WIN_KITS \ lib \ winv6.3 \ um \ x64 INCLUDE = $ WIN_VISUAL_STUDIO_ROOT \ VC \ include \; \ $ WIN_KITS \ include \ shared \; $ WIN_KITS \ include \ um; \ $ WIN_KITS \ include \ winrt \; $ WIN_KITS \ include \ um \ gl#将nsis,c编译器和java放入路径导出PATH = $ VCPATH:$ PATH:$ JAVA_BIN:$ NSIS_BIN#确保LIB和INCLUDE可用于其他导出LIBPATH LIB INCLUDEM一定要设置PATH,以便在MSYS / Cygwin工具和Java之前找到NSIS和Microsoft SDK是PATH中的最后一个。创建一个简单的hello world,并尝试用它编译它 \ $ WIN_KITS \ include \ shared \; $ WIN_KITS \ include \ um; \ $ WIN_KITS \ include \ winrt \; $ WIN_KITS \ include \ um \ gl#在路径导出中放入nsis,c编译器和java PATH = $ VCPATH:$ PATH:$ JAVA_BIN:$ NSIS_BIN#确保LIB和INCLUDE可用于其他导出LIBPATH LIB INCLUDEM一定要设置PATH,以便在MSYS / Cygwin工具之前找到NSIS和Microsoft SDK,并且Java在PATH中最后一个。创建一个简单的hello world,并尝试用它编译它 \ $ WIN_KITS \ include \ shared \; $ WIN_KITS \ include \ um; \ $ WIN_KITS \ include \ winrt \; $ WIN_KITS \ include \ um \ gl#在路径导出中放入nsis,c编译器和java PATH = $ VCPATH:$ PATH:$ JAVA_BIN:$ NSIS_BIN#确保LIB和INCLUDE可用于其他导出LIBPATH LIB INCLUDEM一定要设置PATH,以便在MSYS / Cygwin工具之前找到NSIS和Microsoft SDK,并且Java在PATH中最后一个。创建一个简单的hello world,并尝试用它编译它cl
来自bash内的命令。如果这不起作用,您的环境需要修复。请记住,Cygwin bash中的路径环境变量中不应该有反斜杠,但LIB和INCLUDE应包含带分号,驱动器号和反斜杠的Windows样式路径。 - Sun的Java JDK 1.6.0或更高版本。我们的Java代码(jinterface,ic)是为JDK 1.6.0编写的。获取它的Windows并安装它,JRE是不够的。如果你不关心Java,你可以跳过这一步。结果将是jinterface没有建立。URL:在bash中将
http://java.sun.com
javac LAST添加到您的路径环境中,在我的情况下,这意味着:PATH="$PATH:/cygdrive/c/Program Files/Java/jdk1.7.0\_02/bin"
不需要CLASSPATH
或任何东西。键入javac
在bash提示符下,你应该得到可用的Java选项的列表。确保,例如通过输入type java
,使用您安装的Java。但请注意使用Cygwin's / MinGW's / MSYS2'sjar.exe
。这就是为什么JDK bin目录应该被添加到最后PATH
。 - Nullsoft NSIS安装程序系统。您需要这个来构建自我安装包。这是一个免费的开源安装程序,比商业智能和安装屏蔽安装程序更好用。这是我们用于商业发布的安装程序。URL:
http://nsis.sourceforge.net/download
安装地段,特别是现代用户界面组件,因为它绝对需要。放入makensis
你的路径,在我的情况:PATH = / cygdrive / c / Program \ Files / NSIS:$ PATH在bash提示符下输入makensis,如果一切正常,你应该得到一个选项列表。 - OpenSSL的。这是如果你想SSL和加密应用程序编译(和运行)。有预构建的二进制文件,你可以在这里下载和安装:URL:
http://openssl.org/community/binaries.html
我们建议使用1.0.2d。 - 用wxWidgets构建。下载wxWidgets-3.0.3或更高版本。安装或解压缩到pgm文件夹:Cygwin:
DRIVE:/PATH/cygwin/opt/local/pgm
MSYS:DRIVE:/PATH/MinGW/msys/1.0/opt/local/pgm
MSYS2:DRIVE:/PATH/msys<32/64>/opt/local/pgm
如果wxUSE_POSTSCRIPT
未启用<path\to\pgm>\wxMSW-3.0.3\include\wx\msw\setup.h
,启用它。build:从命令提示符下使用可用的VC工具(请参阅上面关于OpenSSL构建的说明,帮助您在RELEASE模式下启动适当的命令提示符):C:...> cd <path \ to \ pgm> \ wxMSW-3.0 .3 \ build \ msw C:...> nmake BUILD = release SHARED = 0 DIR_SUFFIX_CPU = -f makefile.vc或者 - 如果构建64位版本:C:...> cd <path \ to \ pgm> \ wxMSW -3.0.3 \ build \ msw C:...> nmake TARGET_CPU = amd64 BUILD = release SHARED = 0 DIR_SUFFIX_CPU = -f makefile.vc - 获取Erlang源码分发(从
http://www.erlang.org/download.html
)。与Unix平台相同。最好使用Cygwin,MSYS或MSYS2中的tar来解压源tar.gz(tar zxf otp_src_20.tar.gz
)。将环境设置ERL_TOP
为指向源分配的根目录。比方说,我站在$HOME/src
并解压缩otp_src_20.tar.gz
,然后添加以下内容.profile
:ERL_TOP = $ HOME / src / otp_src_20 export $ ERL_TOP
4.5Shell环境
所以,如果你按照上面的说明,当你启动一个bash shell的时候,你应该有一个包含Windows风格路径的INCLUDE环境,一个LIB环境变量也是Windows风格的,最后是一个PATH,让你可以达到cl,makensis, javac等从命令提示符(使用which cl
等从bash验证)。
您还应该有一个Cygwin风格的ERL_TOP
环境变量,并指向包含脚本的其他文件otp_build
的目录。
需要对环境进行最后的按摩,这是由脚本完成的$ERL_TOP/otp_build
。开始bash并执行以下操作,注意“back-ticks”(`),在某些键盘上可能很难找到,但按空格键后按空格键可能会做到这一点......
$ cd $ERL_TOP
$ eval `./otp_build env_win32`
如果您无法在键盘上制作反标,可以使用ksh变体:
$ cd $ERL_TOP
$ eval $(./otp_build env_win32)
如果您正在构建64位版本,则需要提供otp_build
一个体系结构参数:
$ cd $ERL_TOP
$ eval `./otp_build env_win32 x64`
这应该会对环境产生最后的影响,并且在此之后建筑物应该很容易。你可以运行./otp_build env_win32
而不eval
只是看看它做了什么,并看到它设置的环境似乎没问题。如果可能的话(使用DOS风格的短名称代替)的路径被清除的空间,变量OVERRIDE_TARGET
,CC
,CXX
,AR
和RANLIB
被设置为各自的包装和目录$ERL_TOP/erts/etc/win32/<cygwin/msys>_tools/vc
,并$ERL_TOP/erts/etc/win32/<cygwin/msys>_tool
在PATH中先加入。
现在你可以通过type erlc
在你的shell中写入来检查你有哪些erlc 。它应该驻留在$ERL_TOP/erts/etc/win32/cygwin_tools
或$ERL_TOP/erts/etc/win32/msys_tools
。
4.6建立和安装
建筑使用otp_build
脚本最简单:
$ ./otp_build autoconf # Ignore the warning blob about versions of autoconf
$ ./otp_build configure <optional configure options>
$ ./otp_build boot -a
$ ./otp_build release -a <installation directory>
$ ./otp_build installer_win32 <installation directory> # optional
现在你将有一个文件叫otp_win32_20.exe
或otp_win64_20.exe
在<installation directory>
,即$ERL_TOP/release/win32
。
让我们进入更多的细节:
$ ./otp_build autoconf
- 此步骤重新构建配置脚本以在您的环境中正常工作。在一个理想的世界中,这不是必需的,但可惜的是,多年来我们的分布式配置脚本(在Linux平台上生成)与Cygwin / MSYS / MSYS2环境之间遇到了几个不兼容的问题。在Cygwin / MSYS / MSYS2中运行autoconf可确保以兼容的方式生成配置脚本,并在下一步中运行良好。$ ./otp_build configure
- 这将运行新生成的配置脚本,其中的选项使配置运行良好。目标机器的类型很简单win32
,所以很多配置脚本都会识别这个笨拙的目标名称并相应地运行。CC变量也使编译器成为cc.sh
包装MSVC ++ 的编译器,因此所有关于C编译器的配置测试都可以运行正确的编译器。Windows上不需要很多测试,但我们认为最好是运行整个配置。$ ./otp_build boot -a
- 它使用bootstrap目录(与源一起提供$ERL_TOP/bootstrap
)构建完整的OTP系统。完成此操作后,可以从源代码树中运行erl; 只需键入$ERL_TOP/bin/erl
,你就会有提示。$ ./otp_build release -a
- 从源码树构建商业版本树。默认是放入$ERL_TOP/release/win32
。你可以给任何目录作为参数(Cygwin风格),但是如果你打算构建一个自解压安装程序也没关系。$ ./otp_build installer_win32
- 创建自解压安装程序可执行文件。可执行文件otp_win32_20.exe
或otp_win64_20.exe
将被放置在上一步创建的版本的顶层目录中。如果没有指定发布目录,则预计该发布版本已经构建$ERL_TOP/release/win32
,这也将是安装程序可执行文件的放置位置。如果您为发行版(ie./otp_build release -a /tmp/erl_release
)指定了其他目录,则需要在此给出相同的参数(即./otp_build installer_win32 /tmp/erl_release
)。你需要有一个完整的NSIS安装和makensis.exe
在你的这条路上工作。一旦你创建了安装程序,你可以运行它来以常规方式安装Erlang / OTP,只需运行可执行文件并按照安装向导中的步骤操作即可。要在安装中没有任何问题地获得所有默认设置,可以使用参数/S
(大写S)运行可执行文件,如下所示:$ cd $ ERL_TOP $ release / win32 / otp_win32_20 / S ...或$ cd $ ERL_TOP $ release / win32 / otp_win64_20 / S ...一段时间后Erlang / OTP-20将被安装在C:\Program Files\erl9.1\
菜单中的快捷方式等。
4.7发展
系统建成后,您可能需要更改它。在一些不错的目录中有一个测试版本可能会很有用,但你也可以在源码树中运行Erlang。目标local_setup
,使程序$ERL_TOP/bin/erl.exe
可用,它也使用源树中的所有OTP库。
如果你破解了这个模拟器,你可以通过站起$ERL_TOP/erts/emulator
来做一个简单的构建模拟器可执行文件
$ make opt
请注意,(cd $ERL_TOP && eval `./otp_build env_win32`)
在Windows上构建任何内容之前,您需要在特定的shell中运行。做完选择后,您可以通过运行测试您的结果$ERL_TOP/bin/erl
。如果你想将结果复制到释放目录(比如说/tmp/erl_release
),你可以这样做(仍在$ERL_TOP/erts/emulator
)
$ make TESTROOT=/tmp/erl_release release
这将复制模拟器可执行文件。
要进行仿真器的调试构建,您需要重新编译beam.dll
(实际运行时系统)和erlexec.dll
。这样做
$ cd $ERL_TOP
$ rm bin/win32/erlexec.dll
$ cd erts/emulator
$ make debug
$ cd ../etc
$ make debug
有时
$ cd $ERL_TOP
$ make local_setup
所以,现在当你运行时$ERL_TOP/erl.exe
,你应该有一个调试编译模拟器,你会看到如果你做一个:
1> erlang:system_info(system_version).
在erlang shell中。如果返回的字符串包含[debug]
,你有一个调试编译模拟器。
要破解erlang库,只需make opt
在特定的“应用程序”目录中执行一下,如:
$ cd $ERL_TOP/lib/stdlib
$ make opt
甚至在源目录中...
$ cd $ERL_TOP/lib/stdlib/src
$ make opt
请注意,当你这样做时,你需要在你的路上有一个新的Erlang,最好是你在前面的步骤中建立的普通20。在重建特定库之前$ERL_TOP/bootstrap/bin
,您还可以添加到您的PATH
。这会给你一个足够好的Erlang系统来编译任何OTP erlang代码。正确设置路径有点棘手。你还需要有$ERL_TOP/erts/etc/win32/cygwin_tools/vc
与$ERL_TOP/erts/etc/win32/cygwin_tools
之前的路径实际模拟器。使用引导编译器的路径的典型设置是:
$ export PATH=$ERL_TOP/erts/etc/win32/cygwin_tools/vc\
:$ERL_TOP/erts/etc/win32/cygwin_tools:$ERL_TOP/bootstrap/bin:$PATH
这应该可以重建任何库而没有麻烦...
如果您想将新建的库(应用程序)复制到发布区,则您喜欢使用模拟器:
$ cd $ERL_TOP/lib/stdlib
$ make TESTROOT=/tmp/erlang_release release
请记住:
- 特定于Windows的C代码进入
$ERL_TOP/erts/emulator/sys/win32
,$ERL_TOP/erts/emulator/drivers/win32
或$ERL_TOP/erts/etc/win32
。 - 应该有条件地使用Windows特定的erlang代码,并在运行时测试主机操作系统,为每个平台分配完全相同的波束文件!所以编写如下代码:case {os:type(){win32,_} - > do_windows_specific(); 其他 - > do_fallback_or_exit()结束,
这基本上就是你需要的一切。
4.8使用GIT
您可能想要查看GitHUB的源代码版本。这可以直接在Cygwin中进行,但不能在MSYS中进行。有一个项目MsysGIT:
这是一个不错的Git端口。从MsysGIT获得的msys提示符与MinGW的完整版本不兼容,因此您需要使用MsysGIT的命令提示符检出文件,然后切换到用于构建的常见MSYS命令提示符。由于MsysGIT / MSYS不处理符号链接,所以也不能构建所有测试套件。
本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com