Is it Ok to write files into ${STAGEDIR}/${PREFIX} on "build" stage?

Boris Samorodov bsam at
Sat Jan 25 10:06:16 UTC 2014

25.01.2014 12:33, Lev Serebryakov пишет:
> Hello, Boris.
> You wrote 24 января 2014 г., 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 same
>>>  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.
>>>    Now I'm using ${STAGEDIR}/${PREFIX} instead of ${TEMPROOT}/${PREFIX} and
>>>   it works nicely -- do-install: becomes no-op, everything is in-place and
>>>   port doesn't spent another 250MiB of disk place.
>>>    But, maybe, I don't something significant flaw in this approach and it 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=DOCS / NOPORTDOCS=yes is used, so interaction between
>  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)?

To my mind build is, well, for building and install... you know...

> 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!

And that (install while being at build target) is imho not good. May be
not now but later. May be with different user rights...

One more time -- it's just my imho. _I_ wouldn't do so.

> 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.

Please, do. I'll try to scrub it.

WBR, Boris Samorodov (bsam)
FreeBSD Committer, The Power To Serve

More information about the freebsd-ports mailing list