Re: How to build a static lib properly?

2023-03-05 Thread Mike Parker via Digitalmars-d-learn

On Monday, 6 March 2023 at 02:09:23 UTC, ryuukk_ wrote:




dub should build a static library for the project i build, that 
includes each library it uses that are referenced as "library" 
since the default is "staticLibrary" according to rikki


What you're asking for is a different use case. `staticLibrary` 
is for compiling a specific dub package as a static library. It 
does not imply that all of that package's dependencies should 
also be compiled into a single static library. Nor should it.


You're asking for a package and its dependencies to be bundled 
for use outside of the dub ecosystem as a single static library. 
I won't say it's not a legitimate use case, it's just not one 
that dub currently supports, nor was it originally intended to (I 
wouldn't expect it to be a common one either, but then again 
common expectations are always changing).


As a potential dub enhancement, e.g., `staticLibraryBundle`, I do 
agree it's worth exploring. I don't believe you can expect every 
package to "just work" in that environment. As Steve mentioned, 
there will always be link-time dependencies to any shared 
libraries on which those bundled libraries depend. And some 
packages may be set up in a way that causes issues, as Rikki 
noted when he said he had to make some tweaks on his successful 
build.


But for the time being, dealing with static libraries in D is 
just the same as dealing with them in the C and C++ world. They 
always have been a PITA to deal with, and that's why the trend in 
recent years has been to move away from them. Build tools like 
dub hide them from you when used as intended. It's when you mix 
build systems that you run into trouble.


Still, I suggest you send an email to soc...@dlang.org as part of 
the Gripes and Wishes campaign so that this gets added into the 
dataset. Anything that enhances dub's usability should be looked 
at.





Re: How to build a static lib properly?

2023-03-05 Thread Steven Schveighoffer via Digitalmars-d-learn

On 3/5/23 9:09 PM, ryuukk_ wrote:

On Monday, 6 March 2023 at 02:00:16 UTC, Mike Parker wrote:


This is not dub's fault. When building a shared library, there's a 
link step, so any external dependencies are linked into the shared 
library just as they are with an executable. There is no link step 
with a static library. That means when you build your executable, you 
need to also link the static library's dependencies along with it.


Most of the symbols in your list appear to come from the packages 
listed in the dependencies section of DCD's dub.json:


https://github.com/dlang-community/DCD/blob/master/dub.json

So if you want to do this manually, with DCD as a static library, then 
you also need to build all of those dependencies and link them with 
your executable.




Well, you can create a library that contains all the static libraries, 
you just can't use dub to do it for you automatically, or even manually 
(dub ignores `.a` files when specified as source files).


dub should build a static library for the project i build, that includes 
each library it uses that are referenced as "library" since the default 
is "staticLibrary" according to rikki




Dub expects to have dub-built artifacts available to link. This problem 
only occurs if you are building outside of dub, without proper 
dependency management.


Dub indeed does not play nice with exporting artifacts for other build 
systems. It's something that should be addressed.


Keep in mind though, that you still need to specify any shared library 
dependencies, since static libs cannot contain shared libraries or 
automatic references to them.


-Steve


Re: How to build a static lib properly?

2023-03-05 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 06/03/2023 3:49 PM, ryuukk_ wrote:
On Monday, 6 March 2023 at 01:57:21 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

On 06/03/2023 2:52 PM, ryuukk_ wrote:

Are you saying dub doesn't build a static dcd.lib?


It did, but it doesn't contain any of the dependencies.

What to do to make it so i get a static dcd.lib file that contains 
all the code it needs?


$ dub build --combined

That may work. No guarantees. Dub isn't setup for distribution like this.


combined didn't work, i still get a bunch of unresolved symbols 
(although less long):


https://gist.github.com/ryuukk/d59eb89979f1666139ffe0ac95307f20


I've got it to work via:

