Opened 3 months ago
Last modified 3 months ago
#70586 new defect
ocaml-bigstringaf does not build if ocaml was built with ccache
Reported by: | barracuda156 | Owned by: | |
---|---|---|---|
Priority: | Normal | Milestone: | |
Component: | ports | Version: | 2.10.1 |
Keywords: | Cc: | pguyot (Paul Guyot), pmetzger (Perry E. Metzger) | |
Port: | ocaml-bigstringaf, ocaml |
Description
Is it that ocaml
itself should not be built with ccache
active? I had to rebuild it in result to make this work.
---> Building ocaml-bigstringaf Executing: cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_ocaml_ocaml-bigstringaf/ocaml-bigstringaf/work/bigstringaf-0.10.0" && /opt/local/bin/dune build -j 6 --root=/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_ocaml_ocaml-bigstringaf/ocaml-bigstringaf/work/bigstringaf-0.10.0 --profile=release --ignore-promoted-rules --no-config --only-packages=bigstringaf --default-target=@install @install File ".dune/ccomp/_unknown_", line 1, characters 0-0: ccache: invalid option -- E Command failed: cd "/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_ocaml_ocaml-bigstringaf/ocaml-bigstringaf/work/bigstringaf-0.10.0" && /opt/local/bin/dune build -j 6 --root=/opt/local/var/macports/build/_opt_local_var_macports_sources_rsync.macports.org_macports_release_tarballs_ports_ocaml_ocaml-bigstringaf/ocaml-bigstringaf/work/bigstringaf-0.10.0 --profile=release --ignore-promoted-rules --no-config --only-packages=bigstringaf --default-target=@install @install Exit code: 1 Error: Failed to build ocaml-bigstringaf: command execution failed
Change History (9)
comment:1 Changed 3 months ago by pmetzger (Perry E. Metzger)
comment:2 Changed 3 months ago by ryandesign (Ryan Carsten Schmidt)
To reproduce, install the ccache port, set configureccache yes
in macports.conf, build the ocaml port from source, then try to build the ocaml-bigstringaf port from source.
There are tons of files installed by the ocaml port that contain the fact that ccache was used to build the port:
% port -q contents ocaml | xargs grep ccache Binary file /opt/local/bin/ocaml matches Binary file /opt/local/bin/ocamlc matches Binary file /opt/local/bin/ocamlc.byte matches Binary file /opt/local/bin/ocamlc.opt matches Binary file /opt/local/bin/ocamlcmt matches Binary file /opt/local/bin/ocamlcp matches Binary file /opt/local/bin/ocamlcp.byte matches Binary file /opt/local/bin/ocamlcp.opt matches Binary file /opt/local/bin/ocamldebug matches Binary file /opt/local/bin/ocamldep matches Binary file /opt/local/bin/ocamldep.byte matches Binary file /opt/local/bin/ocamldep.opt matches Binary file /opt/local/bin/ocamldoc matches Binary file /opt/local/bin/ocamldoc.opt matches Binary file /opt/local/bin/ocamlmklib matches Binary file /opt/local/bin/ocamlmklib.byte matches Binary file /opt/local/bin/ocamlmklib.opt matches Binary file /opt/local/bin/ocamlmktop matches Binary file /opt/local/bin/ocamlmktop.byte matches Binary file /opt/local/bin/ocamlmktop.opt matches Binary file /opt/local/bin/ocamlobjinfo matches Binary file /opt/local/bin/ocamlobjinfo.byte matches Binary file /opt/local/bin/ocamlobjinfo.opt matches Binary file /opt/local/bin/ocamlopt matches Binary file /opt/local/bin/ocamlopt.byte matches Binary file /opt/local/bin/ocamlopt.opt matches Binary file /opt/local/bin/ocamloptp matches Binary file /opt/local/bin/ocamloptp.byte matches Binary file /opt/local/bin/ocamloptp.opt matches Binary file /opt/local/bin/ocamlprof matches Binary file /opt/local/bin/ocamlprof.byte matches Binary file /opt/local/bin/ocamlprof.opt matches /opt/local/lib/ocaml/Makefile.config:CC=ccache /usr/bin/clang -arch x86_64 /opt/local/lib/ocaml/Makefile.config:CPP=ccache /usr/bin/clang -arch x86_64 -E /opt/local/lib/ocaml/Makefile.config:MKDLL=ccache /usr/bin/clang -arch x86_64 -shared -flat_namespace -undefined suppress -Wl,-no_compact_unwind $(LDFLAGS) /opt/local/lib/ocaml/Makefile.config:MKMAINDLL=ccache /usr/bin/clang -arch x86_64 -shared -flat_namespace -undefined suppress -Wl,-no_compact_unwind $(LDFLAGS) Binary file /opt/local/lib/ocaml/compiler-libs/config.cmt matches Binary file /opt/local/lib/ocaml/compiler-libs/config.cmx matches Binary file /opt/local/lib/ocaml/compiler-libs/ocamlcommon.a matches Binary file /opt/local/lib/ocaml/compiler-libs/ocamlcommon.cma matches Binary file /opt/local/lib/ocaml/dynlink.a matches Binary file /opt/local/lib/ocaml/dynlink.cma matches Binary file /opt/local/lib/ocaml/dynlink_compilerlibs.cmx matches Binary file /opt/local/lib/ocaml/expunge matches
This doesn't happen if ccache is not used when building ocaml (e.g. when installing a binary of ocaml from our server).
So there are two problems that need to be fixed.
- The ocaml port should excise all of these references to ccache from the installed files.
- The ocaml-bigstringaf port, and perhaps all ports that use ocaml, need to build using the compiler MacPorts tells them to build with, not the compiler that ocaml was built with.
comment:3 Changed 3 months ago by pmetzger (Perry E. Metzger)
The OCaml port doesn't reference ccache in its Portfile. I presume this is a problem caused by someone installing ccache and ccache somehow infecting the OCaml binary anyway?
comment:4 Changed 3 months ago by pmetzger (Perry E. Metzger)
(And by "compiler" here, you mean the C compiler and not the OCaml compiler? OCaml is a compiler.)
comment:5 Changed 3 months ago by ryandesign (Ryan Carsten Schmidt)
When you set configureccache yes
in macports.conf, MacPorts tells ports to use ccache by modifying the value of configure.cc
to be e.g. ccache /usr/bin/clang
and of course passes that to the build system in the CC
environment variable. A similar problem would arise using configuredistcc yes
. ocaml is evidently baking the value of CC
into itself somewhere and should not do that.
comment:6 Changed 3 months ago by pmetzger (Perry E. Metzger)
I suspect it's doing that in order to have any knowledge of where the C compiler is located; it needs the C compiler sometimes. Do you have suggestions on what a clean way to deal with this would be? It still needs to know what the preferred C compiler is (and probably can't adjust that easily on the fly) but it obviously should not be using ccache. What's the right way to get that information?
comment:7 Changed 3 months ago by ryandesign (Ryan Carsten Schmidt)
You could discover using if {${configure.ccache}}
and if {${configure.distcc}}
whether the user has asked to use ccache or distcc. If so, you can use reinplace
to remove the ccache
or distcc
prefix from wherever it has been baked into ocaml.
comment:8 Changed 3 months ago by pguyot (Paul Guyot)
The following seems to work:
if {${configure.ccache}} { post-configure { reinplace "s|=ccache |=|g" ${worksrcpath}/Makefile.config } } if {${configure.distcc}} { post-configure { reinplace "s|=distcc |=|g" ${worksrcpath}/Makefile.config } }
But why do we want to use ccache (or distcc) while building ocaml? Most of the time is spent compiling ocaml libraries...
I would simply do:
configure.ccache no configure.distcc no
BTW, the problem is strictly related to ocaml being built with ccache.
ocaml-bigstringaf
compiles fine with ccache enabled as long as active ocaml was either built without ccache or with the modifications above.
comment:9 Changed 3 months ago by pmetzger (Perry E. Metzger)
I think we should probably disable it in the ocaml port, yes.
I'm not sure I entirely understand what the circumstances here were. Can you explain how to reproduce the problem?