Pagina 1 di 1

Chiarimenti su creazione tgz

Inviato: dom 27 ago 2006, 17:47
da giberg
Ciao
sto provando a creare un pacchetto .tgz del software statistico R-2.3.1 ottimizzato per il mio pc. È la prima volta che provo a creare un pacchetto. In realta il software funzionerebbe anche senza installazione subito dopo il make. Ovviamente in questo caso lo userebbe l'utente che lo ha compilato. È possibile comunque installarlo sull'intero sistema con il solito make install. La mia quindi è più che altro una prova, però trovo utile poter creare il pacchetto per utilizzare gli strumenti di aggiornamento di Slackware ma soprattutto per cultura personale. Prima ancora di provare con uno Slackbuild ho voluto fare le cose passo per passo seguendo la guida di samiel
http://www.slacky.it/index.php?option=c ... 62&aid=56"
e poi questo thread
http://www.slacky.it/forum/viewtopic.ph ... slackbuild

Prima di tutto ho creato la directory /tmp/pkg

Codice: Seleziona tutto

bash-3.00$ mkdir -p /tmp/pkg 
ho scompattato il file al suo interno

Codice: Seleziona tutto

bash-3.00$ cd /tmp/pkg/
bash-3.00$ tar xzvf /home/gianni/R-2.3.1.tar.gz
mi sono spostato all'interno di R-2.3.1 per lanciare il configure.

Codice: Seleziona tutto

bash-3.00$ cd R-2.3.1/
bash-3.00$ CFLAGS="-O3 -march=pentium3 -mcpu=pentium3" ./configure --prefix=/usr --disable-debug
Poi compilo:

Codice: Seleziona tutto

bash-3.00$ make
Poi dopo il comando su (ho il dubbio se sia necessario o meno visto che l'installazione deve esser fatta all'interno della /tmp/pkg...) ho dato il make install:

Codice: Seleziona tutto

bash-3.00# make DESTDIR=/tmp/pkg install
A questo punto però il programma si installa in /usr (e /usr/lib/R) e non in /tmp/pkg/usr come ho capito dovrebbe essere. Non mi pare di aver dimenticato nulla.

Posto anche il Makefile se può essere utile:

Codice: Seleziona tutto

#
# ${R_HOME}/Makefile


srcdir = .
top_srcdir = .

top_builddir = .

include $(top_builddir)/Makeconf

distdir = $(PACKAGE)-$(VERSION)
INSTFILES = COPYING NEWS
NON_SVN_INSTFILES = SVN-REVISION
DISTFILES = $(INSTFILES) \
	ChangeLog INSTALL ONEWS OONEWS README VERSION \
	Makeconf.in Makefile.in \
	config.site configure configure.ac
SUBDIRS = m4 tools doc etc share src tests  po
SUBDIRS_WITH_NO_BUILD = # po

all: Makefile Makeconf R docs recommended
recommended:  stamp-recommended

Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
	@cd $(top_builddir) && $(SHELL) ./config.status $@
Makeconf: $(srcdir)/Makeconf.in $(top_builddir)/config.status
	@cd $(top_builddir) && $(SHELL) ./config.status $@

ACLOCAL_M4 = aclocal.m4
ACINCLUDE_DEPENDENCIES = \
	m4/R.m4 \
	m4/clibs.m4 \
	m4/codeset.m4 \
	m4/gettext.m4 m4/gettext-lib.m4 \
	m4/java.m4 \
	m4/libtool.m4
CONFIGURE_DEPENDENCIES = $(srcdir)/VERSION
config.status: $(srcdir)/configure
	@$(SHELL) ./config.status --recheck
$(srcdir)/configure: # $(srcdir)/configure.ac $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES)
	@BD=`pwd`; cd $(srcdir) && $(AUTOCONF) -B $${BD}
$(ACLOCAL_M4): $(srcdir)/configure.ac acinclude.m4
	@BD=`pwd`; cd $(srcdir) && $(ACLOCAL) --output=$${BD}/$@ -I $${BD}
acinclude.m4: $(srcdir)/configure.ac $(ACINCLUDE_DEPENDENCIES)
	@(cd $(srcdir) && cat $(ACINCLUDE_DEPENDENCIES)) > $@