$ cd DCD
$ dub build --build-mode=allAtOnce --combined
$ cd ..
$ ldc2 app.d DCD/dcd.lib

```d
void main(string[] args)
{
init_dcd();
}

extern(C) void init_dcd() {}
```

ldc2 on Windows.

DCD/dcd.lib should be about 23mb.

I did have to hunt some files down, it seems some build commands in DCD 
isn't setup for this (almost certainly not using the environment 
variables that dub offers to handle this situation).


Re: How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn

On Monday, 6 March 2023 at 02:54:42 UTC, Ruby The Roobster wrote:

On Monday, 6 March 2023 at 00:55:04 UTC, ryuukk_ wrote:

Hello,

I am trying to build: https://github.com/dlang-community/DCD/ 
as a static lib


[...]


Try ```dub build --build-mode=allAtOnce```.


That didn't work

However, changing 
https://github.com/dlang-community/DCD/blob/master/dsymbol/dub.json#L7 into "sourceLibrary" worked, along with: "--combined"


I maintain what i said, this is poorly designed and seems to be 
also buggy too


Re: How to build a static lib properly?

2023-03-05 Thread Ruby The Roobster via Digitalmars-d-learn

On Monday, 6 March 2023 at 00:55:04 UTC, ryuukk_ wrote:

Hello,

I am trying to build: https://github.com/dlang-community/DCD/ 
as a static lib


[...]


Try ```dub build --build-mode=allAtOnce```.


Re: How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn
On Monday, 6 March 2023 at 01:57:21 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

On 06/03/2023 2:52 PM, ryuukk_ wrote:

Are you saying dub doesn't build a static dcd.lib?


It did, but it doesn't contain any of the dependencies.

What to do to make it so i get a static dcd.lib file that 
contains all the code it needs?


$ dub build --combined

That may work. No guarantees. Dub isn't setup for distribution 
like this.


combined didn't work, i still get a bunch of unresolved symbols 
(although less long):


https://gist.github.com/ryuukk/d59eb89979f1666139ffe0ac95307f20

there needs to be a better solution than to hunt down 
dependencies, then how to build the dependencies and to guess 
what version was used to build said dependencies for the whole 
tree of dependencies one project will use


this is very very poor design

the fact that this is apparently an issue for this long doesn't 
give me hope it's going to be solved anytime soon


if someone from the D team can build a usable static library for 
DCD and its dependencies, then please share to me how, something 
that doesn't involve playing a hunting game on github


that can't be worse than other languages, can it?


Re: How to build a static lib properly?

2023-03-05 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 06/03/2023 3:09 PM, ryuukk_ wrote:

This is a bug in DCD in my book


This has nothing to do with DCD. This is on DUB, it was never designed 
for anything related to distribution.


Nobody has attempted to change this. All the information is available 
for it to do it.


Just a matter of adding another cli command that inherits from build.

dub should build a static library for the project i build, that includes 
each library it uses that are referenced as "library" since the default 
is "staticLibrary" according to rikki


So the targetType library was meant to devolve into either staticLibrary 
or dynamicLibrary as determined at a later point in time circa 2012.


Problem is it will never be able to devolve into a shared library. That 
requires code to be modified to work with it.


Right now targetType library is the default, but should really be 
removed at some point in the future.


Its good to remember that shared library support has only really gotten 
to the point in ldc where we can start to see a glimmer of hope in the 
last 2-3 years. Back in 2012 it was practically something very few 
people could even hope to use.


dmd is still a complete write off, but work is being done to now resolve 
that and I'm on the solving the language level issues with a DIP :)


Re: How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn

On Monday, 6 March 2023 at 02:00:16 UTC, Mike Parker wrote:

On Monday, 6 March 2023 at 01:52:06 UTC, ryuukk_ wrote:
6B71D90\dparse.lib -g

