Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 25 Jan 2014 12:33:34 +0400
From:      Lev Serebryakov <lev@FreeBSD.org>
To:        Boris Samorodov <bsam@passap.ru>
Cc:        ports@FreeBSD.org
Subject:   Re: Is it Ok to write files into ${STAGEDIR}/${PREFIX} on "build" stage?
Message-ID:  <7210367408.20140125123334@serebryakov.spb.ru>
In-Reply-To: <52E295E9.6080406@passap.ru>
References:  <1731518990.20140120000401@serebryakov.spb.ru> <52E295E9.6080406@passap.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
Hello, Boris.
You wrote 24 =D1=8F=D0=BD=D0=B2=D0=B0=D1=80=D1=8F 2014 =D0=B3., 20:33:45:

>>   I'm writing port, which has complex, multi-stage build. In the middle =
ofg
>>  build some files should be installed into some directory with exactly s=
ame
>>  structure, as final result -- some ${TEMPROOT}/${PREFIX}. I could create
>>  special place for files, and in "do-install" simple do "tar -cf - -C
>>  ${TEMPROOT} . | tar -xf - -C ${STAGEDIR}" -- it will be correct install=
 to
>>  stage dir for this port. But it looks strange -- to have two copies of =
all
>>  final files.
>>=20
>>    Now I'm using ${STAGEDIR}/${PREFIX} instead of ${TEMPROOT}/${PREFIX} =
and
>>   it works nicely -- do-install: becomes no-op, everything is in-place a=
nd
>>   port doesn't spent another 250MiB of disk place.
>>=20
>>    But, maybe, I don't something significant flaw in this approach and i=
t is
>>   bad idea?

BS> This is a bad idea in general. And if you try to test the port then at
BS> stage time you should get an error like "the the file system touched
BS> before the stage phase".
  I didn't get any errors, it works like a charm, with all "make install" /
 "make deinstall" and "make package" as user and other stuff.

    Only problem, that "check-orphan" complains about *.info files not in
 pkg-plist, but it looks like bug in "check-orphan", as I have all *.info
 in INFO Makefile variable and, again, install/deinstall and package works
 and there are not orphan files, target filesystem is exactly the same after
 "sudo make install deinstall" or "sudo pkg add ${package} && sudo pkg
 delete ${package}".

  Oh, yes, other problem, that *.info files are installed to real system
 even if OPTIONS_UNSET=3DDOCS / NOPORTDOCS=3Dyes is used, so interaction be=
tween
 staging and INFO variables is broken in some way (and portlint insists,
 that putting info files into pkg-plist is bad idea).

BS> Those stages are:
BS> 1. fetch, ...;
BS> 2. build;
BS> 3. stage (install to a STAGEDIR);
BS> 4. actual install (to PREFIX).

BS> Our staging allows having a full install at STAGEDIR but doing
BS> a partially install to PREFIX. I.e. DOCS, EXAMPLES, NLS, etc. may be
BS> installed to real filesystem (PREFIX) only if an appropriate option is
BS> checked up. In the future this allows us to get different binary
BS> packages (libs-*, bin-*, what_you_like-*) from one source (STAGEDIR).
  How this contradict with putting file to ${STAGEDIR}${PREFIX} before
"stage" phase (I don't like word "stage" instead of "phase" here due to
obvious reason)? Now my port does all "installation" (from upstream
software point of view) into ${STAGEDIR}${PREFIX} at port build phase
("do-build" target from port's Makefile point of view), "stage" phase
(really "do-install" target from port's Makefile point of view) is no-op,
and it works!

BS> And yes, this system has a drawback. If you write an application only
BS> for FreeBSD, it is a monolith one (no docs, examples, etc.) and you
BS> use only ports system (no packages) then you'll get your application
BS> duplicate disk consumption (at stage/install phase).
  I have docs, examples, etc. And use packages. It works. It supports
 NOPORTDOCS / NOPORTEXAMPLES properly in all cases. I could send port
 prototype to you to examine.

--=20
// Black Lion AKA Lev Serebryakov <lev@FreeBSD.org>




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?7210367408.20140125123334>