LIBTOOL_DEPS = tools/ltmain.sh
libtool: $(LIBTOOL_DEPS)
	$(SHELL) ./config.status --recheck

R: Makefile svnonly
	@if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	  for f in $(INSTFILES); do \
	    $(INSTALL_DATA) $(srcdir)/$${f} $(top_builddir); \
	  done; \
	fi
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) R) || exit 1; \
	done
	@test -f src/library/stamp-docs || \
	  echo "you should 'make docs' now ..."

docs: R FORCE
	-@(cd doc && $(MAKE) $@)
	-@(cd src/library && $(MAKE) $@)
help html latex examples: FORCE
	-@(cd src/library && $(MAKE) $@)
FORCE:

stamp-recommended: R docs
	@(cd src/library/Recommended && $(MAKE))

vignettes: stamp-recommended
	-@(cd src/library && $(MAKE) $@)

install: installdirs svnonly
	@for d in $(SUBDIRS); do \
	  (cd $${d} && $(MAKE) $@) || exit 1; \
	done
	@for f in $(INSTFILES); do \
	  $(INSTALL_DATA) $(srcdir)/$${f} "$(rhome)"; \
	done
	@for f in $(INSTFILES); do \
	  $(INSTALL_DATA) $(srcdir)/$${f} "$(rdocdir)"; \
	done
	@for f in $(NON_SVN_INSTFILES); do \
	  $(INSTALL_DATA) $${f} "$(rhome)"; \
	done
#		$(MAKE) install-R-framework
#		@(sed 's|^LIBR =.*|LIBR = -F$(R_FRAMEWORK_DIR)/.. -framework R|' \
#		  $(top_builddir)/etc/Makeconf > "$(rhome)/etc/Makeconf")
#		@(sed 's/Versions\/$(FW_VERSION)\/Resources/Resources/' \
#		  $(R_FRAMEWORK_DIR)/Resources/bin/R > \
#		  $(R_FRAMEWORK_DIR)/Resources/bin/RR)
#		@(mv $(R_FRAMEWORK_DIR)/Resources/bin/RR $(R_FRAMEWORK_DIR)/Resources/bin/R)
#		@(chmod 755 $(R_FRAMEWORK_DIR)/Resources/bin/R)
#		@(cp $(R_FRAMEWORK_DIR)/Resources/bin/R $(R_FRAMEWORK_DIR)/Resources/R)
#		@(chmod -R g+w $(R_FRAMEWORK_DIR))

svnonly:
	@if test ! -f "$(srcdir)/doc/FAQ" || test -f non-tarball ; then \
	  (cd doc/manual && $(MAKE) front-matter) ; \
	  touch non-tarball ; \
	  (cd $(srcdir); LC_ALL=C TZ=GMT svn info || echo "Revision: unknown") 2> /dev/null \
	    | sed -n -e '/^Revision/p' -e '/^Last Changed Date/'p \
	    |  cut -d' ' -f1,2,3,4 > SVN-REVISION-tmp ; \
	  if grep unknown SVN-REVISION-tmp > /dev/null ; then \
	    echo "Last Changed Date: Today" >> SVN-REVISION-tmp ; \
	    if test -f "$(srcdir)/.svn/entries" ; then \
	      rev=`grep committed-rev "$(srcdir)/.svn/entries" | head -1 | sed -e 's/^ *committed-rev=\"//' -e 's/\"//'`; \
	      cdate=`grep committed-date "$(srcdir)/.svn/entries" | head -1 | sed -e 's/^ *committed-date=\"//' -e 's/T.*//'`; \
	      sed -e "s/unknown/$${rev}/" -e "s/Today/$${cdate}/" SVN-REVISION-tmp > SVN-REVISION-tmp2; mv SVN-REVISION-tmp2 SVN-REVISION-tmp ; \
	    fi ; \
	  fi ; \
	  $(top_srcdir)/tools/move-if-change SVN-REVISION-tmp SVN-REVISION ; \
	  rm -f SVN-REVISION-tmp ; \
	else \
	  if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	    for f in $(NON_SVN_INSTFILES); do \
	      $(INSTALL_DATA) $(srcdir)/$${f} $(top_builddir); \
	    done \
	  fi \
	fi

libR_la = lib/libR$(DYLIB_EXT)
install-libR:
	@if test -f $(libR_la); then $(MAKE) install-libR-exists; fi