```


Are you saying dub doesn't build a static dcd.lib?

What to do to make it so i get a static dcd.lib file that 
contains all the code it needs?


This comfort me in my desire to no longer use dub ever


This is not dub's fault. When building a shared library, 
there's a link step, so any external dependencies are linked 
into the shared library just as they are with an executable. 
There is no link step with a static library. That means when 
you build your executable, you need to also link the static 
library's dependencies along with it.


Most of the symbols in your list appear to come from the 
packages listed in the dependencies section of DCD's dub.json:


https://github.com/dlang-community/DCD/blob/master/dub.json

So if you want to do this manually, with DCD as a static 
library, then you also need to build all of those dependencies 
and link them with your executable.


This is a bug in DCD in my book

Let's take this example:

Let's pretend Mr A is a developer of a widely used Editor


"A: let's build this tool D people use to get code completion, so 
we can support D"

"A: git clone dcd"
"A: let's install D so we can build it"
"A: dub build -c library"
"A: sweet a dcd.lib file"
"A: feed it into my ABC language compiler"
"A: hmm i am getting unresolved symbols, i thought i compiled a 
static library of that project"
"A: sorry guys, no D support, that's what their build too gave me 
but it doesn't work"


"D people: yeah sorry it doesn't give you a static library of the 
project, you need to individually compile each dependencies it 
uses, some are in the project directory, some are referenced as a 
DUB package so you need to lookup for the source, close it and 
compile it individually too, then you need to do that recursively 
for each dependencies each project will use"



dub should build a static library for the project i build, that 
includes each library it uses that are referenced as "library" 
since the default is "staticLibrary" according to rikki




Re: How to build a static lib properly?

2023-03-05 Thread Mike Parker via Digitalmars-d-learn

On Monday, 6 March 2023 at 01:52:06 UTC, ryuukk_ wrote:
6B71D90\dparse.lib -g

```


Are you saying dub doesn't build a static dcd.lib?

What to do to make it so i get a static dcd.lib file that 
contains all the code it needs?


This comfort me in my desire to no longer use dub ever


This is not dub's fault. When building a shared library, there's 
a link step, so any external dependencies are linked into the 
shared library just as they are with an executable. There is no 
link step with a static library. That means when you build your 
executable, you need to also link the static library's 
dependencies along with it.


Most of the symbols in your list appear to come from the packages 
listed in the dependencies section of DCD's dub.json:


https://github.com/dlang-community/DCD/blob/master/dub.json

So if you want to do this manually, with DCD as a static library, 
then you also need to build all of those dependencies and link 
them with your executable.


Re: How to build a static lib properly?

2023-03-05 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

On 06/03/2023 2:52 PM, ryuukk_ wrote:

Are you saying dub doesn't build a static dcd.lib?


It did, but it doesn't contain any of the dependencies.

What to do to make it so i get a static dcd.lib file that contains all 
the code it needs?


$ dub build --combined

That may work. No guarantees. Dub isn't setup for distribution like this.



Re: How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn

 Use dub, don't do this manually.


i build DCD with DUB, not manually


i ask dub to give me a static lib, dcd.lib is the file he gave 
me, that should be all i



yet i get the errors


Re: How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn
On Monday, 6 March 2023 at 01:46:22 UTC, Richard (Rikki) Andrew 
Cattermole wrote:

In the DCD's dub i changed targetType to "staticLibrary"


You didn't need to do that, the default was correct.


Then i build:

``dub build -c library`` for the library config


Just ``$ dub build`` would've done it (first configuration is 
default).


Now for the errors, I think its a simple case of you are not 
linking everything in. Use dub, don't do this manually.


Here is the output for linking the client configuration, looks 
a bit different ;)


