Форум программистов, компьютерный форум, киберфорум
Наши страницы
ft4l
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

собрал x32 httpd2.5 :) с msys2 + mingw-w64

Запись от ft4l размещена 06.06.2019 в 19:55
Обновил(-а) ft4l 12.06.2019 в 23:09 (Добавил patches2.zip)

Было желание собрать себе Apache httpd, как можно легче,
без всякого там SSL и IPv6 ...
Сразу скажу что собрал не совсем стандартными средствами,
, или даже слегка их ушатавши , примерно в таком порядке
Ставил msys2 32-бит (ось Вин7 х64)
http://www.msys2.org/
там есть 2 варианта, оба не для XP

Поставил в C:\msys32 Запустилась консоль, ввёл:
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# -u, --sysupgrade обновить установленные пакеты(-uu разрешает откат версий)
# -y, --refresh        загрузить обновленные базы данных с серверов
#       (-yy принудительно обновить даже если обновленные)
pacman -Syu
# Перезапустил. Качнул пакетов для MSYS
pacman -Su
pacman -S autoconf autoconf-archive autoconf2.13
pacman -S autogen automake-wrapper
pacman -S binutils bison bisonc++ cmake
pacman -S crosstool-ng cvs dos2unix intltool
pacman -S jansson lemon libtool
pacman -S make moreutils
pacman -S patch patchutils p7zip
pacman -S perl-YAML python2 txt2html
pacman -S yasm bzr subversion
# gcc для MSYS не устанавливаю
До этого момента всё выполнялось из терминала запущенного с ярлыка 'MSYS MSYS'
или с щелчка по файлу c:\msys32\msys2.exe или по c:\msys32\msys2_shell.cmd
т.е. промпт выглядело так:
xxx@xx MSYS ~
$
Далее на файл C:\msys\msys2_shell.cmd создаю ярлык
// ПКМ->-Отправить->-"Рабочий стол"
В свойствах ярлыка добавил параметров в поле "Объект"
; получилось это.
C:\msys\msys2_shell.cmd -mingw32 -defterm -no-start
// -mingw32 обязательно. Остальное можно убрать... мне -determ удобнее
промпт будет выглядеть так:
xxx@xx MINGW32 ~
$

Запустил консоль с этого ярлыка, ввёл export -p , увидел разницу...
Попытался качнуть целую кучу пакетов сразу (: не получилось
Оказалось оптимальнее небольшими порциями ....
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
pacman -S -l > ~/pacm.0.txt
notepad pacm.0.txt &
# поставил только этот gcc, тот который для MSYS ( +кросс-компиляторы) не нужен
pacman -S mingw-w64-i686-gcc-objc  
pacman -S mingw-w64-i686-iconv mingw-w64-i686-apr mingw-w64-i686-apr-util
pacman -S mingw-w64-i686-libxslt mingw-w64-i686-diffutils mingw-w64-i686-openssl
pacman -S mingw-w64-i686-openldap mingw-w64-i686-pcre 
pacman -S mingw-w64-i686-curl mingw-w64-i686-bzip2  mingw-w64-i686-libzip
pacman -S mingw-w64-i686-make help2man diffstat pkg-config texinfo patch
pacman -S automake autoconf
pacman -S dos2unix svn bison libtool lemon
# ++ Зависимости, итого штук 60 пакетов
pacman -S -l > ~/pacm.0.txt
notepad pacm.0.txt &

Потом ешё поштучно кучу mingw-w64-i686-....пакетов наставил, названия не помню .)
хотелось более-менее привычный i686-8.1.0-release-win32-dwarf-rt_v6-rev0.7z
откуда-то отсюда: sourceforge.net/projects/mingw-w64/files/
я его и распаковал прямо в / поверх того что установилось в общем полный набор,
//гит не ставил , можно с git-складов тянуть и с svn co
Bash
1
2
3
4
5
7z x -o/ /C/xxx/gcc/i686-8.1.0-release-win32-dwarf-rt_v6-rev0.7z
### gcc version 8.1.0 (i686-win32-dwarf-rev0, Built by MinGW-W64 project)
/mingw32/bin/gcc -v
cp -T /mingw32/bin/mingw32-make.exe /mingw32/bin/make.exe
### для удобства
Ещё оговорюсь, немного ковырял там ко всему файлы ,)
в папке c:\msys32\mingw32\i686-w64-mingw32\include\
можно наверное почти всё посмотреть в прикреплённом файле
см. mingw32w64_gcc8.1_inc.patch
на данный момент такие изменения точно присутствуют.
С этим патчем собирается, без него нет, и потом всегда можно откатить
------------------------------ещё раз скажу что у меня версия i686-8.1.0-release-win32-dwarf-rt_v6-rev0.
Создал на диске C: папку X/ с подпапками
Bash
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
mkdir -p C:/X/lib/pkgconfig C:/X/include C:/X/bin
# можно обратиться и как к /C/X, но С:/X например в конфигах Апача удобнее,
# имхо одно для винды а другое например в $PATH c ::-разделителями лучше выглядит
# делаю себе файл ee , для своих переменных окружения,
cat <<\ZZ > ~/ee
#!sh
# переменные окружения // ------ UTF-8 ----- no BOM
[[ "${PKG_CONFIG_PATH:0:5}" != "C:/X/" ]] && {
    export PATH="/C/X/bin:$PATH" \
      PKG_CONFIG_PATH="/C/X/lib/pkgconfig:$PKG_CONFIG_PATH" \
      LDFLAGS="-s -LC:/X/lib" \
      CFLAGS="-DWINAPI_FAMILY=0x3 -D_WIN32_WINNT=0x0601 -DWINVER=0x0601 \
      -D_WIN32_IE=0x0800 -IC:/X/include -s"
# New APR must be configured with OS >= WIN7
    echo -e "  Переменные среды изменены\n"
    echo "
    CFLAGS=$CFLAGS
    LDFLAGS=$LDFLAGS
    PKG_CONFIG_PATH=$PKG_CONFIG_PATH
    PATH=$PATH
"
} || {
    echo -e "  Переменные среды были изменены ранее!\n"
}
# Нужно вызывать с точкой, например так: . ~/ee
 