install-libR-exists:
	@$(MKINSTALLDIRS) "${libdir}"
	@$(INSTALL_DATA) -m755 $(libR_la) "${libdir}"

installdirs:
	@$(MKINSTALLDIRS) "$(rhome)"
install-strip:
	$(MAKE) INSTALL_PROGRAM="${INSTALL_PROGRAM} -s" install
uninstall:
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	@for f in $(INSTFILES) $(NON_SVN_INSTFILES); do \
	  rm -f "$(rhome)/$${f}"; \
	done
	@rm -rf "$(Rexecbindir)" "$(rhome)/lib"
	@rmdir "$(rhome)" 2>/dev/null \
          || echo "  dir $(rhome) not removed"
	@rm -f "${libdir}/libR$(DYLIB_EXT)"

mostlyclean: clean
clean:
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	@if test "$(BUILDDIR_IS_SRCDIR)" = no ; then \
	  rm -f $(INSTFILES); \
	fi
distclean: clean
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	-@rm -rf bin include lib library modules gnome
	@if test -f non-tarball ; then \
	  rm -f $(NON_SVN_INSTFILES) non-tarball ; \
	fi
	-@rm -f Makeconf Makefile Makefile.bak Makefrag.* \
	  config.cache config.log config.status libtool \
	  $(ACLOCAL_M4) acinclude.m4 $(distdir).tar.gz
maintainer-clean: distclean
	@echo "This command is intended for maintainers to use; it"
	@echo "deletes files that may need special rules to rebuild"
	@(for d in $(SUBDIRS); do rsd="$${d} $${rsd}"; done; \
	  for d in $${rsd}; do (cd $${d} && $(MAKE) $@); done)
	-@(cd $(srcdir) && rm -rf autom4te.cache)

dist: dist-unix
dist-unix: distdir
	-chmod -R a+r $(distdir)
	-chmod -R go-w $(distdir)
	distname=`$(srcdir)/tools/GETDISTNAME`; \
	  dirname=`echo $${distname} | sed -e s/_.*//`; \
          if test $(distdir) != $${dirname} ; then \
            mv $(distdir) $${dirname}; \
          fi ; \
	  GZIP=$(GZIP) $(TAR) czf $${distname}.tar.gz $${dirname}; \
	  rm -rf $${dirname}
