visual-studioperlcmakenmake

Build Perl from Source for Windows 10 using Visual Studio 2017


I was reading this post.

http://www.cpan.org/src/README.html and http://search.cpan.org/~rjbs/perl-5.16.0/README.win32#Building

I extracted the files to: c:\Sources\perl-5.26.0\ Now I want to build it.

I set CCTYPE = MSVC141

Now I run:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2017\Visual Studio Tools\VC\x64 Native Tools Command Prompt for VS 2017

Later:

    C:\Sources\perl-5.26.0>win32\Makefile
    'win32\Makefile' is not recognized as an internal or external command,
    operable program or batch file.

    C:\Sources\perl-5.26.0>nmake -f win32\Makefile

    Microsoft (R) Program Maintenance Utility Version 14.10.25019.0
    Copyright (C) Microsoft Corporation.  All rights reserved.

    NMAKE : fatal error U1073: don't know how to make 'config_H.vc'
    Stop.

    C:\Sources\perl-5.26.0>

With CMAKE:

mkdir c:\Sources\perl-5.26.0\bld
cd /d c:\Sources\perl-5.26.0\bld

cmake . -G "NMake Makefiles" -DCMAKE_INSTALL_PREFIX="c:\Custom\perl" -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=RelWithDebInfo  
CMake Error: The source directory "C:/Sources/perl-5.26.0/bld" does not appear to contain CMakeLists.txt.
Specify --help for usage, or press the help button on the CMake GUI.

c:\Sources\perl-5.26.0\bld>

Sorry I forget to check the existence of: CMakeLists.txt file

Is it possible to build perl instead of obtain downloading from ActivePerl (The installer is not working properly) or Strawberry-perl (the site was down) ?

Please tell me.

How I must define this variables:

MSVCDIR     = ???
CCHOME      = $(MSVCDIR)
CCINCDIR    = $(CCHOME)\include
CCLIBDIR    = $(CCHOME)\lib

My Output.

generate_uudmap.c
        link -out:..\generate_uudmap.exe @C:\Users\...\AppData\Local\Temp\nmFB0B.tmp
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_exit
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fputc
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fopen
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp___acrt_iob_func
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fclose
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp___stdio_common_vfprintf
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp__errno
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_fputs
generate_uudmap.obj : error LNK2001: unresolved external symbol __imp_strerror
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _seh_filter_exe
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_app_type
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __setusermatherr
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _configure_narrow_argv
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _configure_narrow_argv
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initialize_narrow_environment
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _initialize_narrow_environment
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _get_initial_narrow_environment
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initterm
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _initterm_e
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_fmode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p___argc
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p___argv
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _cexit
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _cexit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _c_exit
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _register_thread_local_exe_atexit_callback
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _configthreadlocale
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol _set_new_mode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __p__commode
msvcrt.lib(exe_main.obj) : error LNK2001: unresolved external symbol __C_specific_handler
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol __C_specific_handler
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _seh_filter_dll
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _initialize_onexit_table
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _register_onexit_function
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _execute_onexit_table
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _crt_atexit
msvcrt.lib(utility.obj) : error LNK2001: unresolved external symbol _crt_at_quick_exit
msvcrt.lib(tncleanup.obj) : error LNK2001: unresolved external symbol __std_type_info_destroy_list
msvcrt.lib(utility_desktop.obj) : error LNK2001: unresolved external symbol terminate
msvcrt.lib(utility_desktop.obj) : error LNK2001: unresolved external symbol memset
..\generate_uudmap.exe : fatal error LNK1120: 38 unresolved externals
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.10.25017\bin\HostX64\x64\link.EXE"' : return code '0x460'
Stop.

c:\Sources\perl-5.26.0\win32>

Solution

  • win32/Makefile does not officially have support for building with Visual Studio 2017. But, it does have support for building with VS 2015. The reason building with Visual Studio 2015 tools require a separate configuration than with building with Visual Studio 2013 tools is the same for Visual Studio 2017 tools, so you can use the same configuration.

    To do so:

    Note that perls built with Visual Studio 2015 and 2017 may end up being rather useless because they link with the new platform runtime which OpenSSL does not work with. I think this means you are not going to be able to use modules such as LWP, HTTP::Tiny etc with https. I haven't investigated this a lot, so if I am wrong, I would love to be corrected.

    Note that Visual Studio 2013 tools are also installed when you install Visual Studio 2017, so if you can live with certain bugs and the fact that Perl's build config for VS 2013 by default ignores the C99 features included in VS 2013, or if you are willing to hand-edit config files, I have found building with that to be more reliable.

    In general, you are better off using Strawberry Perl. Using the MinGW toolchain saves a lot of time if you want to use modules that depend on C libraries.