ZZ
notepad ~/ee &
#------------------------------------------
.  ee   # c точкой
export -p
Т.е. при запуске ./configure ,оно будет подхватывать эти CFLAGS,
а для многих новых дистов обязательно Вин >= 7, например APR, его надо собирать,
хотя есть другой, в /mingw32 или может два ,)(вроде svn его точно тянуло)
Ставлю APR:
Bash
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
cd ~
svn co https://svn.apache.org/repos/asf/apr/apr/trunk ~/apr
cp -r ~/apr-2 ~/apr # скопировал
rm -rf ~/apr/.svn # удалил лишнее
. ~/ee        # переменные для ./configure // WIN >= 7 для этих apr,httpd
cd ~/apr      # переход
./buildconf   # Будет создан ./configure
# изменять apr.h лучше до того как его создаст configure,
### + немного шурудил по файлам
patch --verbose -p0 -d ~/apr   < /C/xxx/apr200_src.patch
./configure --help
# -------------Выбрал так 
./configure --prefix=C:/X --enable-threads \
 --with-iconv=/mingw32 --with-sqlite3=/mingw32 --with-expat=/mingw32 \
 --without-libxml2 --without-openssl  --disable-ipv6
 
notepad ./build/apr_rules.mk &
#  там строка EXTRA_LIBS=-lshell32 .... добавил -lbcrypt
## возможно трогал что-то ещё но вряд-ли ,)
make
# make check вроде более менее осилило.
make install
# затащил в C:/X/bin c:\msys32\mingw32\bin\libexpat-1.dll и libiconv-2.dl
cd ~
#папку ~/apr пока не удаляю, там осталось то без чего не смог собрать httpd
И так-то я собрал libcurl+curl туда-же в C:/X, со всевозможными опциями потянул ещё кучу dll
Но httpd хочу без openssl, libcurl и libxml2
интересно , но к libexpat-1.dll у httpd не оказалось зависимости
и да , собрал ещё libnghttp2 , там всё просто,
Кликните здесь для просмотра всего текста
# nghttp2
#-------------------------------------------------
Bash
1
2
3
4
5
6
7
8
9
cd ~
wget https://github.com/nghttp2/nghttp2/releases/download/v1.38.0/nghttp2-1.38.0.tar.gz
tar xvf nghttp2-1.38.0.tar.gz
cd ~/nghttp2-1.38.0
./configure  --exec-prefix=C:/X --disable-silent-rules --with-libxml2 \
  --without-boost --enable-lib-only
make 
make install
cd ~
После этого я сравнил как работают /mingw32/bin/dlltool и /usr/bin/dlltool,
первый не понравился, переименовал его. Потом под роаздачу попали libtool .)
Кликните здесь для просмотра всего текста
Кончилось тем что собрал libtool из исходников последнего релиза,
make check пугает )) процентов наверное 30 тестов, но особенно пугает временем тестирования
и всётаки поставил его и в файле c:\X\bin\apr-2-config закомментировал несколько строк и вписал его. Но думаю навернякка должно работать и с этим "$APR_BUILD_DIR/libtool"
Bash
1
2
3
4
5
6
7
8
9
10
    --apr-libtool)
    #if test "$location" = "installed"; then
    #   echo "${installbuilddir}/libtool"
    #else
    #   echo "$APR_BUILD_DIR/libtool"
    #fi
    echo "libtool"
    exit 0
    ;;
    --help)


