@@ -1354,40 +1354,38 @@ module Executables = struct
1354
1354
module Link_mode = struct
1355
1355
module T = struct
1356
1356
type t =
1357
- { mode : Mode_conf .t
1358
- ; kind : Binary_kind .t
1359
- ; loc : Loc .t
1360
- }
1357
+ | Byte_complete
1358
+ | Other of
1359
+ { mode : Mode_conf .t
1360
+ ; kind : Binary_kind .t
1361
+ }
1361
1362
1362
1363
let compare a b =
1363
- match Poly. compare a.mode b.mode with
1364
- | Eq -> Poly. compare a.kind b.kind
1365
- | ne -> ne
1364
+ match (a, b) with
1365
+ | Byte_complete , Byte_complete -> Eq
1366
+ | Byte_complete , _ -> Lt
1367
+ | _ , Byte_complete -> Gt
1368
+ | Other a , Other b -> (
1369
+ match Poly. compare a.mode b.mode with
1370
+ | Eq -> Poly. compare a.kind b.kind
1371
+ | ne -> ne )
1366
1372
1367
1373
let to_dyn _ = Dyn. opaque
1368
1374
end
1369
1375
1370
1376
include T
1371
1377
1372
- let make mode kind = { mode; kind; loc = Loc. none }
1378
+ let make mode kind = Other { mode; kind }
1373
1379
1374
1380
let exe = make Best Exe
1375
1381
1376
1382
let object_ = make Best Object
1377
1383
1378
1384
let shared_object = make Best Shared_object
1379
1385
1380
- let byte_exe = make Byte Exe
1386
+ let byte = make Byte Exe
1381
1387
1382
- let native_exe = make Native Exe
1383
-
1384
- let native_object = make Native Object
1385
-
1386
- let native_shared_object = make Native Shared_object
1387
-
1388
- let byte = byte_exe
1389
-
1390
- let native = native_exe
1388
+ let native = make Native Exe
1391
1389
1392
1390
let js = make Byte Js
1393
1391
@@ -1400,6 +1398,7 @@ module Executables = struct
1400
1398
; (" byte" , byte)
1401
1399
; (" native" , native)
1402
1400
; (" js" , js)
1401
+ ; (" byte_complete" , Byte_complete )
1403
1402
]
1404
1403
1405
1404
let simple = Dune_lang.Decoder. enum simple_representations
@@ -1409,9 +1408,8 @@ module Executables = struct
1409
1408
~then_:
1410
1409
(enter
1411
1410
(let + mode = Mode_conf. decode
1412
- and + kind = Binary_kind. decode
1413
- and + loc = loc in
1414
- { mode; kind; loc }))
1411
+ and + kind = Binary_kind. decode in
1412
+ make mode kind))
1415
1413
~else_: simple
1416
1414
1417
1415
let simple_encode link_mode =
@@ -1422,46 +1420,93 @@ module Executables = struct
1422
1420
let encode link_mode =
1423
1421
match simple_encode link_mode with
1424
1422
| Some s -> s
1425
- | None ->
1426
- let { mode; kind; loc = _ } = link_mode in
1427
- Dune_lang.Encoder. pair Mode_conf. encode Binary_kind. encode (mode, kind)
1423
+ | None -> (
1424
+ match link_mode with
1425
+ | Byte_complete -> assert false
1426
+ | Other { mode; kind } ->
1427
+ Dune_lang.Encoder. pair Mode_conf. encode Binary_kind. encode (mode, kind)
1428
+ )
1429
+
1430
+ let to_dyn t =
1431
+ match t with
1432
+ | Byte_complete -> Dyn. Variant (" Byte_complete" , [] )
1433
+ | Other { mode; kind } ->
1434
+ let open Dyn.Encoder in
1435
+ Variant
1436
+ ( " Other"
1437
+ , [ record
1438
+ [ (" mode" , Mode_conf. to_dyn mode)
1439
+ ; (" kind" , Binary_kind. to_dyn kind)
1440
+ ]
1441
+ ] )
1428
1442
1429
- let to_dyn { mode; kind; loc = _ } =
1430
- let open Dyn.Encoder in
1431
- record
1432
- [ (" mode" , Mode_conf. to_dyn mode); (" kind" , Binary_kind. to_dyn kind) ]
1443
+ let extension t ~loc ~ext_obj ~ext_dll =
1444
+ match t with
1445
+ | Byte_complete -> " .bc.exe"
1446
+ | Other { mode; kind } -> (
1447
+ let same_as_mode : Mode.t =
1448
+ match mode with
1449
+ | Byte -> Byte
1450
+ | Native
1451
+ | Best ->
1452
+ (* From the point of view of the extension, [native] and [best] are
1453
+ the same *)
1454
+ Native
1455
+ in
1456
+ match (same_as_mode, kind) with
1457
+ | Byte , C -> " .bc.c"
1458
+ | Native , C ->
1459
+ User_error. raise ~loc
1460
+ [ Pp. text " C file generation only supports bytecode!" ]
1461
+ | Byte , Exe -> " .bc"
1462
+ | Native , Exe -> " .exe"
1463
+ | Byte , Object -> " .bc" ^ ext_obj
1464
+ | Native , Object -> " .exe" ^ ext_obj
1465
+ | Byte , Shared_object -> " .bc" ^ ext_dll
1466
+ | Native , Shared_object -> ext_dll
1467
+ | Byte , Js -> " .bc.js"
1468
+ | Native , Js ->
1469
+ User_error. raise ~loc
1470
+ [ Pp. text " Javascript generation only supports bytecode!" ] )
1433
1471
1434
1472
module O = Comparable. Make (T )
1435
1473
1436
- module Set = struct
1437
- include O. Set
1474
+ module Map = struct
1475
+ include O. Map
1438
1476
1439
1477
let decode =
1440
- located (repeat decode) >> | fun (loc , l ) ->
1478
+ located (repeat (located decode) ) >> | fun (loc , l ) ->
1441
1479
match l with
1442
1480
| [] -> User_error. raise ~loc [ Pp. textf " No linking mode defined" ]
1443
1481
| l ->
1444
- let t = of_list l in
1445
- if
1446
- (mem t native_exe && mem t exe)
1447
- || (mem t native_object && mem t object_)
1448
- || (mem t native_shared_object && mem t shared_object)
1449
- then
1482
+ let t =
1483
+ List. fold_left l ~init: empty ~f: (fun acc (loc , link_mode ) ->
1484
+ set acc link_mode loc)
1485
+ in
1486
+ ( match
1487
+ String.Map. of_list_map (to_list t) ~f: (fun (lm , loc ) ->
1488
+ (extension lm ~loc ~ext_obj: " .OBJ" ~ext_dll: " .DLL" , lm))
1489
+ with
1490
+ | Ok _ -> ()
1491
+ | Error (_ext , (lm1 , _ ), (lm2 , _ )) ->
1450
1492
User_error. raise ~loc
1451
1493
[ Pp. textf
1452
- " It is not allowed use both native and best for the same \
1453
- binary kind."
1454
- ]
1455
- else
1456
- t
1494
+ " It is not allowed use both %s and %s together as they use \
1495
+ the same file extension."
1496
+ (Dune_lang. to_string (encode lm1))
1497
+ (Dune_lang. to_string (encode lm2))
1498
+ ] );
1499
+ t
1500
+
1501
+ let byte_and_exe = of_list_exn [ (byte, Loc. none); (exe, Loc. none) ]
1457
1502
1458
1503
let default_for_exes ~version =
1459
1504
if version < (2 , 0 ) then
1460
- of_list [ byte; exe ]
1505
+ byte_and_exe
1461
1506
else
1462
- singleton exe
1507
+ singleton exe Loc. none
1463
1508
1464
- let default_for_tests = of_list [ byte; exe ]
1509
+ let default_for_tests = byte_and_exe
1465
1510
1466
1511
let best_install_mode t = List. find ~f: (mem t) installable_modes
1467
1512
end
@@ -1471,7 +1516,7 @@ module Executables = struct
1471
1516
{ names : (Loc .t * string ) list
1472
1517
; link_flags : Ordered_set_lang.Unexpanded .t
1473
1518
; link_deps : Dep_conf .t list
1474
- ; modes : Link_mode.Set .t
1519
+ ; modes : Loc .t Link_mode.Map .t
1475
1520
; optional : bool
1476
1521
; buildable : Buildable .t
1477
1522
; variants : (Loc .t * Variant.Set .t ) option
@@ -1498,8 +1543,8 @@ module Executables = struct
1498
1543
and + link_deps = field " link_deps" (repeat Dep_conf. decode) ~default: []
1499
1544
and + link_flags = Ordered_set_lang.Unexpanded. field " link_flags"
1500
1545
and + modes =
1501
- field " modes" Link_mode.Set . decode
1502
- ~default: (Link_mode.Set . default_for_exes ~version: dune_version)
1546
+ field " modes" Link_mode.Map . decode
1547
+ ~default: (Link_mode.Map . default_for_exes ~version: dune_version)
1503
1548
and + optional =
1504
1549
field_b " optional" ~check: (Dune_lang.Syntax. since Stanza. syntax (2 , 0 ))
1505
1550
and + variants = variants_field
@@ -1541,7 +1586,7 @@ module Executables = struct
1541
1586
let has_public_name = Names. has_public_name names in
1542
1587
let private_names = Names. names names in
1543
1588
let install_conf =
1544
- match Link_mode.Set . best_install_mode modes with
1589
+ match Link_mode.Map . best_install_mode modes with
1545
1590
| None when has_public_name ->
1546
1591
User_error. raise ~loc: buildable.loc
1547
1592
[ Pp. textf " No installable mode found for %s."
@@ -1556,11 +1601,11 @@ module Executables = struct
1556
1601
| None -> None
1557
1602
| Some mode ->
1558
1603
let ext =
1559
- match mode.mode with
1560
- | Native
1561
- | Best ->
1562
- " .exe "
1563
- | Byte -> " .bc "
1604
+ match mode with
1605
+ | Byte_complete
1606
+ | Other { mode = Byte ; _ } ->
1607
+ " .bc "
1608
+ | Other { mode = Native | Best ; _ } -> " .exe "
1564
1609
in
1565
1610
Names. install_conf names ~ext
1566
1611
in
@@ -2013,8 +2058,8 @@ module Tests = struct
2013
2058
and + package = field_o " package" Pkg. decode
2014
2059
and + locks = field " locks" (repeat String_with_vars. decode) ~default: []
2015
2060
and + modes =
2016
- field " modes" Executables.Link_mode.Set . decode
2017
- ~default: Executables.Link_mode.Set . default_for_tests
2061
+ field " modes" Executables.Link_mode.Map . decode
2062
+ ~default: Executables.Link_mode.Map . default_for_tests
2018
2063
and + deps =
2019
2064
field " deps" (Bindings. decode Dep_conf. decode) ~default: Bindings. empty
2020
2065
and + enabled_if = enabled_if ~since: (Some (1 , 4 ))
0 commit comments