dist-win:
distdir: $(DISTFILES) vignettes
	@rm -rf $(distdir)
	@mkdir $(distdir)
	@-chmod 755 $(distdir)
	@for f in $(DISTFILES); do \
	  test -f $(distdir)/$${f} \
	    || ln $(srcdir)/$${f} $(distdir)/$${f} 2>/dev/null \
	    || cp -p $(srcdir)/$${f} $(distdir)/$${f}; \
	done
	@for f in $(NON_SVN_INSTFILES) ; do \
	  cp -p $${f} $(distdir)/$${f}; \
	done
	@for d in $(SUBDIRS); do \
	  test -d $(distdir)/$${d} \
	    || mkdir $(distdir)/$${d} \
	    || exit 1; \
	  chmod 755 $(distdir)/$${d}; \
	  (cd $${d} && $(MAKE) distdir) \
	    || exit 1; \
	done
	@for d in $(SUBDIRS_WITH_NO_BUILD); do \
	  ((cd $(srcdir); $(TAR) -c -f - $(DISTDIR_TAR_EXCLUDE) $${d}) \
	      | (cd $(distdir); $(TAR) -x -f -)) \
	    || exit 1; \
	done
	@cp library/grid/doc/*.pdf library/grid/doc/index.html \
	  $(distdir)/src/library/grid/inst/doc
	@(cd $(distdir); tools/link-recommended)

dvi info pdf:
	-@(cd doc && $(MAKE) $@)
install-dvi install-info install-pdf:
	-@(cd doc/manual && $(MAKE) $@)
uninstall-dvi uninstall-info uninstall-pdf:
	-@(cd doc/manual && $(MAKE) $@)

check check-devel check-all:
	@(cd tests && $(MAKE) $@)

reset-recommended:
	@(cd src/library/Recommended && $(MAKE) clean)

install-R-framework:
	@echo "Creating R framework ..."
	@(cd "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)" && \
	  ln -f -s -n Resources/include Headers && \
	  ln -f -s -n Resources/lib/libR.dylib R)
	@(cd "$(R_FRAMEWORK_DIR)/Versions" && \
	  ln -f -s -n $(FW_VERSION) Current)
	@(cd "$(R_FRAMEWORK_DIR)"  && \
	  ln -f -s -n Versions/Current/PrivateHeaders PrivateHeaders&& \
	  ln -f -s -n Versions/Current/Headers Headers&& \
	  ln -f -s -n Versions/Current/R R && \
	  ln -f -s -n Versions/Current/Resources Resources)
	@## the resulting libR will point dyld to the fat libR regardless of its origin
	@(cd "$(R_FRAMEWORK_DIR)/Resources/lib" && \
	  install_name_tool -id "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libR.dylib" $(Rexeclibdir)/libR.dylib)
	@(if test -e $(Rexeclibdir)/libRlapack.dylib; then \
	  find "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/" -name '*.so' -or -name '*.dylib' | \
	  xargs -n 1 install_name_tool -change \
	  `otool -L $(Rexeclibdir)/libRlapack.dylib |sed -n -e '2 s/.\(.*\) (compat.*/\1/p'` \
	  "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libRlapack.dylib" ; \
	  install_name_tool -id "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libRlapack.dylib" \
	  $(Rexeclibdir)/libRlapack.dylib; \
	fi)
	@(cp -R $(srcdir)/src/include $(R_FRAMEWORK_DIR)/Versions/Current/PrivateHeaders && \
	  cp src/include/config.h $(R_FRAMEWORK_DIR)/Versions/Current/PrivateHeaders/ && \
	  find $(R_FRAMEWORK_DIR)/Versions/Current/PrivateHeaders -name .svn | xargs rm -rf)

	@(install_name_tool -change libR.dylib \
	    "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libR.dylib" \
	    $(Rexecbindir2)/R)
	@(find "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/" -name '*.so' -exec install_name_tool \
	  -change libR.dylib "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libR.dylib" \{\} \;)
	@(if [ "$(Rexeclibdir)" != "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib" ]; then \
	    $(srcdir)/tools/updatefat "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libR.dylib" "$(Rexeclibdir)/libR.dylib"; \
	    if [ -e "$(Rexeclibdir)/libRlapack.dylib" ]; then \
	      $(srcdir)/tools/updatefat "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Resources/lib/libRlapack.dylib" "$(Rexeclibdir)/libRlapack.dylib"; \
	    fi \
	  fi )
	@(if [ -n "${R_ARCH}" ]; then \
	  if [ "${R_ARCH}" != /ppc -a "${R_ARCH}" != /i386 -a "${R_ARCH}" != /ppc64 ]; then \
	    echo "\
	*** WARNING: The architecture name is incompatible with Apple's naming~              convention. This may prevent applications from using the R~              framework. Please use i386, ppc or ppc64 as architecture~              names to allow universal builds."|sed 'y/~/\n/' >&2; \
	  else \
	    for f in `ls "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Headers/${R_ARCH}/"*.h|xargs basename`; do \
	      echo "/* This is an automatically generated universal stub for architecture-dependent headers. */~#ifdef __i386__~#include <i386/$$f>~#else~#ifdef __ppc__~#include <ppc/$$f>~#else~#ifdef __ppc64__~#include <ppc64/$$f>~#else~#error Cannot determine the correct architecture. To force a certain configuration, include architecture-specific include path *before* general R headers path.~#endif~#endif~#endif" |sed -e 'y/~/\n/' > "$(R_FRAMEWORK_DIR)/Versions/$(FW_VERSION)/Headers/$$f"; \
	    done; \
	  fi \
	fi )

TAGS:
Ultima cosa: l'errore indicato alla fine del makefile deve preoccuparmi? Forse non devo utilizzare pentium3 come architettura ma i più generali i486 o i686?

Inviato: dom 27 ago 2006, 18:36
da dapuzz
prova a mettere il destdir dopo install
make install DESTDIR=/dir/dir (ad es., DESTDIR=/tmp/pkg)
oppure
make install prefix=/dir/dir (ad es., prefix=/tmp/pkg/usr).