Вобщем вышло так, что по времени только позже собрал сам httpd:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
# почти аналогично .)
svn co https://svn.apache.org/repos/asf/httpd/httpd/trunk ~/httpd
. ~/ee   # переменные для ./configure // WIN >= VISTA для этих apr,httpd
./buildconf --with-apr=apr-2-config  
# Будет создан ./configure .... apr-2-config в $PATH, или /C/X/bin/apr-2-config
#./configure --help | less
 ./configure --prefix=C:/X --with-apr=C:/X/bin/apr-2-config --with-nghttp2=C:/X \
 --with-pcre=/mingw32 --with-z=/mingw32 --without-libxml2 --with-expat=/mingw32 \
 --without-ssl  --disable-ssl  --enable-mods-shared=all --enable-threads --disable-ipv6 --disable-watchdog
# watchdog не собирается, так и не осилил понять почему
# пришлось ковырять немного исходники, в основном из-за объявления переменных...
patch --verbose -p0 -d ~/httpd-24   < /C/xxx/httpd25_src.patch
И осталось решить что-то с тем что если запустить make будет собран статический
httpd.exe и не одного .dll или .so, набросал такой скрипт, запускается после того
как запускалось ./configure

Perl
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
#!/usr/bin/perl
use strict;
 
my $vars_file = './build/config_vars.mk';
my $rulz_file = './build/rules.mk';
my $serv_make = './server/Makefile';
my $prog_file = './build/program.mk';
#my $conf_file = './include/ap_config_auto.h'; # trouble with server/main.c
 
my $mtime = (stat'./config.log')[9]; # ?? last time of ./configue launch
my @f_chngs =(
    (!-f $vars_file.'.bkp' || (stat $vars_file.'.bkp')[9] < $mtime),
    (!-f $rulz_file.'.bkp' || (stat $rulz_file.'.bkp')[9] < $mtime),
    (!-f $serv_make.'.bkp' || (stat $serv_make.'.bkp')[9] < $mtime),
    (!-f $prog_file.'.bkp'),
#   (!-f $conf_file.'.bkp' || (stat $conf_file.'.bkp')[9] < $mtime),
);
goto BKPS_EXISTS if ( 0 == (grep{$_==1} @f_chngs));
# здесь goto для читабельности отступов при таких длинных строках ,)
# ... и особо стилем написания не заморачивался
print 'Adding copy of '. $vars_file.$/ if ($f_chngs[0]);
print 'Adding copy of '. $rulz_file.$/ if ($f_chngs[1]);
print 'Adding copy of '. $serv_make.$/ if ($f_chngs[2]);
print 'Adding copy of '. $prog_file.$/ if ($f_chngs[3]);
#print 'Adding copy of '. $conf_file.$/ if ($f_chngs[3]);
 
#c:\msys32\home\xxx\httpd-24\modules\arch\win32\mod_win32.c
#c:\msys32\home\xxx\httpd-24\modules\arch\win32\modules.mk
# static = mod_win32.lo
 
if (0==(grep{$_==1} map{(-f $_)}($vars_file,$rulz_file,$prog_file))){
    die 'One or more files are existn`t'.$/
}
#       make them restorable
print `cat $vars_file > $vars_file.bkp 2>&1` if ($f_chngs[0]);
print `cat $rulz_file > $rulz_file.bkp 2>&1` if ($f_chngs[1]);
print `cat $serv_make > $serv_make.bkp 2>&1` if ($f_chngs[2]);
print `cat $prog_file > $prog_file.bkp 2>&1` if ($f_chngs[3]);
 
BKPS_EXISTS:
#Несколько .h win32 файлов ищет в arch/win32, которая в думаю в ~/apr
print `cp -r ../apr/include/arch include/arch 2>&1` unless (-d 'include/arch');
 
print "\tAppling changes ...$/";
my $FH;
 
