blob: 5a91c23a5a473120bc279d696b85fc0c107374ce [file] [log] [blame]
b.liue9582032025-04-17 19:18:16 +08001# This makefile simplifies perl module builds.
2#
3
4ifeq ($(origin PERL_INCLUDE_DIR),undefined)
5 PERL_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
6endif
7
8include $(PERL_INCLUDE_DIR)/perlver.mk
9
10ifneq ($(PKG_NAME),perl)
11 PKG_VERSION:=$(PKG_VERSION)+perl$(PERL_VERSION2)
12endif
13
14PERL_VERSION:=$(PERL_VERSION2)
15
16# Build environment
17HOST_PERL_PREFIX:=$(STAGING_DIR_HOSTPKG)/usr
18ifneq ($(CONFIG_USE_GLIBC),)
19 EXTRA_LIBS:=bsd
20 EXTRA_LIBDIRS:=$(STAGING_DIR)/lib
21endif
22PERL_CMD:=$(STAGING_DIR_HOSTPKG)/usr/bin/perl$(PERL_VERSION3)
23
24MOD_CFLAGS_PERL:=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(TARGET_CFLAGS) $(TARGET_CPPFLAGS)
25ifdef CONFIG_PERL_THREADS
26 MOD_CFLAGS_PERL+= -D_REENTRANT -D_GNU_SOURCE
27endif
28
29# Module install prefix
30PERL_SITELIB:=/usr/lib/perl5/$(PERL_VERSION)
31PERL_TESTSDIR:=/usr/share/perl/perl-tests
32PERLBASE_TESTSDIR:=/usr/share/perl/perlbase-tests
33PERLMOD_TESTSDIR:=/usr/share/perl/perlmod-tests
34
35FLOCK:=$(STAGING_DIR_HOST)/bin/flock
36
37define perlmod/host/relink
38 rm -f $(1)/Makefile.aperl
39 ($(FLOCK) -w 900 9 || { echo perlmod/host/relink: failed to acquire lock; exit 1; }; \
40 $(MAKE) -C $(1) perl && \
41 $(INSTALL_BIN) $(1)/perl $(PERL_CMD) && \
42 $(INSTALL_BIN) $(1)/perl $(STAGING_DIR_HOSTPKG)/usr/bin/perl \
43 ) 9> $(TMP_DIR)/.perlmod-perl.flock
44endef
45
46define perlmod/host/Configure
47 (cd $(HOST_BUILD_DIR); \
48 $(FLOCK) -s -w 300 9 || { echo perlmod/host/Configure: failed to acquire lock; exit 1; }; \
49 PERL_MM_USE_DEFAULT=1 \
50 $(2) \
51 $(PERL_CMD) Makefile.PL \
52 $(1) \
53 ) 9> $(TMP_DIR)/.perlmod-perl.flock;
54endef
55
56define perlmod/host/Compile
57 ($(FLOCK) -s -w 300 9 || { echo perlmod/host/Compile: failed to acquire lock; exit 1; }; \
58 $(2) \
59 $(MAKE) -C $(HOST_BUILD_DIR) \
60 $(1) \
61 install \
62 ) 9> $(TMP_DIR)/.perlmod-perl.flock
63endef
64
65define perlmod/host/Install
66 ($(FLOCK) -s -w 300 9 || { echo perlmod/host/Install: failed to acquire lock; exit 1; }; \
67 $(2) \
68 $(MAKE) -C $(HOST_BUILD_DIR) \
69 $(1) \
70 install \
71 ) 9> $(TMP_DIR)/.perlmod-perl.flock
72 $(call perlmod/host/relink,$(HOST_BUILD_DIR))
73endef
74
75define perlmod/Configure
76 (cd $(if $(3),$(3),$(PKG_BUILD_DIR)); \
77 $(FLOCK) -s -w 300 9 || { echo perlmod/Configure: failed to acquire lock; exit 1; }; \
78 (echo -e 'use Config;\n\n$$$${tied %Config::Config}{cpprun}="$(GNU_TARGET_NAME)-cpp -E";\n' ; cat Makefile.PL) | \
79 PERL_MM_USE_DEFAULT=1 \
80 $(2) \
81 $(PERL_CMD) -I. -- - \
82 $(1) \
83 AR=ar \
84 CC=$(GNU_TARGET_NAME)-gcc \
85 CCFLAGS="$(MOD_CFLAGS_PERL)" \
86 CCCDLFLAGS=-fPIC \
87 CCDLFLAGS=-Wl,-E \
88 DLEXT=so \
89 DLSRC=dl_dlopen.xs \
90 EXE_EXT=" " \
91 FULL_AR=$(GNU_TARGET_NAME)-ar \
92 LD=$(GNU_TARGET_NAME)-gcc \
93 LDDLFLAGS="-shared -rdynamic $(TARGET_LDFLAGS)" \
94 LDFLAGS="$(EXTRA_LIBDIRS:%=-L%) $(EXTRA_LIBS:%=-l%) " \
95 LIBC=" " \
96 LIB_EXT=.a \
97 OBJ_EXT=.o \
98 OSNAME=linux \
99 OSVERS=2.4.30 \
100 RANLIB=: \
101 SITELIBEXP=" " \
102 SITEARCHEXP=" " \
103 SO=so \
104 VENDORARCHEXP=" " \
105 VENDORLIBEXP=" " \
106 SITEPREFIX=/usr \
107 INSTALLPRIVLIB=$(PERL_SITELIB) \
108 INSTALLSITELIB=$(PERL_SITELIB) \
109 INSTALLVENDORLIB=" " \
110 INSTALLARCHLIB=$(PERL_SITELIB) \
111 INSTALLSITEARCH=$(PERL_SITELIB) \
112 INSTALLVENDORARCH=" " \
113 INSTALLBIN=/usr/bin \
114 INSTALLSITEBIN=/usr/bin \
115 INSTALLVENDORBIN=" " \
116 INSTALLSCRIPT=/usr/bin \
117 INSTALLSITESCRIPT=/usr/bin \
118 INSTALLVENDORSCRIPT=" " \
119 INSTALLMAN1DIR=/usr/man/man1 \
120 INSTALLSITEMAN1DIR=/usr/man/man1 \
121 INSTALLVENDORMAN1DIR=" " \
122 INSTALLMAN3DIR=/usr/man/man3 \
123 INSTALLSITEMAN3DIR=/usr/man/man3 \
124 INSTALLVENDORMAN3DIR=" " \
125 LINKTYPE=dynamic \
126 DESTDIR=$(PKG_INSTALL_DIR) \
127 ) 9> $(TMP_DIR)/.perlmod-perl.flock
128 sed -i -e 's!^PERL_INC = .*!PERL_INC = $(STAGING_DIR)/usr/lib/perl5/$(PERL_VERSION)/CORE/!' $(if $(3),$(3),$(PKG_BUILD_DIR))/Makefile
129endef
130
131define perlmod/Compile
132 ($(FLOCK) -s -w 300 9 || { echo perlmod/Compile: failed to acquire lock; exit 1; }; \
133 PERL5LIB=$(PERL_LIB) \
134 $(2) \
135 $(MAKE) -C $(if $(3),$(3),$(PKG_BUILD_DIR)) \
136 $(1) \
137 install \
138 ) 9> $(TMP_DIR)/.perlmod-perl.flock
139endef
140
141define perlmod/Install/NoStrip
142 $(INSTALL_DIR) $(strip $(1))$(PERL_SITELIB)
143 (cd $(PKG_INSTALL_DIR)$(PERL_SITELIB) && \
144 rsync --relative -rlHp --itemize-changes \
145 --exclude=\*.pod \
146 --exclude=.packlist \
147 $(addprefix --exclude=/,$(strip $(3))) \
148 --prune-empty-dirs \
149 $(strip $(2)) $(strip $(1))$(PERL_SITELIB))
150
151 chmod -R u+w $(strip $(1))$(PERL_SITELIB)
152endef
153
154
155define perlmod/_DoStrip
156 @echo "---> Stripping modules in: $(strip $(1))$(PERL_SITELIB)"
157 find $(strip $(1))$(PERL_SITELIB) -name \*.pm -or -name \*.pl | \
158 xargs -r sed -i \
159 -e '/^=\(head\|pod\|item\|over\|back\|encoding\|begin\|end\|for\)/,/^=cut/d' \
160 -e '/^=\(head\|pod\|item\|over\|back\|encoding\|begin\|end\|for\)/,$$$$d' \
161 -e '/^#$$$$/d' \
162 -e '/^#[^!"'"'"']/d'
163endef
164
165define perlmod/Install
166 $(call perlmod/Install/NoStrip,$(1),$(2),$(3))
167
168 $(if $(CONFIG_PERL_NOCOMMENT),$(if $(PKG_LEAVE_COMMENTS),,$(call perlmod/_DoStrip,$(1),$(2),$(3))))
169endef
170
171# You probably don't want to use this directly. Look at perlmod/InstallTests
172define perlmod/_InstallTests
173 $(INSTALL_DIR) $(strip $(1))
174 (cd $(PKG_BUILD_DIR)/$(2) && \
175 rsync --relative -rlHp --itemize-changes \
176 --exclude=.packlist \
177 --prune-empty-dirs \
178 $(strip $(3)) $(strip $(1)))
179
180 chmod -R u+w $(strip $(1))
181endef
182
183define perlmod/InstallBaseTests
184 $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),,$(2)))
185endef
186
187define perlmod/InstallTests
188 $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),$(2),$(3)))
189endef