Inviato: dom 27 ago 2006, 18:47
da giberg
Era la prima opzione che avevo provato ma non cambia nulla... :(

Ho visto che samiel fa make install DESTDIR=/dir mentre loris make DESTDIR=/dir install. Quindi ho provato le due soluzioni ma niente.

Inviato: dom 27 ago 2006, 19:02
da dapuzz
ma hai detto che il binario parte anche senza installazione, giusto? Quindi non ha bisogno di path particolari.
Quindi a questo punto puoi usare l'opzione --prefix del configure e dargi una directory vuota. poi il solito make e make install e lui installerà tutto nella directory che gli hai dato. (tmp/package/usr presuppongo) Almeno in questo caso non dovresti avere nessun problema perchè come hai detto il binario funziona a prescindere da dov'è :D

Edit:
Ed infatto lo si può leggere anche nella documentazione di R
http://cran.r-project.org/doc/FAQ/R-FAQ ... 8Unix_0029

comunque usa sempre "make install DESTDIR" per i prossimi pacchetti che vorrai realizzare, non so se cambia qualcosa mettendo il destdir prima, ma io l'ho sempre letto così :)

Inviato: dom 27 ago 2006, 19:06
da Firetux
prova con

Codice: Seleziona tutto

make prefix=/tmp/pkg install
[/url]

Inviato: dom 27 ago 2006, 19:22
da giberg
Davo per scontato che con DESTDIR come indicato negli how-to funzionasse (visto che prefix è ormai deprecato) invece ora come consigliato da Firetux (con l'aggiunta dell'indicazione della directory usr, che non serviva con DESTDIR) sta funzionando. Il comando quindi è:

Codice: Seleziona tutto

make prefix=/tmp/pkg/usr install
Grazie intanto! Vi aggiorno se la realizzazione del pacchetto va a buon fine.

Inviato: lun 28 ago 2006, 0:31
da giberg
Bene, il pacchetto è riuscito! \:D/
Grazie dell'aiuto!

Inviato: lun 28 ago 2006, 9:34
da absinthe
how to di Samiel ha scritto: 3.6. Installare il pacchetto col comando make install.
Dobbiamo ora installare il pacchetto. Tuttavia noi non lo vogliamo installare effettivamente nel sistema per renderlo operativo, ma effettuarne solo un'installazione provvisoria per costruirlo in modo indipendente. A questo fine dobbiamo suggerire al make install di installarlo all'interno di una directory temporanea di lavoro, che abbiamo convenzionalmente chiamato /pkg e già creato col comando mkdir -p /tmp/pkg. Come sappiamo, la struttura di questo pacchetto deve riprodurre la struttura che poi avrà il pacchetto. In altre parole, se determinati file andranno a collocarsi in /usr/lib, adesso dobbiamo fare in modo che vadano a finire in /pkg/usr/lib ecc. Il comando da impartire per redirigerli è allora:
make install DESTDIR=/dir/dir (ad es., DESTDIR=/tmp/pkg)
oppure
make install prefix=/dir/dir (ad es., prefix=/tmp/pkg/usr).
Nei programmi più recenti (i Makefile generati con automake e autoconf) l'opzione DESTDIR ha soppiantato l'ormai deprecata prefix (che, se adottata, produce errori di installazione). Ciò non toglie che un elevato numero di pacchetti la supporti ancora. È da notare che se si adotta DESTDIR va indicata solo la directory principale di lavoro (/pkg), mentre se si adotta prefix va indicata anche la subdirectory (/pkg/usr).
In ogni caso, per verificare quale delle due opzioni adottare è sufficiente, dopo aver eseguito il make, dare il comando grep -R destdir Makefile oppure cercare la stringa "destdir" o "dc_destdir" nel Makefile con un editor quasiasi di testo.

Inviato: lun 28 ago 2006, 9:51
da giberg
Certo, avevo letto quella parte. Solo che alla fine non capivo bene... Se trovo la stringa destdir o dc_destdir posso usare DESTDIR, giusto? Non l'ho trovata, però nella mia ignoranza ho pensato che non c'è neanche una stringa con prefix (ma non avevo idea se ci dovesse essere...). Però la guida non dice altro. Quindi ho supposto che essendo un pacchetto recente funzionasse DESTDIR.
Però nel Makefile c'è la stringa distdir che suona simile... Centra qualcosa?