#---------------------config_vars.mk-----------------------------
my %VARS = ();# definitions
open $FH, '<',$vars_file.'.bkp' || die("\t!!!\tcan`t open < $vars_file.bkp\n$!");
while (<$FH>) { chomp;
    next unless /\s*=\s*/;
    $VARS{$`}=$';
}
close $FH;
# SHLTCFLAGS = -prefer-pic
$VARS{SHLTCFLAGS} = '-prefer-pic -shared -DAP_DECLARE_IMPORT -DAPREQ_DECLARE_IMPORT';
#LTCFLAGS = -prefer-non-pic -static
$VARS{LTCFLAGS} = '-prefer-non-pic -static';
# HTTPD_LDFLAGS = -export-dynamic
# $VARS{HTTPD_LDFLAGS} = ''; # ??
# PICFLAGS =
$VARS{PICFLAGS} = '-DAP_DECLARE_EXPORT -DAPREQ_DECLARE_EXPORT';
# INTERNAL_CPPFLAGS = -DAP_DECLARE_EXPORT -DAPREQ_DECLARE_EXPORT
$VARS{INTERNAL_CPPFLAGS} = '';
#SH_LDFLAGS = 
$VARS{SH_LDFLAGS} = '-no-undefined';
#LTFLAGS = --silent
$VARS{LTFLAGS} = '--verbose';#
$VARS{CORE_IMPLIB} = '$(abs_srcdir)/libhttpd.la';
$VARS{MOD_CFLAGS} = '-DAUTHZ_DBD_DECLARE_EXPORT -DCACHE_DECLARE_EXPORT -DAP_RL_DECLARE_EXPORT -DAP_RL_DECLARE_EXPORT -DPROXY_DECLARE_EXPORT -DDAV_DECLARE_EXPORT -DDBD_DECLARE_EXPORT -DPROXY_DECLARE_EXPORT -DSESSION_DECLARE_EXPORT -DSTATUS_DECLARE_EXPORT';
 
#NEW
$VARS{MOD_CACHE_DISK_LDADD} = 'mod_cache.la';
$VARS{MOD_CACHE_SOCACHE_LDADD} = 'mod_cache.la';
$VARS{MOD_PROXY_CONNECT_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_FTP_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_HTTP_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_FCGI_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_SCGI_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_UWSGI_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_WSTUNNEL_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_AJP_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_BALANCER_LDADD} = 'mod_proxy.la';
$VARS{MOD_PROXY_EXPRESS_LDADD} = 'mod_proxy.la';
$VARS{MOD_SESSION_COOKIE_LDADD} = 'mod_session.la';
$VARS{MOD_SESSION_DBD_LDADD} = 'mod_session.la';
$VARS{MOD_DAV_FS_LDADD} = '../main/mod_dav.la';
$VARS{MOD_DAV_LOCK_LDADD} = '../main/mod_dav.la';
 
open $FH, '>',$vars_file || die("\t!!!\tcan`t open > $vars_file\n$!");
foreach (sort(keys %VARS)) {
    print $FH $_.' = '.$VARS{$_}.$/;
}
close $FH;
print "Changed $vars_file\n";
#--------------------/-config_vars.mk-----------------------------
 
#--------------------'./server/Makefile'-----------------------------
open $FH, '<',$serv_make.'.bkp' || die("\t!!!\tcan`t open < $serv_make.bkp\n$!");
open my $Fout, '>',$serv_make || die("\t!!!\tcan`t open $serv_make\n$!");
while (<$FH>) {
    print $Fout $_;
    last if (/^LTLIBRARY_SOURCES\s*=/);
}
$_ = <$FH>;
$_ =~ s-\bmain\.c\b-buildmark.c ../modules/arch/win32/mod_win32.c-;
print $Fout $_;
print $Fout $_ for (<$FH>);
close $Fout;
close $FH;
print "Changed $serv_make\n";
#--------------------/-'./server/Makefile'-----------------------------
 
#---------------------program.mk-----------------------------
open $FH, '>',$prog_file || die("\t!!!\tcan`t open > $prog_file\n$!");
print $FH $_ for (<main::DATA>);
close $FH;
print "Changed $prog_file\n";
#--------------------/-program.mk-----------------------------
 
__DATA__
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#
# The build environment was provided by Sascha Schumann.
 
PROGRAM_OBJECTS = $(PROGRAM_SOURCES:.c=.lo)
PROGRAM_LDADD = $(PROGRAM_SOURCES:.o=.lo)
 
$(PROGRAM_NAME): lib$(PROGRAM_NAME).la server/buildmark.lo server/main.lo
    $(LIBTOOL) --mode=link $(BASE_CC) -shared -o $@ server/main.o lib$(PROGRAM_NAME).la $(HTTPD_LDFLAGS) $(HTTPD_LIBS) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS)
 
lib$(PROGRAM_NAME).la: $(PROGRAM_DEPENDENCIES) 
    $(LIBTOOL) --mode=link $(BASE_CC) $(SHLTCFLAGS) -o $@ -no-undefined -rpath $(APR_BINDIR)  $(PROGRAM_DEPENDENCIES) $(EXTRA_LIBS) $(AP_LIBS) $(LIBS) $(HTTPD_LIBS)
 
#server/buildmark.lo: server/buildmark.c
 
# так понял что цель httpd: всегда пересобирается,
# зато есть `make shared-build` чтобы после пересобирать только по модулям
Нужно положить в ~/httpd-24 или как онобудет называться, называю его v.pl
и незабываю вызывать его после configure.) Так вроде всё и должно собираться
Bash
1
2
3
4
5
6
7
./v.pl
make
make install
#+ останется скопировать несколько файлов.
cp -t C:/X/bin  ./.libs/libhttpd-0.dll
cp -t C:/X/lib  ./.libs/libhttpd.dll.a
cp -T ./.libs/libhttpd.lai  C:/X/lib/libhttpd.la
раскомментировал LoadModule info_module modules/mod_info.so
и Include conf/extra/httpd-info.conf
// mod_status.so уже было.
Запустил виндовую консоль ввёл например
Windows Batch file
1
2
3
4
5
6
7
8
9
10
cd /D C:\X
bin\httpd -h
bin\httpd -t -D DUMP_RUN_CFG
bin\httpd -t -D DUMP_MODULES 
:: типа всё норм, просто bin\httpd выключается по Ctrl+C 'It`Works' есть
:: ставлю как службу, просит права админа... 
:: Вспоминаю где это ,) Пуск->ВсеПрограммы->Стандартные->Ком.Стр.->ПКМ
cd /D C:\X
bin\httpd -k install
services.msc
:: смотрю там появилось Apache2.x делаю "Запустить" ...Всё закрываю
Ввожу в браузере localhost/server-info .... localhost/server-status
Код:
Server Version: Apache/2.5.1-dev (Win32)
Server Built: Jun 6 2019 10:15:07
Server loaded APR Version: 2.0.0-dev
Compiled with APR Version: 2.0.0-dev
Server loaded PCRE Version: 8.43 2019-02-23
Compiled with PCRE Version: 8.43 2019-02-23
Module Magic Number: 20190312:3
Hostname/port: localhost:80
Timeouts: connection: 60    keep-alive: 5
MPM Name: WinNT
MPM Information: Max Daemons: 64 Threaded: yes Forked: no
Server Architecture: 32-bit
...... На первый взгляд заработало, время покажет ,)если успеет
//UPD забыл загрузить файл... и там не хватает -s , при сборке libhttpd.dll, можно заметно уменьшить размер файла

