www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Build/install errors on Linux with LinuxBrew/HomeBrew


Not sure if this is the right place (if not, please point me to the right
person/mailing list).
My issue deals with installing the latest dmd (2.065.0) on Linux 64bit through
LinuxBrew/HomeBrew system (so, not easy to tell who to contact).

The simple fixes are here:

But I thought to get an opinion from the relevant D people before sending a
Pull-Request to HomeBrew.
To the best of my understanding, these minor changes should not cause any
problems for MacOS-X homebrew installation, but they will enable LinuxBrew


The installation fails ("brew install dmd"), and it is caused by three separate

1. For phobos 2.065.0, on linux 64bit,
   make install -f posix.max
instead of
   make -f posix.max && make install -f posix.max

doesn't properly create the share objects (only the static ".a" library).
(see log below).
While this is probably a problem with Phobo's posix.mak, version 2.065.0 is
already released and can't be changed.
I assume this is not a problem for MacOS build, so "homebrew" doesn't fail. But
"linuxbrew" does fail.

I suggest a small addition to the 'dmd.rb' formula, to first run "make" without

2. The HomeBrew 'dmd.rb' formula contains the following code to set the dmd
     inreplace bin/'dmd.conf', "DFLAGS=-I% P%/../../src/phobos
-I% P%/../../src/druntime/import -L-L% P%/../lib",
                               "DFLAGS=-I#{prefix}/import -L-L#{lib}"
It replaces the default values from "./ini/XXX/bin/dmd.conf" to the ones
suitable for homebrew.

But there's a catch:
For MacOS-X, the default config has only one line which ends with "lib", and
the replacement works.
For Linux, the default config has two lines, one ends with "lib32" and the
other ends with "lib64".
So the replacement above is partial, and ends up with an invalid "dmd.conf".
If "-L-L#{lib}" (set by homebrew) is "../linuxbrew/Cellar/dmd/2.065.0/lib", the
final conf file will have ".../linuxbrew/Cellar/dmd/2.065.0/lib32" and
".../linuxbrew/Cellar/dmd/2.065.0/lib64" - both don't exist and the
configuration is invalid.

I suggest a small change, instead of replacing a fixed string, replace a regex
for the DLANG line.

3. The 'dmd.rb' formula copies the configuration file to the Homebrew's "etc"
directory - but not if there's already a file there.
So, if the existing HomeBrew "dmd.conf" exists and contains invalid data (e.g
to a previous homebrew version, or a bad install),
it is not updated by the new install.
This is perhaps a "homebrew" issue, but it affects the dmd formula which I'm
trying to fix.

This can be replicated by:
     $ brew uninstall dmd
     $ echo "Foo Bar" > $HOMEBREWDIR/etc/dmd.conf
     $ brew install dmd
     # Installation will fail, because "dmd.conf" was not updated, and is

A small fix to the formula deletes an old dmd.conf if it exists.

==== Example of Phobos on Linux64 not creating the shared object ====
$ cd src/phobos/
$ rm generated/linux/release/64/lib*
$ make -f posix.mak install
make --no-print-directory OS=linux -f posix.mak MODEL=64 BUILD=release
INSTALL_DIR=../install \
		DMD=../dmd/src/dmd install2
make -C ../druntime -f posix.mak MODEL=64 DMD=../dmd/src/dmd OS=linux
make[2]: Nothing to be done for `target'.
../dmd/src/dmd -I../druntime/import  -w -d -m64  -O -release -lib
../druntime/lib/libdruntime-linux64.a std/algorithm.d std/array.d std/ascii.d
std/base64.d std/bigint.d std/bitmanip.d std/compiler.d std/complex.d
std/concurrency.d std/container.d std/conv.d std/cstream.d std/csv.d
std/datetime.d std/demangle.d std/encoding.d std/exception.d std/file.d
std/format.d std/functional.d std/getopt.d std/json.d std/math.d
std/mathspecial.d std/metastrings.d std/mmfile.d std/numeric.d std/outbuffer.d
std/parallelism.d std/path.d std/process.d std/random.d std/range.d std/regex.d
std/signals.d std/socket.d std/socketstream.d std/stdint.d std/stdio.d
std/stdiobase.d std/stream.d std/string.d std/syserror.d std/system.d
std/traits.d std/typecons.d std/typetuple.d std/uni.d std/uri.d std/utf.d
std/uuid.d std/variant.d std/xml.d std/zip.d std/zlib.d std/c/linux/linux.d
std/c/linux/socket.d etc/c/curl.d etc/c/sqlite3.d etc/c/zlib.d std/c/fenv.d s
le.d std/c/math.d std/c/process.d std/c/stdarg.d std/c/stddef.d std/c/stdio.d
std/c/stdlib.d std/c/string.d std/c/time.d std/c/wcharh.d
std/internal/digest/sha_SSSE3.d std/internal/math/biguintcore.d
std/internal/math/biguintnoasm.d std/internal/math/biguintx86.d
std/internal/math/gammafunction.d std/internal/math/errorfunction.d
std/internal/processinit.d std/internal/uni.d std/internal/uni_tab.d
std/internal/unicode_tables.d std/internal/unicode_comp.d
std/internal/unicode_decomp.d std/internal/unicode_grapheme.d
std/internal/unicode_norm.d std/net/isemail.d std/net/curl.d
std/digest/digest.d std/digest/crc.d std/digest/md.d std/digest/ripemd.d
std/digest/sha.d generated/linux/release/64/etc/c/zlib/adler32.o
generated/linux/release/64/etc/c/zlib/gzlib.o generated/linux/release/64/etc/c/
ad.o generated/linux/release/64/etc/c/zlib/gzwrite.o
mkdir -p ../install/lib
cp generated/linux/release/64/libphobos2.a ../install/lib/
cp -P generated/linux/release/64/libphobos2.so.0.65.0
generated/linux/release/64/libphobos2.so ../install/lib/
cp: cannot stat ‘generated/linux/release/64/libphobos2.so.0.65.0’: No such file
or directory
cp: cannot stat ‘generated/linux/release/64/libphobos2.so.0.65’: No such file
or directory
cp: cannot stat ‘generated/linux/release/64/libphobos2.so’: No such file or
make[1]: *** [install2] Error 1
make: *** [install] Error 2
Mar 11 2014