Package manager - interacting with the compiler
jdrewsen
jdrewsen at nospam.com
Mon Dec 12 03:45:26 PST 2011
On Sunday, 11 December 2011 at 21:22:37 UTC, Jacob Carlborg wrote:
> On 2011-12-10 22:17, jdrewsen wrote:
>> On Saturday, 10 December 2011 at 08:55:57 UTC, Jacob Carlborg
>> wrote:
>>> I think I've come so far in my development of a package
>>> manager that
>>> it's time to think how it should interact with the compiler.
>>>
>>> Currently I see two use cases:
>>>
>>> 1. When the package manager installs (and builds) a package
>>>
>>> 2. When a user (developer) builds a project and want's to use
>>> installed packages
>>>
>>> In the best of worlds the user wouldn't have to do anything
>>> and it
>>> just works. The package manger needs to somehow pass import
>>> paths to
>>> the compiler and libraries to link with.
>>>
>>> I'm not entirely sure what the best method to do this would
>>> be. But
>>> I'm thinking that if the compiler could accept compiler flags
>>> passed
>>> via environment variables use case 1 would be easy to
>>> implement.
>>>
>>> For use case 2 it would be a bit more problematic. In this
>>> use case
>>> the user would need to somehow tell the package manager that
>>> I want to
>>> use these packages, something like:
>>>
>>> // project.obspec
>>> orb "foo"
>>> orb "bar"
>>>
>>> $ orb use project.obspec
>>>
>>> or for single packages
>>>
>>> $ orb use foobar
>>> $ dmd project.d
>>>
>>> If environment variables are used in this case, then the
>>> package
>>> manager would need a shell script wrapper, the same way as
>>> DVM does
>>> it, to be able to set environment variables for the parent
>>> (the
>>> shell). The reason for this is that a child process (the
>>> package
>>> manager) can't set environment variables for the parent
>>> process (the
>>> shell). This complicates the implementation and installation
>>> of the
>>> package manager and requires different implementations for
>>> Posix and
>>> Windows.
>>>
>>> Another idea would be to manipulate the dmd.conf/sc.ini file
>>> but that
>>> seems to be quite complicated and messy. On the other hand,
>>> this
>>> wouldn't require any changes to the compiler.
>>>
>>> Any other ideas?
>>>
>>> https://github.com/jacob-carlborg/orbit/wiki/Orbit-Package-Manager-for-D
>>> https://github.com/jacob-carlborg/orbit
>>
>> For use case 1 the package manager could just as well call dmd
>> directly
>> with the correct flags ie. no need for using environment
>> variables.
>
> I was thinking that the package manager just invokes a build
> tool like make, rdmd, dsss, shell script and so on.
>
>> Use case 2 does not belong to a package manager in my opinion.
>> It is the job
>> of a build tool to configure packages for a project. What
>> would be nice
>> to have support for using packages without a build tool. Maybe
>> something
>> like what pkg-config provides:
>>
>> dmd -ofhello `orb -lib foo` hello.d where "org -lib foo"
>> returns the
>> flags to use the foo package.
>>
>> /Jonas
>
> I would say that the preferred way is to use a build tool then
> there is no problem. The build tool just asks the package
> manager which import paths to use for the given packages and
> pass the information to the compiler. But I don't want my
> package manager to depend on a built tool, I want it to be
> usable on its own.
And for that I think the pkg-config method is the way to go.
Setting environment vars brings unneeded state into you
development session.
Another option would be to just wrap dmd in a e.g. orbdmd command
and handle it there.
Btw: have you considered renaming from orb to something that
makes sense to newbies e.g. dpack?
-Jonas
More information about the Digitalmars-d
mailing list