/// UPD нашёл неровности ,) например если активировать mod_proxy.so и mod_proxy_connect.so то второй пытается искать символы в mod_proxy.dll , относится к модулям которым я добавлял MOD_XXXXX_LDADD, есть вариант копировать переименованные файлы, в /bin наверное.... 4 файла, mod_davб mod_session, mod_proxy, mod_cache.
Должен быть более правильный/удобный способ , но не хочется убивать время на изучение всего этого,
проще переименовать совсем все эти .so в .dll .) более лучший вариант

... Продолжение
В итоге переименовал эти 4 mod_...so в ....dll, пооправил httpd.conf
Дальше страшнее .) стал пытаться больше использовать только mingw-w64
Где-то в процессе заметил что pacman перестал работать ,) грешу на гугл, с их ssl-наворотами ))
... пока не сделал в файле \msys32\etc\pacman.conf
SigLevel = Never
#SigLevel = Required DatabaseOptional
И в процессе поставил поверх того, что у меня было поверх изначального, обновление
mingw-w64-i686-gcc версия 9.1.0-2 ... особо изменений не заметил...
Не считая того что позже почему-то перестали работать wget и svn .) и так пока осталось...

Но не в этом суть ,) Нужен этот mingw32-w64 и patch.exe из /usr/bin
.... собираю себе свой perl, хотя есть возможность просто скачать свежие версии strawberryperl.com/releases.html
.... вместе с идущими в них mingw-w64,плюс сколько-то готовых библиотек и модулей,)
создал бат-файл, в C:/X для использования из стандартной консоли, :
Windows Batch file
1
2
3
4
5
6
7
8
9
@echo off
set path=%~d0\X\bin;%~d0\msys32\mingw32\bin;%WINDIR%\system32;%WINDIR%
:: %~d0\msys32\usr\bin не нужен, т.к. gmake зачем-то пытается юзать /usr/bin/sh вместо cmd
::---------- для Term::ReadKey , не работает без этого 
set COLUMNS=100
set LINES=30
::----------::---- its my defaults ------::----------::----------::----------:
prompt $L$S$P$_$S$S
start  "-- env --" /D %~d0\msys32\home\%USERNAME% cmd /k echo path    %path% &
кликнул мышкой на этом C:/X/env.bat
.... gmake это скопированое mingw32-make.exe, в \msys32\mingw32\bin

Потом просто качал браузером https:// www.cpan.org/src/5.0/perl-5.30.0.tar.gz,
распаковал в \msys32\home\%USERNAME% ,) чем пришлось. Затем надо попасть в perl-5.30.0\win32
Windows Batch file
1
2
3
4
5
6
7
8
9
cd /D C:\msys32\home\xxx\perl-5.30.0\win32
:: изменил GNUmakefile, добавляю своё C:\X + делал .\site\lib вместо .\lib
:: Ставлю туда-же где httpd и прочее, и не хотелось забивать .\lib ,
:: вобщем всё можно посмотреть в патче , не помню менял-ли что-то в config_heavy.pm после всего
\msys32\usr\bin\patch GNUmakefile -i perl.mkfile.patch
:: и оказалось можно было-бы закомментировать ещё DEFAULT_INC_EXCLUDES_DOT := define
gmake
gmake install
copy c:\msys32\mingw32\bin\libstdc++-6.dll /B c:\X\bin
make test выдал porting/manifest.t t:10332 porting/pod_rules.t t:103 porting/regen.t ParseErrors
// будет время если, надо-бы просмотреть