```
Linking dcd-client
C:\Tools\D\ldc2-1.31.0-windows-multilib\bin\ldc2.exe 
-of.dub\build\client-debug-windows-x86_64-ldc_v1.31.0-DF438D1296B6C9BC0E3D50D4EFA1EC5CE1C82F4ED9169185C58440A2BD5ED999\dcd-client.exe .dub\build\client-debug-windows-x86_64-ldc_v1.31.0-DF438D1296B6C9BC0E3D50D4EFA1EC5CE1C82F4ED9169185C58440A2BD5ED999\dcd-client.obj common\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-CF8574F0D3568FA37AB3781BE5A103C1AE1678C5ECADFFF15736AAEF48C13F12\dcd_common.lib C:\Users\alpha\AppData\Local\dub\packages\msgpack-d-1.0.1\msgpack-d\.dub\build\default-debug-windows-x86_64-ldc_v1.31.0-BA2035194DC7872ACAEF6D406F56AF24986B46F8626E1B06E81C1964C374BB12\msgpack-d.lib dsymbol\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-3E3FE60C47A7B98F87E3453CE72C2FF075DB7AD708F08100D68AACD7D4A3DD87\dcd_dsymbol.lib C:\Users\alpha\AppData\Local\dub\packages\emsi_containers-0.9.0\emsi_containers\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-04B3937CA3A0BD6CBBA647E8D9AB53AB78AB124AFAD7E416E7433F06812D4D00\emsi_containers.lib C:\Users\alpha\AppData\Loc!

al\dub\packages\libdparse-0.21.1\libdparse\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-E2B54AF26AC9977B374E024724763A7CD14ED2B981E84AA640F8193906B71D90\dparse.lib
 -g

```


Are you saying dub doesn't build a static dcd.lib?

What to do to make it so i get a static dcd.lib file that 
contains all the code it needs?


This comfort me in my desire to no longer use dub ever



Re: How to build a static lib properly?

2023-03-05 Thread Richard (Rikki) Andrew Cattermole via Digitalmars-d-learn

In the DCD's dub i changed targetType to "staticLibrary"


You didn't need to do that, the default was correct.


Then i build:

``dub build -c library`` for the library config


Just ``$ dub build`` would've done it (first configuration is default).

Now for the errors, I think its a simple case of you are not linking 
everything in. Use dub, don't do this manually.


Here is the output for linking the client configuration, looks a bit 
different ;)


```
Linking dcd-client
C:\Tools\D\ldc2-1.31.0-windows-multilib\bin\ldc2.exe 
-of.dub\build\client-debug-windows-x86_64-ldc_v1.31.0-DF438D1296B6C9BC0E3D50D4EFA1EC5CE1C82F4ED9169185C58440A2BD5ED999\dcd-client.exe 
.dub\build\client-debug-windows-x86_64-ldc_v1.31.0-DF438D1296B6C9BC0E3D50D4EFA1EC5CE1C82F4ED9169185C58440A2BD5ED999\dcd-client.obj 
common\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-CF8574F0D3568FA37AB3781BE5A103C1AE1678C5ECADFFF15736AAEF48C13F12\dcd_common.lib 
C:\Users\alpha\AppData\Local\dub\packages\msgpack-d-1.0.1\msgpack-d\.dub\build\default-debug-windows-x86_64-ldc_v1.31.0-BA2035194DC7872ACAEF6D406F56AF24986B46F8626E1B06E81C1964C374BB12\msgpack-d.lib 
dsymbol\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-3E3FE60C47A7B98F87E3453CE72C2FF075DB7AD708F08100D68AACD7D4A3DD87\dcd_dsymbol.lib 
C:\Users\alpha\AppData\Local\dub\packages\emsi_containers-0.9.0\emsi_containers\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-04B3937CA3A0BD6CBBA647E8D9AB53AB78AB124AFAD7E416E7433F06812D4D00\emsi_containers.lib 
C:\Users\alpha\AppData\Local\dub\packages\libdparse-0.21.1\libdparse\.dub\build\library-debug-windows-x86_64-ldc_v1.31.0-E2B54AF26AC9977B374E024724763A7CD14ED2B981E84AA640F8193906B71D90\dparse.lib 
-g

```


