b.liu | e958203 | 2025-04-17 19:18:16 +0800 | [diff] [blame^] | 1 | # This makefile simplifies perl module builds. |
| 2 | # |
| 3 | |
| 4 | ifeq ($(origin PERL_INCLUDE_DIR),undefined) |
| 5 | PERL_INCLUDE_DIR:=$(dir $(lastword $(MAKEFILE_LIST))) |
| 6 | endif |
| 7 | |
| 8 | include $(PERL_INCLUDE_DIR)/perlver.mk |
| 9 | |
| 10 | ifneq ($(PKG_NAME),perl) |
| 11 | PKG_VERSION:=$(PKG_VERSION)+perl$(PERL_VERSION2) |
| 12 | endif |
| 13 | |
| 14 | PERL_VERSION:=$(PERL_VERSION2) |
| 15 | |
| 16 | # Build environment |
| 17 | HOST_PERL_PREFIX:=$(STAGING_DIR_HOSTPKG)/usr |
| 18 | ifneq ($(CONFIG_USE_GLIBC),) |
| 19 | EXTRA_LIBS:=bsd |
| 20 | EXTRA_LIBDIRS:=$(STAGING_DIR)/lib |
| 21 | endif |
| 22 | PERL_CMD:=$(STAGING_DIR_HOSTPKG)/usr/bin/perl$(PERL_VERSION3) |
| 23 | |
| 24 | MOD_CFLAGS_PERL:=-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 $(TARGET_CFLAGS) $(TARGET_CPPFLAGS) |
| 25 | ifdef CONFIG_PERL_THREADS |
| 26 | MOD_CFLAGS_PERL+= -D_REENTRANT -D_GNU_SOURCE |
| 27 | endif |
| 28 | |
| 29 | # Module install prefix |
| 30 | PERL_SITELIB:=/usr/lib/perl5/$(PERL_VERSION) |
| 31 | PERL_TESTSDIR:=/usr/share/perl/perl-tests |
| 32 | PERLBASE_TESTSDIR:=/usr/share/perl/perlbase-tests |
| 33 | PERLMOD_TESTSDIR:=/usr/share/perl/perlmod-tests |
| 34 | |
| 35 | FLOCK:=$(STAGING_DIR_HOST)/bin/flock |
| 36 | |
| 37 | define 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 |
| 44 | endef |
| 45 | |
| 46 | define 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; |
| 54 | endef |
| 55 | |
| 56 | define 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 |
| 63 | endef |
| 64 | |
| 65 | define 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)) |
| 73 | endef |
| 74 | |
| 75 | define 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 |
| 129 | endef |
| 130 | |
| 131 | define 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 |
| 139 | endef |
| 140 | |
| 141 | define 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) |
| 152 | endef |
| 153 | |
| 154 | |
| 155 | define 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' |
| 163 | endef |
| 164 | |
| 165 | define 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)))) |
| 169 | endef |
| 170 | |
| 171 | # You probably don't want to use this directly. Look at perlmod/InstallTests |
| 172 | define 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)) |
| 181 | endef |
| 182 | |
| 183 | define perlmod/InstallBaseTests |
| 184 | $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),,$(2))) |
| 185 | endef |
| 186 | |
| 187 | define perlmod/InstallTests |
| 188 | $(if $(CONFIG_PERL_TESTS),$(call perlmod/_InstallTests,$(1)$(PERL_TESTSDIR),$(2),$(3))) |
| 189 | endef |