И такое получается в \X\bin:
Кликните здесь для просмотра всего текста
для стандартной консоли например apxs придётся делать .bat-файлом
делал pl2bat \X\bin\apxs, но лучше сделать например такой apxs.bat
Windows Batch file
1
2
3
@echo off
perl -w %~dPn0 %*
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+ пофиксил if (! -f "$apr_config") вместо if (! -x "$apr_config") // ибо windows

C apachectl.bat аналогично ...
Windows Batch file
1
2
3
@echo off
perl -w %~dPn0.pl %*
if %errorlevel% == 9009 echo You do not have Perl in your PATH.
Но т.к. нету lynx и apachectl написан на Shell, типа перевёл на такой apachectl.pl
Perl
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
#!perl
# ....... apachectl.pl 
# httpd must be installed as windows service
use strict;
use HTML::FormatText;
use LWP::UserAgent ();
 
my $ACMD = $ARGV[0];
my $xARGV = join ' ',@ARGV;
my $ERROR=0;
 
# the path to your httpd binary, including options if necessary
my $HTTPD='httpd';# C:/X/bin/httpd
#
# pick up any necessary environment variables
#ненужно
##########if test -f C:/X/bin/envvars; then
##########  . C:/X/bin/envvars
##########fi
 
#########LYNX="lynx -dump"
 
my $STATUSURL="http://127.0.0.1:80/server-status";
######## localhost:80 is 'Bad URL' for LWP::...
sub getStatus {
    # Слишком много пустых строк, не похоже что с HTML::FormatText можно сделать лучше  
    my $ua = LWP::UserAgent->new( protocols_allowed => ['http', 'https'], timeout => 10);
    $ua->env_proxy;
    my $response = $ua->get(shift);
    my $content;
    if ($response->is_success) {
        $content = $response->decoded_content;
    }
    else {
        die $response->status_line;
    }
#   my $param = shift;
#   $param ||= '';
    $content =~ s/process\b.*+/process$\//s if (shift eq 's');
    return HTML::FormatText->format_string(
        $content,
        (leftmargin => 3, rightmargin => 90));
}
 
$xARGV  ||= '-h';
$ACMD   ||= '-h';
 
if (index('|start|stop|restart|graceful|graceful-stop|', "|$ACMD|") >= 0) {
    print `$HTTPD -k $xARGV 2>&1`;
    $ERROR=$?;
}
elsif (index('|startssl|sslstart|start-SSL|', "|$ACMD|") >= 0) {
    print '    The startssl option is no longer supported.
    Please edit httpd.conf to include the SSL configuration settings
    and then use "apachectl start
';
    $ERROR=2;
}
elsif ( $ACMD eq 'configtest') {
    print `$HTTPD -t 2>&1`;
    $ERROR=$?;
}
elsif ( $ACMD eq 'status') {
    print getStatus $STATUSURL, 's';
}
elsif ( $ACMD eq 'fullstatus'){
    print getStatus $STATUSURL, '';
}
else {
    print `$HTTPD $xARGV 2>&1`;
    $ERROR=$?;
}
$ERROR;
слегка много пустых строк с apachectl status, не хочется трогать HTML::FormatText .)
И точно такой-же apr-2-config.bat + например такой apr-2-config.pl

Perl
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
my $APR_MAJOR_VERSION="2";
my $APR_DOTTED_VERSION="2.0.0";
 
my $prefix="C:/X";
 
$CC="gcc";
$CPP="gcc -E";
$SHELL="cmd";
$CPPFLAGS=" -DWIN32 -D__MSVCRT__ -D_LARGEFILE64_SOURCE";
$CFLAGS="";
$LDFLAGS=" -Wl,--enable-auto-import,--subsystem,console -L/mingw32/lib";
$LIBS="-lshell32 -ladvapi32 -lws2_32 -lrpcrt4 -lmswsock -lexpat";
$EXTRA_INCLUDES="-I/mingw32/include";
$SHLIBPATH_VAR="PATH";
$APR_SOURCE_DIR="/home/xxx/apr";
$APR_BUILD_DIR="/home/xxx/apr";
$APR_SO_EXT="lo";
$APR_LIBNAME="apr-${APR_MAJOR_VERSION}";
 
