10Sstevel@tonic-gate# 20Sstevel@tonic-gate# CDDL HEADER START 30Sstevel@tonic-gate# 40Sstevel@tonic-gate# The contents of this file are subject to the terms of the 5580Swesolows# Common Development and Distribution License (the "License"). 6580Swesolows# You may not use this file except in compliance with the License. 70Sstevel@tonic-gate# 80Sstevel@tonic-gate# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 90Sstevel@tonic-gate# or http://www.opensolaris.org/os/licensing. 100Sstevel@tonic-gate# See the License for the specific language governing permissions 110Sstevel@tonic-gate# and limitations under the License. 120Sstevel@tonic-gate# 130Sstevel@tonic-gate# When distributing Covered Code, include this CDDL HEADER in each 140Sstevel@tonic-gate# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 150Sstevel@tonic-gate# If applicable, add the following below this CDDL HEADER, with the 160Sstevel@tonic-gate# fields enclosed by brackets "[]" replaced with your own identifying 170Sstevel@tonic-gate# information: Portions Copyright [yyyy] [name of copyright owner] 180Sstevel@tonic-gate# 190Sstevel@tonic-gate# CDDL HEADER END 200Sstevel@tonic-gate# 21580Swesolows 220Sstevel@tonic-gate# 23*8601SVladimir.Marek@Sun.COM# Copyright 2009 Sun Microsystems, Inc. All rights reserved. 240Sstevel@tonic-gate# Use is subject to license terms. 250Sstevel@tonic-gate# 26580Swesolows 270Sstevel@tonic-gate# 280Sstevel@tonic-gate# The perl5 installation for Solaris differs from that generated by the 290Sstevel@tonic-gate# Perl Configure procedure. The configuration appropriate for the current 300Sstevel@tonic-gate# build is automatically generated from pre-existing configuration files 310Sstevel@tonic-gate# for the build platform. 320Sstevel@tonic-gate# 330Sstevel@tonic-gate 340Sstevel@tonic-gatePROG = perl 350Sstevel@tonic-gate 360Sstevel@tonic-gate# 370Sstevel@tonic-gate# Some of the Makefile.master and Makefile.cmd flags are overridden by 380Sstevel@tonic-gate# ../Makefile.perlcfg which is in turn generated from config.sh by 390Sstevel@tonic-gate# ../extract_config.sh - check there first before overriding anything in this 400Sstevel@tonic-gate# Makefile. 410Sstevel@tonic-gate# 420Sstevel@tonic-gateinclude ../../../Makefile.cmd 430Sstevel@tonic-gateinclude ../Makefile.perlcfg 440Sstevel@tonic-gate 450Sstevel@tonic-gate# DynaLoader is a special extension as it has to be built statically. 460Sstevel@tonic-gateDYNALOADER=lib/auto/DynaLoader/DynaLoader.a 470Sstevel@tonic-gate 480Sstevel@tonic-gate# Uuencoded files that need to have SCCS keyword expansion prevented, see below. 490Sstevel@tonic-gateUUENCODED_FILES = \ 500Sstevel@tonic-gate ext/Storable/t/downgrade.t \ 510Sstevel@tonic-gate lib/CGI/eg/dna_small_gif.uu \ 520Sstevel@tonic-gate lib/CGI/eg/wilogo_gif.uu 530Sstevel@tonic-gate 540Sstevel@tonic-gate# Because autosplit generates a lot of files, we create a dummy timestamp file 550Sstevel@tonic-gate# so that dependency checking can be performed. 560Sstevel@tonic-gateAUTOSPLIT = lib/auto/.tstamp 570Sstevel@tonic-gate 580Sstevel@tonic-gateCLEANFILES = miniperlmain.o perlmain.o opmini.o perlmain.c writemain cflags \ 590Sstevel@tonic-gate ext.libs 600Sstevel@tonic-gate 610Sstevel@tonic-gateCLOBBERFILES = $(MINIPERL) $(PROG) $(PERL_CONFIGDEP) libperl.so lib/re.pm \ 620Sstevel@tonic-gate lib/lib.pm lib/ExtUtils/Miniperl.pm t/perl 630Sstevel@tonic-gateclobber := CLOBBERFILES += CLEANFILES 640Sstevel@tonic-gate 650Sstevel@tonic-gate# Add in the perl-specific flags (including largefile flags). 660Sstevel@tonic-gateCPPFLAGS += $(PERL_COREFLAGS) $(PERL_LFFLAGS) 670Sstevel@tonic-gate 680Sstevel@tonic-gate# Add in the libraries perl needs to be linked against. 690Sstevel@tonic-gateLDLIBS += $(PERL_LDLIBS) 700Sstevel@tonic-gate 71580Swesolows# Compiler replacement rules 721717SwesolowsSED_UN_CC = -e "s!'$(CC) -_gcc=-w!'cc!" 73580SwesolowsSED_UN_CC_E = -e "s!'$(REAL_CC)!'cc!" 74580Swesolows 750Sstevel@tonic-gateall := TARGET = all 760Sstevel@tonic-gateinstall := TARGET = install 770Sstevel@tonic-gateclobber := TARGET = clobber 780Sstevel@tonic-gateclean := TARGET = clean 790Sstevel@tonic-gatetest := TARGET = test 800Sstevel@tonic-gate 810Sstevel@tonic-gateall: get_no_keywords perl extensions utilities 820Sstevel@tonic-gate 830Sstevel@tonic-gate# 840Sstevel@tonic-gate# Some of the files in the perl distribution are uuencoded, or contain uuencoded 850Sstevel@tonic-gate# data. Some of the sequences of uuencoded data look like SCCS keywords, i.e. 860Sstevel@tonic-gate# "%<letter>%", so it is necessary to prevent the keywords from being expanded. 870Sstevel@tonic-gate# The SCCS 'y' flag can be added to the SCCS files to prevent keyword expansion 880Sstevel@tonic-gate# when the file is retrieved. However due to bugs in SCCS and wx we can't 890Sstevel@tonic-gate# always be sure that these flags are propagated correctly. 900Sstevel@tonic-gate# 910Sstevel@tonic-gate 920Sstevel@tonic-gateget_no_keywords: FRC 930Sstevel@tonic-gate @ ../get_no_keywords $(UUENCODED_FILES) 940Sstevel@tonic-gate 950Sstevel@tonic-gate# 960Sstevel@tonic-gate# Expand template files that depend on config.sh. 970Sstevel@tonic-gate# 980Sstevel@tonic-gate 990Sstevel@tonic-gate$(PERL_CONFIG_H): config_h.SH config.sh 1000Sstevel@tonic-gate $(CHMOD) 0555 config_h.SH 1010Sstevel@tonic-gate ./config_h.SH 1020Sstevel@tonic-gate 1030Sstevel@tonic-gateperlmain.c: writemain $(PERL_CONFIG_H) 1040Sstevel@tonic-gate ./writemain $(DYNALOADER) > perlmain.c 1050Sstevel@tonic-gate 1060Sstevel@tonic-gatewritemain: writemain.SH $(PERL_CONFIG_H) 1070Sstevel@tonic-gate $(CHMOD) 0555 writemain.SH 1080Sstevel@tonic-gate ./writemain.SH 1090Sstevel@tonic-gate 1100Sstevel@tonic-gate# 1110Sstevel@tonic-gate# Build the libperl.so and libperl.so.1 shared objects using Makefile.lib, 1120Sstevel@tonic-gate# which uses the correct library build environment. 1130Sstevel@tonic-gate# 1140Sstevel@tonic-gate 1150Sstevel@tonic-gatelibperl.so: $(PERL_CONFIG_H) FRC 1160Sstevel@tonic-gate @ $(ECHO) "Building libperl.so"; $(MAKE) -f Makefile.lib $(TARGET) 1170Sstevel@tonic-gate 1180Sstevel@tonic-gate# 1190Sstevel@tonic-gate# Build miniperl, the bootstrap perl executable, and check it executes OK. 1200Sstevel@tonic-gate# 1210Sstevel@tonic-gate$(MINIPERL): miniperlmain.o opmini.o libperl.so 1220Sstevel@tonic-gate $(LINK.c) -o $@ miniperlmain.o opmini.o \ 1230Sstevel@tonic-gate -R \$$ORIGIN -L. -lperl $(LDLIBS) 1240Sstevel@tonic-gate @ $(RUN_MINIPERL) -w -Ilib -MExporter -e 'exit(0);' || \ 1250Sstevel@tonic-gate { $(ECHO) "error building miniperl"; $(RM) $(MINIPERL); exit 2; } 1260Sstevel@tonic-gate 1270Sstevel@tonic-gateminiperlmain.o: miniperlmain.c $(PERL_CONFIG_H) 1280Sstevel@tonic-gate 1290Sstevel@tonic-gate# 1300Sstevel@tonic-gate# opmini.o is a version of op.o compiled with -DPERL_EXTERNAL_GLOB. Perl has 1310Sstevel@tonic-gate# an internal implementation of glob, but it isn't available at this point. 1320Sstevel@tonic-gate# 1330Sstevel@tonic-gateopmini.o: op.c $(PERL_CONFIG_H) 1340Sstevel@tonic-gate $(COMPILE.c) -o $@ op.c -DPERL_EXTERNAL_GLOB 1350Sstevel@tonic-gate $(POST_PROCESS_O) 1360Sstevel@tonic-gate 1370Sstevel@tonic-gate.PARALLEL: miniperlmain.o opmini.o libperl.so 1380Sstevel@tonic-gate 1390Sstevel@tonic-gate# 1400Sstevel@tonic-gate# Prepare for building perl modules by: 1410Sstevel@tonic-gate# * Building miniperl. 1420Sstevel@tonic-gate# * Copying re.pm from ext/re into lib. 1430Sstevel@tonic-gate# * Creating lib.pm from lib_pm.PL. 1440Sstevel@tonic-gate# * Creating Config.pm from config.sh. 1450Sstevel@tonic-gate# * Autosplitting any ./lib modules that require it. 1460Sstevel@tonic-gate# * Creating a fake cflags file. ExtUtils::MM_Unix (used to build extensions) 1470Sstevel@tonic-gate# checks to see if there is a non-zero sized file called 'cflags' in this 1480Sstevel@tonic-gate# directory, so we fool it by creating one. 1490Sstevel@tonic-gate# 1500Sstevel@tonic-gate 1510Sstevel@tonic-gatepreplibrary: $(MINIPERL) $(PERL_CONFIG_PM) lib/lib.pm \ 1520Sstevel@tonic-gate lib/ExtUtils/Miniperl.pm cflags $(AUTOSPLIT) 1530Sstevel@tonic-gate 1540Sstevel@tonic-gate$(PERL_CONFIG_PM): configpm $(PERL_CONFIG_H) myconfig.SH $(MINIPERL) lib/re.pm 1550Sstevel@tonic-gate $(RUN_MINIPERL) configpm $@ 1560Sstevel@tonic-gate 1570Sstevel@tonic-gatelib/re.pm : ext/re/re.pm 1580Sstevel@tonic-gate $(CP) -f ext/re/re.pm $@ 1590Sstevel@tonic-gate 1600Sstevel@tonic-gatelib/lib.pm: lib/lib_pm.PL $(PERL_CONFIGDEP) $(MINIPERL) 1610Sstevel@tonic-gate $(RUN_MINIPERL) lib/lib_pm.PL 1620Sstevel@tonic-gate 1630Sstevel@tonic-gatelib/ExtUtils/Miniperl.pm: $(PERL_CONFIGDEP) $(MINIPERL) \ 1640Sstevel@tonic-gate miniperlmain.c minimod.pl 1650Sstevel@tonic-gate $(RUN_MINIPERL) minimod.pl > minimod.tmp 1660Sstevel@tonic-gate $(MV) minimod.tmp $@ 1670Sstevel@tonic-gate 1680Sstevel@tonic-gate# Note: cflags needs to be non-zero sized, so $(TOUCH) won't do. 1690Sstevel@tonic-gatecflags: 1700Sstevel@tonic-gate $(ECHO) > cflags 1710Sstevel@tonic-gate 1720Sstevel@tonic-gate.PARALLEL: $(PERL_CONFIGDEP) lib/re.pm lib/lib.pm lib/ExtUtils/Miniperl.pm \ 1730Sstevel@tonic-gate cflags $(AUTOSPLIT) 1740Sstevel@tonic-gate 1750Sstevel@tonic-gate# Because autosplit generates a lot of files, we create a dummy timestamp file 1760Sstevel@tonic-gate$(AUTOSPLIT): $(PERL_CONFIGDEP) 1770Sstevel@tonic-gate @ $(MKDIR) -p lib/auto 1780Sstevel@tonic-gate $(RUN_MINIPERL) -Ilib -MAutoSplit -e 'autosplit_lib_modules(@ARGV)' \ 1790Sstevel@tonic-gate `find lib -name SCCS -prune -o -name '*.pm' -print` 1800Sstevel@tonic-gate @ $(TOUCH) $(AUTOSPLIT) 1810Sstevel@tonic-gate 1820Sstevel@tonic-gate# 1830Sstevel@tonic-gate# Make DynaLoader. DynaLoader is statically linked into the perl executable 1840Sstevel@tonic-gate# because it is used to load in all the other dynamically loaded modules. 1850Sstevel@tonic-gate# Note: VERSION is used by ON as a environment variable and by perl module 1860Sstevel@tonic-gate# makefiles as a make macro, so we need to unset it before building any modules. 1870Sstevel@tonic-gate# 1880Sstevel@tonic-gate 1890Sstevel@tonic-gateext/DynaLoader/Makefile: ext/DynaLoader/Makefile.PL $(PERL_CONFIGDEP) cflags 1900Sstevel@tonic-gate @ cd ext/DynaLoader; pwd; $(PERL_MM_ENV); \ 1910Sstevel@tonic-gate $(RUN_MINIPERL) Makefile.PL INSTALLDIRS=perl \ 1920Sstevel@tonic-gate LIBPERL_A=libperl.so $(PERL_MM_ARGS) 1930Sstevel@tonic-gate 1940Sstevel@tonic-gate$(DYNALOADER): ext/DynaLoader/Makefile $(PERL_CONFIGDEP) cflags FRC 1950Sstevel@tonic-gate @ cd ext/DynaLoader; pwd; $(PERL_MM_ENV); \ 196580Swesolows $(MAKE) LINKTYPE=static CCCDLFLAGS= 1970Sstevel@tonic-gate 1980Sstevel@tonic-gate# 1990Sstevel@tonic-gate# Create the perl executable. 2000Sstevel@tonic-gate# 2010Sstevel@tonic-gate 2020Sstevel@tonic-gateperl: libperl.so $(DYNALOADER) $(PERL_STATIC_TGT) perlmain.o 2034271Srie $(LINK.c) $(ZIGNORE) -R$(PERL_REAL_CORE_DIR) \ 2040Sstevel@tonic-gate -o $@ perlmain.o $(DYNALOADER) -L. -lperl $(LDLIBS) 2050Sstevel@tonic-gate $(POST_PROCESS) 2060Sstevel@tonic-gate 2070Sstevel@tonic-gateperlmain.o: perlmain.c $(PERL_CONFIG_H) 2080Sstevel@tonic-gate $(COMPILE.c) -o $@ $< 2090Sstevel@tonic-gate $(POST_PROCESS_O) 2100Sstevel@tonic-gate 2110Sstevel@tonic-gate.PARALLEL: perlmain.o 2120Sstevel@tonic-gate 2130Sstevel@tonic-gate# 2140Sstevel@tonic-gate# Build all the extensions. The rules for this are in the generated 2150Sstevel@tonic-gate# ext/Makefile file. 2160Sstevel@tonic-gate# 2170Sstevel@tonic-gate 2180Sstevel@tonic-gateextensions: preplibrary FRC 2190Sstevel@tonic-gate @ cd ext; pwd; $(MAKE) $(TARGET) 2200Sstevel@tonic-gate 2210Sstevel@tonic-gate# 2220Sstevel@tonic-gate# Build utilities and pod pages. 2230Sstevel@tonic-gate# 2240Sstevel@tonic-gate 2250Sstevel@tonic-gateutilities: perl FRC 2260Sstevel@tonic-gate @ cd x2p; pwd; $(MAKE) $(TARGET) 2270Sstevel@tonic-gate @ cd pod; pwd; $(MAKE) $(TARGET) 2280Sstevel@tonic-gate @ cd utils; pwd; $(MAKE) $(TARGET) 2290Sstevel@tonic-gate 2300Sstevel@tonic-gate# 2310Sstevel@tonic-gate# Install targets. The bin, lib and pod symlinks are created here. The man 2320Sstevel@tonic-gate# link is created by the SUNWpl5m package. In order to prevent a symlink cycle 2330Sstevel@tonic-gate# we need to remove libperl.so before we start, so it will always be reinstalled 2340Sstevel@tonic-gate# on each 'make install'. We also overwrite the Config.pm we used to build our 2350Sstevel@tonic-gate# modules with one sanitized of the /ws/on*-tools dependency. As a result, 2360Sstevel@tonic-gate# Config.pm will also be overwritten on each 'make install'. Note also that 2370Sstevel@tonic-gate# perl, pstruct and psed are all hard links, so they too are reinstalled on each 2380Sstevel@tonic-gate# 'make install'. 2390Sstevel@tonic-gate# 2400Sstevel@tonic-gateinstall_files: 2410Sstevel@tonic-gate $(RM) $(PERL_CORE_DIR)/libperl.so 2420Sstevel@tonic-gate @ $(PERL_LD_ENV); $(PERL_LIB_ENV); \ 2430Sstevel@tonic-gate $(PERL_DISTRIB)/perl ./installperl -destdir=$(ROOT) 2440Sstevel@tonic-gate @ $(MAKE) -f Makefile.lib install_lib 2450Sstevel@tonic-gate 2460Sstevel@tonic-gate umask 022; $(MKDIR) -p $(PERL_VENDOR_DIR) 2470Sstevel@tonic-gate 2480Sstevel@tonic-gate $(RM) $(PERL_ROOT_STEM)/bin 2490Sstevel@tonic-gate $(LN) -s ./$(PERL_VERSION)/bin $(PERL_ROOT_STEM)/bin 2500Sstevel@tonic-gate $(RM) $(PERL_ROOT_STEM)/pod 2510Sstevel@tonic-gate $(LN) -s ./$(PERL_VERSION)/lib/pod $(PERL_ROOT_STEM)/pod 2520Sstevel@tonic-gate 2530Sstevel@tonic-gate $(RM) $(ROOTPROG) 2540Sstevel@tonic-gate $(LN) -s ../perl5/$(PERL_VERSION)/bin/perl $(ROOTPROG) 2550Sstevel@tonic-gate 2560Sstevel@tonic-gate $(RM) $(PERL_ARCHLIB_DIR)/Config.pm 257580Swesolows $(SED) $(SED_UN_CC) $(SED_UN_CC_E) $(PERL_CONFIG_PM) \ 2580Sstevel@tonic-gate > $(PERL_ARCHLIB_DIR)/Config.pm 2590Sstevel@tonic-gate $(CHMOD) 444 $(PERL_ARCHLIB_DIR)/Config.pm 2600Sstevel@tonic-gate 261580Swesolowsinstall: all .WAIT install_files 2620Sstevel@tonic-gate 2630Sstevel@tonic-gate# 2640Sstevel@tonic-gate# Perl test suite target. 2650Sstevel@tonic-gate# Note: the perl test suite breaks under parallel make. Bah. 2660Sstevel@tonic-gate# 2670Sstevel@tonic-gate 2680Sstevel@tonic-gate# @ (PERL_MM_ENV); $(PERL_LD_ENV); 2690Sstevel@tonic-gatetest: all 2700Sstevel@tonic-gate $(PERL_LD_ENV); \ 2710Sstevel@tonic-gate PATH=/usr/ccs/bin:$$PATH; export PATH; \ 2720Sstevel@tonic-gate MAKE=/usr/ccs/bin/make; export MAKE; \ 2730Sstevel@tonic-gate PERL_CORE=1; export PERL_CORE; \ 2740Sstevel@tonic-gate cd t; pwd; \ 2750Sstevel@tonic-gate $(CP) ../perl .; \ 2760Sstevel@tonic-gate $(CHMOD) 755 TEST; \ 2770Sstevel@tonic-gate if tty -s; then \ 2780Sstevel@tonic-gate ./TEST < /dev/tty; \ 2790Sstevel@tonic-gate else \ 2800Sstevel@tonic-gate ./TEST < /dev/null; \ 2810Sstevel@tonic-gate fi 2820Sstevel@tonic-gate 2830Sstevel@tonic-gate# 2840Sstevel@tonic-gate# Cleaning targets. 2850Sstevel@tonic-gate# 2860Sstevel@tonic-gate 2870Sstevel@tonic-gateclean_pod: 2880Sstevel@tonic-gate @ cd pod; pwd; $(MAKE) clean 2890Sstevel@tonic-gate 2900Sstevel@tonic-gateclean_utilities: 2910Sstevel@tonic-gate @ cd utils; pwd; $(MAKE) clean 2920Sstevel@tonic-gate 2930Sstevel@tonic-gateclean_x2p: 2940Sstevel@tonic-gate @ cd x2p; pwd; $(MAKE) clean 2950Sstevel@tonic-gate 2960Sstevel@tonic-gateclean_extensions: 2970Sstevel@tonic-gate -@ unset VERSION; \ 2980Sstevel@tonic-gate cd ext; pwd; \ 2990Sstevel@tonic-gate ( \ 3000Sstevel@tonic-gate cd DynaLoader; \ 3010Sstevel@tonic-gate [ -f Makefile.old ] && mf=Makefile.old; \ 3020Sstevel@tonic-gate [ -f Makefile ] && mf=Makefile; \ 3030Sstevel@tonic-gate [ ! -z "$$mf" ] && $(MAKE) -f $$mf clean; \ 3040Sstevel@tonic-gate ); \ 3050Sstevel@tonic-gate $(MAKE) clean 3060Sstevel@tonic-gate 3070Sstevel@tonic-gateclean_lib: 3080Sstevel@tonic-gate $(MAKE) -f Makefile.lib clean 3090Sstevel@tonic-gate 3100Sstevel@tonic-gateclean: clean_pod clean_utilities clean_x2p clean_extensions clean_lib 3110Sstevel@tonic-gate $(RM) $(CLEANFILES) 3120Sstevel@tonic-gate 3130Sstevel@tonic-gate# 3140Sstevel@tonic-gate# Clobber targets 3150Sstevel@tonic-gate# 3160Sstevel@tonic-gate 3170Sstevel@tonic-gateclobber_extensions: 3180Sstevel@tonic-gate -@ unset VERSION; \ 3190Sstevel@tonic-gate cd ext; pwd; \ 320*8601SVladimir.Marek@Sun.COM $(RM) -r Sys/Syslog/lib; \ 3210Sstevel@tonic-gate ( \ 3220Sstevel@tonic-gate cd DynaLoader; \ 3230Sstevel@tonic-gate [ -f Makefile.old ] && mf=Makefile.old; \ 3240Sstevel@tonic-gate [ -f Makefile ] && mf=Makefile; \ 3250Sstevel@tonic-gate [ ! -z "$$mf" ] && $(MAKE) -f $$mf realclean; \ 3260Sstevel@tonic-gate ); \ 3270Sstevel@tonic-gate $(MAKE) clobber 3280Sstevel@tonic-gate 3290Sstevel@tonic-gateclobber_lib: 3300Sstevel@tonic-gate $(MAKE) -f Makefile.lib $(TARGET) 3310Sstevel@tonic-gate $(RM) -r lib/auto lib/Config.pod 3320Sstevel@tonic-gate $(RM) `find ./lib -name .exists` 3330Sstevel@tonic-gate 3340Sstevel@tonic-gateclobber_pod: 3350Sstevel@tonic-gate @ cd pod; pwd; $(MAKE) $(TARGET) 3360Sstevel@tonic-gate 3370Sstevel@tonic-gateclobber_utilities: 3380Sstevel@tonic-gate @ cd utils; pwd; $(MAKE) $(TARGET) 3390Sstevel@tonic-gate 3400Sstevel@tonic-gateclobber_x2p: 3410Sstevel@tonic-gate @ cd x2p; pwd; $(MAKE) $(TARGET) 3420Sstevel@tonic-gate 3430Sstevel@tonic-gateclobber_contrib_bin: 3440Sstevel@tonic-gate @ $(RM) -r contrib_bin 3450Sstevel@tonic-gate 3460Sstevel@tonic-gateclobber: clobber_extensions clobber_lib clobber_pod clobber_utilities \ 3470Sstevel@tonic-gate clobber_x2p clobber_contrib_bin 3480Sstevel@tonic-gate 3490Sstevel@tonic-gateinclude ../../../Makefile.targ 3500Sstevel@tonic-gate 3510Sstevel@tonic-gateFRC: 352