[dune] linking three findlib packages into single cma with -linkall

I’m trying to link a few libraries into single .cma file but by some reason dune doesn’t pass these libraries when linking bbb.cma (although, the are kind of used inside a library). Last time on Discord @rgrinberg recommended to add an empty module to a library bbb but it doesn’t help. Any ideas what is wrong in my demo?

Seems like you’re just not really bbb b/c dune thinks it’s a private library that doesn’t belong to any packages. The following fixed that for me:

diff --git a/dune b/dune
index 0ef14c5..239e7a6 100644
--- a/dune
+++ b/dune
@@ -7,6 +7,7 @@
 
 (library
  (name bbb)
+ (public_name bbb)
  (modules Empty)
  ; I want these libraries to be linked using linkall but it doesn't happen
  (libraries aaa compiler-libs.common ppxlib)

and everything that you’d expect is linked in. I believe the other hacks shouldn’t even be necessary.

It is still the same. It runs

   Running[9]: (cd _build/default && /home/kakadu/.opam/4.06.1+fp+flambda/bin/ocamlc.opt \
     -g -a -o bbb.cma -linkall .bbb.objs/bbb.cmo .bbb.objs/bbb__Empty.cmo)

the same as before

Does that mater? ocamlobjinfo shows the output that we expect:

$ ocamlobjinfo _build/default/bbb.cma
File _build/default/bbb.cma
Force custom: no
Extra C object files:
Extra C options:
Extra dynamically-loaded libraries:
Unit name: Bbb
Interfaces imported:
	9b04ecdc97e5102c1d342892ef7ad9a2	Pervasives
	79ae8c0eb753af6b441fe05456c7970b	CamlinternalFormatBasics
	--------------------------------	Bbb__Empty
	484815270b7c8211aa65a05bbc166efd	Bbb
Required globals:
Uses unsafe features: no
Force link: YES
Unit name: Bbb__Empty
Interfaces imported:
	a2706834b4d23daf7798bebbefb79ecb	Weak
	d9584a6414ffa4dac0b7bd3c56f2b1dc	Warnings
	596c497318b5c3057b47b9d6747ef5d1	Uchar
	3fe6d98e0634486be22d9de07aa0709a	Sys
	94a21a391ec111196b0334b34f569094	Syntaxerr
	6339e2b71e8c583a81e808954faf6818	StringLabels
	e6a69bfe22781c3a43e5dc04b6d1728a	String
	90ec282c811d56f0cb641c602c7a92fd	Stream
	033239437feaff14140ab5204a0ac75a	Stdio__Out_channel
	4ddfcce0ea1d3cad1f3cfaa6b970c9cc	Stdio__In_channel
	2a2f65d6828487c137effec1471c3e12	Stdio__Import
	4f28904434d0ad6a2cf032616b13a1aa	Stdio__
	ee8c291653cfa91cb0cd62bbbd66ae2b	Stdio
	5529e284278766333d5e40132b2cbce5	StdLabels
	a3c26bdec0c0211d9b444bd0da56bd1e	Stack
	587d25672b1ef6c062026eb1f8998628	Spacetime
	5b4bf077f2418e76d824a5cd48c0eea8	Sort
	82a58400591144135588fe92a9780697	Shadow_stdlib
	abce35d4ee0ca4e9f3beaa420644b01b	Sexplib0__Sexp_conv_error
	f0c91158d5f760acb8f96e661164f763	Sexplib0__Sexp_conv
	42e5cc75bfbbf5303772ff588d408f73	Sexplib0__Sexp
	325229661372fa8cc8c2a1a3c4f34e8e	Sexplib0
	28a12def19edf36c317c30fafcc03d6d	Set
	e807880cfcd97dfe1c40fcbbb5573f71	Scanf
	35045a94bf3b8a47cf0539e8b280e8f3	Result
	ba6c32ae0bdeda05c187b523e94518fd	Random
	63b55df0e31ad91e82a1c6659c8dca09	Queue
	e5dfd0ca6436c8abad976fc9e914999a	Printf
	1b461321ebcc8e419f24eb531c5ac7ac	Printexc
	2fb55874c33969918847b3df48f68e09	Ppxlib_traverse_builtins
	2c91e908ec1f65dd75ef7a737670fef4	Ppxlib_ast__Location_helper
	71e655cbcbd234eab92eec45ea6c7cef	Ppxlib_ast__Import
	6cb55fb8fe29106235a98fda318db8c3	Ppxlib_ast__Ast
	32888cb9de014faadb04f73b31bf4505	Ppxlib_ast__
	f84e9e1f230102c539e7455c7caf8c9e	Ppxlib_ast
	c660f77caafca46c82e75adb82f3f462	Ppxlib__Name
	eed48eec952ef0fdcd13ad0107879ac5	Ppxlib__Longident
	32d9e0537e56eb3fbf61bfd5c61507a8	Ppxlib__Location
	9c141c9c33bd56ea350edfc955b854c1	Ppxlib__Loc
	a8a388ffa235345e2c8e08316f16839d	Ppxlib__Import
	d7fe0122d58aa8b80958f6d044c190b8	Ppxlib__Common
	7e50b495b2330bab10e69278470bb241	Ppxlib__Ast_traverse
	4d68142822421dacc95b805b389098fb	Ppxlib__
	c9a383c0598378cee42c770c7f558ca3	Ppxlib
	9b04ecdc97e5102c1d342892ef7ad9a2	Pervasives
	a75b4b148ac8febe8bba7d4528048ecb	Parsing
	99ee984a0d7a02c28c0403ac2323406f	Parsetree
	31a2ae9982b4bc8f026293ac2b239d61	Outcometree
	70eb65c7b3db659365282042a997caf4	Oo
	c24b9e2a7c7150201434c91318611b45	Ocaml_shadow
	dc770515d4bec03a9791298f9bbee115	Ocaml_common
	8a1a1ebb4979c1cf4966cc2e706bd0f9	Obj
	7b210723c1ccafec90ff1578ad7e5996	Nativeint
	db5fc31b815ab3040d5a9940a91712c4	MoreLabels
	d1783abac987b0b89a66cc75658a42f4	Misc
	09363ac5fe261fa01232583e86934b3f	Migrate_parsetree_versions
	5fb1d23dc709ad57d9245b852fe66355	Migrate_parsetree
	9dbb48cebd784fc6219ed0e9514fc7df	Marshal
	8b8de381501aa7862270c15619322ee7	Map
	91f9af52ab5161ed3399272c57599564	Longident
	7453466315e9009549dd74621eea0d3b	Location
	f4e829075d9d0bb7de979cfc49c2600b	ListLabels
	7a6b1f92720df765cf38d67f920844fe	List
	0971650cdf1fa8e506e733e9a5da2628	Lexing
	4bf082b428b11a15971c831a1c768bda	Lazy
	f1c602b12ea723a45bbe6143f116a991	Int64
	dbc028028ad4d59759d36dd6c0796919	Int32
	0a88e320f172d3413ba0d5e0f9c70ccd	Hashtbl
	ccedae42b150cdf1b5bae7199df4b0c4	Genlex
	710a8e8b6b15999f36e8242e2a0ef75d	Gc
	1a17539924469551f027475153d4d3b5	Format
	4c2454d1aec88f5851f077478f232f2f	Filename
	c768d468cbd9ad18875f6c7e2e6db863	Ephemeron
	9eea388efd5172256c8453659d37f2b5	Digest
	cd4856c93f21942683ce190142e88396	Complex
	4918635b8796d0ab0d5c593b942f8df7	Char
	69dec6b14920fcc456f3cbd10764333e	CamlinternalOO
	79ae8c0eb753af6b441fe05456c7970b	CamlinternalFormatBasics
	23be9aee6beee502ad5e84d1622df7ab	Caml
	381b3818bd7b7f37a7bf11fb6c76a12a	Callback
	082178365ae645afd148522f3218f31e	BytesLabels
	b0d8deb18827702df0887113ba3c0110	Bytes
	9c9b3639d23d7746c571cdf04646eb29	Buffer
	6e79c776eac3a208f206addce1ead7ce	Bbb__Empty
	484815270b7c8211aa65a05bbc166efd	Bbb
	6b52c8aeed2c096ac525573fd71a7a8d	Base__Word_size
	c4626f184c6bcfe8288173e69dd5aef0	Base__Validate
	4b4711411016db49c5ce7e083c8d23c8	Base__Unit
	9f247295b21088ed7a28dad5b4714efb	Base__T
	8813f5ba1a4cd249072e0472e904408e	Base__Sys0
	7edf3c23d1efddf9182c8865990a9839	Base__Stringable
	5bdf4034c9c83e43a6f97c628e4d59a7	Base__String0
	86b899736ea6dc121b649932feb8d3c5	Base__String
	88d8b925f52bc085d5d94c32d1f0d825	Base__Staged
	1c035042af82496ba95342cda7040e80	Base__Source_code_position0
	20e7450f4220afe14b1d5b05bc827b07	Base__Sign0
	1d5e886426654f0a19751971afd6ce37	Base__Sign
	3f383c6fff3279f4cd4f23a30d1087ef	Base__Sexplib
	80166f1eb7821b478f87945eb40f59e5	Base__Sexp_with_comparable
	2432c0abb0b6453d2e1b1d73257d4d4b	Base__Sexp
	4c70a05c2c87f466550a3c71f00ec7f3	Base__Sequence
	64122590008fb532803bbbd53e752949	Base__Result
	403ff2218bbdd80f2a8c83c6c63c2d08	Base__Ref
	887bbb00e0010c8b96403b0e5330d3c9	Base__Random
	59f3c92816e0b0c401b2576a15601461	Base__Pretty_printer
	30f5e18057edda1e6ac90f282f9c7839	Base__Ppx_sexp_conv_lib
	e1af7895c235cbf845770cf9514eff7e	Base__Ppx_hash_lib
	2a67f6209d73884387fd00da74bcda67	Base__Ppx_compare_lib
	3e1d52d28cc6424ff1a623d34bad4b78	Base__Or_error
	37b7be2c7c05c2f03f86a9ddb6e9ab34	Base__Option
	299e1289bc26a53818d1f5a6e57e81d9	Base__Nativeint
	7be899f82e1541c25ea760c4f75a1487	Base__Monad_intf
	7bfda883b3c5430f8d5e2d9becc577dc	Base__Monad
	f03c86c61e902b1096c85ca42da862cd	Base__Maybe_bound
	db2921743f450ad4224be517c953f049	Base__List
	cbe6916f995b5f62dc03c2dd2dadf0ac	Base__Lazy
	23b0c05a6d544f62b87b8c8d7b494ca5	Base__Invariant_intf
	6fdd6a1581380b956395aee4c712f450	Base__Invariant
	4b3ad06e1321cf23b6974ef6d7ae4e90	Base__Intable
	0e827d62ce8ff6fe034e020ad79c600e	Base__Int_intf
	1340b0b999f8bdd1c40299caea654efa	Base__Int64
	5247fada7360245c0564011b747ee605	Base__Int63_emul
	1b7c123cc335231ad76a7324ea63f3df	Base__Int63_backends
	10cbf1d17daee0f3a3cefb6f300007dc	Base__Int63_backend
	42e8b2f785f869732ee4a8e4da71583e	Base__Int63
	de77c62761e9b2ca2455490fd324a1f3	Base__Int32
	2f37ad34942b6285e3c5ea32c1b355b6	Base__Int0
	06429bbe850445a1ee5c9a02a2b0cbc8	Base__Int
	43b2aa437b3cfb111184b8aec46f2d1a	Base__Info_intf
	f4e23da1fd55470f52e22559b9e7b0f5	Base__Info
	63e69057be4cf3b1bc1ce107d549393f	Base__Indexed_container_intf
	83d1ba776639e8d6247aa40f7d938991	Base__Indexed_container
	c04a94de70dcb56b414073dba28cfea5	Base__Import0
	4302e9b5d3d3a6871e27bff83e8b6901	Base__Import
	98ecbc36297b9540b76729287f7b5b38	Base__Identifiable
	5debffe6db63b7b5154cf1240294c5c7	Base__Hash_intf
	689b00b08a86855d69e40957b3734b40	Base__Hash
	6db5f6fcf12efd5331d9f2cef0cb1c5e	Base__Formatter
	f1e75aebca5da349965908e12e6f33b8	Base__Floatable
	ae3f6119a4c1a9976ff09fbe66e2210d	Base__Float
	f0d23869710fd2e435aeb13fe86c5254	Base__Field
	e67d638f58bf6df7a87bb170de2c4e86	Base__Exn
	a9cf19ba8a46e3a456dbd9b9511008de	Base__Error
	1a4c78846621fbbdd9df4b6cf95acc77	Base__Equal
	ddf55041f18913d885c32a41054ecf64	Base__Container_intf
	d913dcd8ab84b4d378f03705f422d5cc	Base__Container
	4c384588450f41bcb3c58e55734896ae	Base__Comparisons
	02ba9e540774c9eaa513665dc0ff744d	Base__Comparator
	0a629474b8de2b642766ac4616d7b0e9	Base__Comparable_intf
	a560a9b9215e47d42e9c58f0fa02d29e	Base__Comparable
	718c25c687948722d3bd3b927cfc060c	Base__Commutative_group
	4e9e42f6decba59714a0c64b28c13d33	Base__Char
	22fdc92aaae76df5a4c26cd208bb1a9a	Base__Bytes_set_primitives
	0396cf7a2d2bde3f43a361a5b37d246b	Base__Bytes
	d16dbeb6230d1f1dc3789ab8b2eecf1f	Base__Buffer_intf
	286086e13bc2f6f7075cb4d45e9024c4	Base__Buffer
	17a54a897b49cdd58b8212d9bf72979c	Base__Bool
	3d5b653489f5cdb9de2a2cc04f47a5a3	Base__Blit_intf
	80154b9f4ea8c282313fb08394f33b00	Base__Blit
	275e4c5e542048645b7869595af7b8fe	Base__Binary_searchable_intf
	eeb03c46e54116347487b84e318470a1	Base__Binary_searchable
	f68fe94e516bb759ee2d91b1030a0426	Base__Backtrace
	936b9b68e21f2fa2e9326a9a25b0e0a4	Base__Array
	d071621c2b1b67a48ca83af91d3105d7	Base__Applicative_intf
	4926c368d5988a91821ce832cf8b6700	Base__Applicative
	6d6529e450496ec8d594252817e4eeb3	Base__
	54eb63e8dbca084b1392bd58dd362597	Base
	2956b7f31c188e191f9992f2f85786c7	Asttypes
	bece4f97c520a14b1b1280adeaa3c109	Ast_mapper
	124d654b00990633fa29ae90663fba56	Ast_407
	6214cf75fbfc602ba8af6c4507d6eaec	Ast_406
	adbbe33ea175cca6de95a78876d4989c	Ast_405
	50158b25908894437569735632eb79f8	Ast_404
	fec9b45492e9f6e97cc62c8662926a40	Ast_403
	44677371a8fb603750f825865d9908e9	Ast_402
	c4974e11dd7c941c002b826edc727de8	ArrayLabels
	0fba23558da789bd0ef7ad786bdc90e6	Array
	8a984750e16559fb57a4021121f21559	Arg
Required globals:
Uses unsafe features: no
Force link: YES

YES! File size matters!

....
Running[9]: (cd _build/default && /home/kakadu/.opam/4.06.1+fp+flambda/bin/ocamlc.opt -g -a -o bbb.cma \
-linkall .bbb.objs/bbb.cmo .bbb.objs/bbb__Empty.cmo)
➜  dune_test1 git:(master) ll _build/default/bbb.cma
-rw-rw-r-- 1 kakadu kakadu 8972 авг 11 14:13 _build/default/bbb.cma

➜  dune_test1 git:(master) (cd _build/default && /home/kakadu/.opam/4.06.1+fp+flambda  /bin/ocamlc.opt -g -a -o bbb.cma \
-linkall .bbb.objs/bbb.cmo \
/home/kakadu/.opam/4.06.1+fp+flambda/lib/ppxlib/ppxlib.cma \
.bbb.objs/bbb__Empty.cmo)
➜  dune_test1 git:(master) ll _build/default/bbb.cma  
-rw-rw-r-- 1 kakadu kakadu 3346610 авг 11 14:14 _build/default/bbb.cma