sub show_usage()
{
    print <<EOF
Usage: apr-$APR_MAJOR_VERSION-config [OPTION]
 
Known values for OPTION are:
  --prefix[=DIR]    change prefix to DIR
  --bindir          print location where binaries are installed
  --includedir      print location where headers are installed
  --cc              print C compiler name
  --cpp             print C preprocessor name and any required options
  --cflags          print C compiler flags
  --cppflags        print C preprocessor flags
  --includes        print include information
  --ldflags         print linker flags
  --libs            print additional libraries to link against
  --srcdir          print APR source directory
  --installbuilddir print APR build helper directory
  --link-ld         print link switch(es) for linking to APR
  --link-libtool    print the libtool inputs for linking to APR
  --shlib-path-var  print the name of the shared library path env var
  --apr-la-file     print the path to the .la file, if available
  --apr-so-ext      print the extensions of shared objects on this platform
  --apr-lib-target  print the libtool target information
  --apr-libtool     print the path to APR's libtool
  --version         print the APR's version as a dotted triple
  --help            print this help
 
When linking with libtool, an application should do something like:
  APR_LIBS="\`apr-$APR_MAJOR_VERSION-config --link-libtool --libs\`"
or when linking directly:
  APR_LIBS="\`apr-$APR_MAJOR_VERSION-config --link-ld --libs\`"
 
An application should use the results of --cflags, --cppflags, --includes,
and --ldflags in their build process.
EOF
};
 
if ($ARGV[0] eq ''){
    show_usage;
    exit ;
}
 
my $bindir="/bin";# ${prefix}
my $libdir="/lib";# ${prefix}
my $installbuilddir="/build-${APR_MAJOR_VERSION}";# ${prefix}
my $includedir="/include/apr-${APR_MAJOR_VERSION}";#    ${prefix}
my $LA_FILE="/lib${APR_LIBNAME}.la";#   ${prefix}$libdir
 
 
$flags='';
 
while($ARGV[0] ne '') {
    $_ = $ARGV[0];
    # the prefix.
    if (/--prefix=(.*+)/) {
        $prefix = $1;
    }
    elsif ($_ eq '--apr-lib-target') {
        print "-rpath \$(libdir) \$(OBJECTS)";
        last;
    }
    elsif ($_ eq '--cflags') {
        $flags .= " $CFLAGS";
    }
    elsif ($_ eq '--cppflags') {
        $flags .= " $CPPFLAGS";
    }
    elsif ($_ eq '--libs') {
        $flags .= " $LIBS";
    }
    elsif ($_ eq '--ldflags') {
        $flags .= " $LDFLAGS";
    }
    elsif ($_ eq '--includes') {
        $flags .= " -I${prefix}$includedir $EXTRA_INCLUDES";
    }
    elsif ($_ eq '--link-ld') {
        $flags .= " -L${prefix}$libdir -l${APR_LIBNAME}";
    }
    elsif ($_ eq '--link-libtool') {
        $flags .= "-L${prefix}$libdir -R${prefix}$libdir -l${APR_LIBNAME}";
    }
    elsif ($_ eq '--apr-la-file') {
        $flags .= " ${prefix}${libdir}$LA_FILE";
    }
    elsif ($_ eq '--prefix') {
        print $prefix;
        last;
    }
    elsif ($_ eq '--bindir') {
        print $prefix.$bindir;
        last;
    }
    elsif ($_ eq '--includedir') {
        print $prefix.$includedir;
        last;
    }
    elsif ($_ eq '--installbuilddir') {
        print $prefix.$installbuilddir;
        last;
    }
    elsif ($_ eq '--version') {
        print $APR_DOTTED_VERSION;
        last;
    }
    elsif ($_ eq '--apr-so-ext') {
        print $APR_SO_EXT;
        last;
    }
    elsif ($_ eq '--cc') {
        print $CC;
        last;
    }
    elsif ($_ eq '--cpp') {
        print $CPP;
        last;
    }
    elsif ($_ eq '--help') {
        show_usage;
        last;
    }
    elsif ($_ eq '--apr-libtool') {
        print 'libtool';
        last;
    }
    elsif ($_ eq '--srcdir') {
        print $APR_SOURCE_DIR;
        last;
    }
    elsif ($_ eq '--shlib-path-var') {
        print $SHLIBPATH_VAR;
        last;
    }
    else {
        show_usage;
        last;
    }
    shift;
}
print $flags if ($flags ne '');
0;

Тут не совсем пока решил, стоит-ли изменять возвращаемые apr-2-config значения,
Похоже это используется в основном для сборки httpd, или модулей к нему,
ещё это libtool для всего впаривается...

например вот более-менее простой mod_psgi, при сборке стандартным способом:
Кликните здесь для просмотра всего текста

Bash
1
2
3
4
cd ~/httpd-24/modules/mod_psgi
autoconf ./configure.ac > ./configure
./configure --with-perl=C:/X/bin/perl --with-apxs=apxs \
  --with-apachectl=apachectl --with-prove=prove
должен находиться в исходниках сервера, и libtool выёживается и не хочет собирать .dll,
(не говоря о том что нужны .so) например если не видит -o file.la именно с .la и файлы именно .lo
Собрать без этого намного легче, просто переписал файл Makefile.msc под GCC так:

Код:
MOD_PSGI_VERSION=0.0.1
APACHE_ROOT=c:\X
PERL_ROOT=c:\X
HTTPD_CFLAGS = $(shell apxs -q SHLTCFLAGS) $(shell apxs -q MOD_CFLAGS)
APR_INCDIR = $(shell apxs -q APR_INCLUDEDIR)
PERL_CFLAGS = $(shell perl -MConfig -e "print $$Config{ccflags}")