How to build a static lib properly?

2023-03-05 Thread ryuukk_ via Digitalmars-d-learn

Hello,

I am trying to build: https://github.com/dlang-community/DCD/ as 
a static lib


In the DCD's dub i changed targetType to "staticLibrary"

Then i build:

``dub build -c library`` for the library config


But now the weird part

On my program i try to link it and i get bunch of unreloved 
symbols (druntime stuff)


Even thought i do nothing fancy on the program

I build it this way:

``dmd -m64 -g -debug dcd.lib app.d``

Nothing fancy:


```D
void main(string[] args)
{
init_dcd();
}

extern(C) void init_dcd();
```


That init_dcd is declared this way on the dll:

```D
extern(C) export void init_dcd()
{

}
```

I get this long error full of 'unresolved external symbosl'


https://gist.github.com/ryuukk/fae57614aab40638bbe00c8d3fbba708

Anyone know what the hell is happening?


Windows10 x64
DMD32 D Compiler v2.102.1



Re: compile x64 .dll and .so without dependencies

2023-03-05 Thread novice2 via Digitalmars-d-learn

On Sunday, 5 March 2023 at 18:35:58 UTC, Guillaume Piolat wrote:

"targetType": "dynamicLibrary",
"dflags-linux-dmd": ["-defaultlib=libphobos2.a"],
"dflags-osx-ldc": ["-static"],
"dflags-linux-ldc": ["-link-defaultlib-shared=false"],
"dflags-linux-x86_64-ldc": ["-fvisibility=hidden"],
"dflags-windows-ldc": 
["-mscrtlib=libcmt","-fvisibility=hidden", 
"-link-defaultlib-shared=false"],


Additionally on (Windows + DUB + LDC), you will need to set an 
envvar:

DFLAGS=-fvisibility=hidden -dllimport=none


Thank you!


Re: compile x64 .dll and .so without dependencies

2023-03-05 Thread Guillaume Piolat via Digitalmars-d-learn

On Sunday, 5 March 2023 at 06:36:05 UTC, novice2 wrote:

It there any recipe to compile x64 .dll without dependencies?

I mean it shoud be used without installing things like 
msvcr120.dll.

Dependencies on system dll (advapi32.dll, kerner32.dll) is ok.

I don't experiment on linux yet. But interest too.


What we do here in dub.json, for no deps on big 3 desktop OSes:

"targetType": "dynamicLibrary",
"dflags-linux-dmd": ["-defaultlib=libphobos2.a"],
"dflags-osx-ldc": ["-static"],
"dflags-linux-ldc": ["-link-defaultlib-shared=false"],
"dflags-linux-x86_64-ldc": ["-fvisibility=hidden"],
"dflags-windows-ldc": 
["-mscrtlib=libcmt","-fvisibility=hidden", 
"-link-defaultlib-shared=false"],



Additionally on (Windows + DUB + LDC), you will need to set an 
envvar:

DFLAGS=-fvisibility=hidden -dllimport=none

else you may still depend upon a dynamic phobos.
It's unfortunate situation for such a common requirement...


Re: Using Windbg to debug D applications and unittests

2023-03-05 Thread Basile B. via Digitalmars-d-learn

On Saturday, 4 March 2023 at 19:19:26 UTC, Chris Piker wrote:

On Monday, 27 February 2023 at 12:09:50 UTC, Basile B. wrote:
At least this is what is done for the Dexed GDB widget, so 
that gdb breaks automatically when an Error or an Exception is 
new'd 
(https://gitlab.com/basile.b/dexed/-/blob/master/src/u_gdb.pas#L2072).


Glad you mentioned Dexed.  I Had been meaning to try it out but 
forgot about it.  I just downloaded the deb and will give it a 
go.  Thanks!


The GDB widget wont work on windows I think. The point of my 
first answer was just to show you how to  automatically break 
when something is thrown.