all : mod_psgi.so

mod_psgi.o : mod_psgi.c ppport.h
	gcc $(PERL_CFLAGS) $(HTTPD_CFLAGS:-prefer-pic=) -I$(APR_INCDIR) -I"$(APACHE_ROOT)/include" \
	 -I$(PERL_ROOT)/site/lib/CORE -DMOD_PSGI_VERSION=\"$(MOD_PSGI_VERSION)\" -c mod_psgi.c

mod_psgi.so : mod_psgi.o
	gcc -mdll -o mod_psgi.so -Wl,-s,--out-implib=mod_psgi.dll.a mod_psgi.o -L$(APACHE_ROOT)/lib -L$(PERL_ROOT)/site/lib/CORE -lhttpd -lapr-2 -lperl530

ppport.h :
	perl -MDevel::PPPort -e "Devel::PPPort::WriteFile"

clean:
	del /Q ppport.h mod_psgi.o mod_psgi.dll.a mod_psgi.so

install :
	copy mod_psgi.so "$(APACHE_ROOT)/modules/."

# здесь не разбирался, наверное не хватает degin{unshift @INC, '.'} в prove.bat
# или таки надо было собирать perl с этим DEFAULT_INC_EXCLUDES_DOT=undef
test: mod_psgi.so
	prove t

Теперь cpan...
Кликните здесь для просмотра всего текста
, можно просто зайти, выбрать настройки, создастся конфиг в %$APPDATA% или забыл где
Мне как-то было проще поставить первое что попало под руку... назвал my.cpan.conf

Windows Batch file
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
copy my.cpan.conf /B c:\X\site\lib\CPAN\Config.pm
cpan
upgrade CPAN
::перезапуск cpan
q
cpan
:: небольшая проблемка с одним * знаком в Win32::Pipe
get Win32::Pipe
look Win32::Pipe
\msys32\usr\bin\patch Cpipe.cpp < C:/xxx/perl.Win32_Pipe.patch
exit
install Win32::Pipe
install Win32::Console::ANSI
#----------------------------
install Term::ReadKey
install Term::ReadLine::Perl
:: там после теста всяких 2+2*99999 ввёл exit;
:: как сказал раньше, проблема с Term::ReadKey, хоть и проходит тесты
::.... если не устаноить эти COLUMNS и LINES
 
install Log::Log4perl
:: test failed ... несколько модулей ставлю без теста, м.б.кривые тесты
notest install Log::Log4perl
notest install Path::Tiny
:: с Path::Tiny почему-то  /a/b/c/.../x ==/a/x но //a/b/c/.../x должно быть ==/a/b/x
:: м.б. ещё notest install Data::Sah::Coerce
install YAML
install DateTime
install DateTime::Locale
install DateTime::TimeZone
q

...cpan вроде как проверил
Оказалось что никак не могу собрать mod_perl2 ,) не залезая в c:\X\site\lib\ExtUtils
Windows Batch file
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cd c:\X\site\lib\ExtUtils
\msys32\usr\bin\patch -p0 -d . < C:/xxx/perl.ExtUtils.patch
:: пишет read-only; trying to patch anyway , но патчит
:: Теперь надо попасть в каталог к mod_perl2, например так
cpan
get mod_perl2
look mod_perl2
:: или что-то типа cd /d c:\X\site\cpan\build\mod_perl-2.0.10-0
:: .... патч и конфигурирование, из под cpan, типа install cpan, не получится думаю
\msys32\usr\bin\patch -p0 -d . <  C:/xxx/perl.mod_perl2.patch
perl Makefile.PL MP_APR_CONFIG=C:\X\bin\apr-2-config.bat LINKTYPE=dynamic SITEPREFIX=C:/X/site INSTALLSITEBIN=C:/X/bin LIBPERL_A=libperl530.a
:: как я говорил, в PATH не должно быть \msys32\usr\bin
gmake
gmake install
exit
m mod_perl2
q

gmake test запускает сервер на кучу портов, и немного зависнув заканчивается,)
в error_log там чего-то об отсутствии CGI.pm ... ещё не ставил его.

// ......прикрепил patches2.zip с патчами
Дальше не стоит перечислять как открыть в браузере localhost/perl-status,
какими и сколькими способами можно запускать Perl-скрипты из под сервера,
Оно работает,) mod_perl forever
Вложения
Тип файла: zip patches.zip (6.5 Кб, 21 просмотров)
Тип файла: zip patches2.zip (5.5 Кб, 10 просмотров)
Размещено в Без категории
Просмотров 131 Комментарии 1
Всего комментариев 1
Комментарии
  1. Старый комментарий
    Аватар для ft4l
    Оказалось нельзя оставлять длинные комментарии ,) добавил к первой записи
    Запись от ft4l размещена 12.06.2019 в 22:48 ft4l вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru