Nat! bio photo


Senior Mull

Twitter Github Twitch

mulle-objc 0.21 Release


How to update

To update an existing mulle-objc project, you should clean the (global) archive cache and throw away the old downloaded dependencies in stash. Then upgrade the project and rebuild:

mulle-sde -f clean cache
mulle-sde -f clean tidy
mulle-sde upgrade
mulle-sde craft

This should give you no trouble.

What’s new ?

There are some new features and improvements, including a technological world premiere and … some breakage.

Colorization for terminal output

In logging statements color output can be very helpful to quickly scan output lines for the same object. There is a new method -colorizedUTF8String which will be used by the printf extension format “%#@” to print a colorized description of the object.

Implementing a colorization for an object can look like this:

- (int) colorizerColorCode
   return( 111); // 256 color terminal code

- (char *) colorizerPrefixUTF8String
   char   *s;
   int    color;

   color = [self colorizerColorCode]
   mulle_asprintf( &s, "\033[38;5;%dm", color);
   return( MulleObjCAutoreleaseAllocation( s, NULL));

-colorizerPrefixUTF8String and -colorizerSuffixUTF8String will be called by -[NSObject colorizedUTF8String].

mulle_asprintf will create a malloced terminal color string, which will be returned autoreleased.

C callbacks for NSThread

NSThread is very convenient to start a new thread. Yet until now, to just let a small function run, you needed a class and a method. Now you can just pass in a C function and some user info.

+ (void) mulleDetachNewThreadWithFunction:(MulleThreadFunction_t *) f
                                 argument:(void *) argument;

+ (instancetype) mulleInitWithFunction:(MulleThreadFunction_t *) f
                              argument:(void *) argument;

Support for static Objective-C executables (Linux)

With musl libc instead of glibc as the standard C library it becomes possible to create Objective-C executables that do not need any shared libraries. mulle-markdown is an example of such a standalone executable.

As far as I know, a fully statically linked Objective-C executable has never been done before, so I claim this as “World Premiere Tech” 😉

Support for Jetbrains / CLion

You can now conveniently set up a basic mulle-sde CLion project with

mulle-sde extension add idea

Setup the default toolchain, to use “mulle-clang” as your C compiler and “mulle-gdb” as your debugger and you should be ready to develop mulle-objc projects in CLion.

Improved Windows support

Some time as been expended to make mulle-objc work on Windows (WIN32). The tooling should be OK and the libraries up to MulleObjC should work. There hasn’t been enough effort yet to achieve proper Windows support in MulleObjCLockFoundation and MulleObjCOSFoundation.

You use WSL to build native versions of the mulle-objc libraries, and you can then use the native mulle-clang-cl.exe in Visual Studio as the Objective-C compiler.

mulle-sde config switch

I am writing a graphics library, that I want to base on multiple backends. This library called MulleUI has a dependency named MulleUIOS, which can be based on either libsdl or glfw. With config select i can now choose between two different sets of dependencies. MulleUIOS has two sourcetrees alternatives. “config is the default and “sdl” is the alternative. MulleUIOS usually selects glfw, and the projects headers and cmake files are “reflected” for it.

With mulle-sde config switch you can now choose in “MulleUI” the sourcetree that “MulleUIOS” should use. This is done via an environment setting in the main project. This will force on the next craft a new “reflect” in “MulleUIOS”, which changes the C headers and cmake files in “MulleUIOS”. So for example the source code in “MulleUIOS” changes from #include <libsdl.h> to #include <GLFW.h> or vice versa.

Foundation brew formula is broken (MacOS)

Unfortunately the ‘homebrew’ formula for Foundation.rb is broken. It seems to me, that the brew project really goes out of its way to make things as cumbersome as possible for formula writers. You can still build the Foundation with mulle-sde with no problems though, but it’s just not possible to use mulle-sde within a brew formula to fetch something via curl…

Raspberry PI llvm build is broken

The llvm code base does not compile with the old gcc compiler delivered with bullseye and the clang of bullseye crashes when compiling lib/Target/AArch64/AArch64ISelLowering.cpp.

Release Notes

This is the list of release notes of the various projects. Enjoy the read :)


The most interesting change is the addition of MulleObjCTimeFoundation, which was spawned by MulleObjCOSFoundation and MulleObjCValueFoundation as a home for NSDate and NSTimer. Overall not a lot has changed here.

RELEASENOTES Version mulle-objc 0.20 version
MulleObjCArchiverFoundation 0.20.1 0.20.0
MulleObjCCalendarFoundation 0.20.1 0.20.0
MulleObjCContainerFoundation 0.20.1 0.20.0
MulleObjCExpatFoundation 0.20.2 0.20.1
MulleObjCInetOSFoundation 0.20.1 0.20.0
MulleObjCKVCFoundation 0.20.1 0.20.0
MulleObjCLockFoundation 0.20.1 0.20.0
MulleObjCMathFoundation 0.20.1 0.20.0
MulleObjCOSFoundation 0.21.0 0.20.0
MulleObjCPlistFoundation 0.20.1 0.20.0
MulleObjCStandardFoundation 0.20.1 0.20.0
MulleObjCTimeFoundation 0.0.1 -
MulleObjCUnicodeFoundation 0.20.1 0.20.0
MulleObjCValueFoundation 0.21.0 0.20.0
Foundation 0.21.0 0.20.0
MulleFoundation 0.21.0 0.20.0
objc-compat 0.20.1 0.20.0
mulle-bunchobjects 0.20.1 0.20.0
mulle-testgen 0.20.1 0.20.0
MulleObjCStandardFoundation-startup 0.20.1 0.20.0
Foundation-startup 0.20.1 0.20.0
MulleFoundation-startup 0.20.1 0.20.0
mulle-foundation-developer 0.21.0 0.20.0
foundation-developer 0.20.1 0.20.0


There is a new project mulle-markdown. It’s a small executable to convert markdown to HTML. It’s a showcase for the use of musl with mulle-objc, to produce a self-contained executable with no shared libraries linked.

Otherwise there have been no real changes to MulleWeb.

RELEASENOTES Version mulle-objc 0.20 version
MulleObjCHTTPFoundation 0.18.3 0.18.2
MulleObjCInetFoundation 0.18.3 0.18.2
MulleObjCJSMNFoundation 0.18.3 0.18.2
MulleBase64 0.0.3 0.0.2
MulleCivetWeb 0.17.7 0.17.6
MulleCurl 0.17.6 0.17.5
MulleZlib 0.15.7 0.15.6
MulleHoedown 0.2.5 0.2.4
MulleWebClient 0.0.7 0.0.6
MulleWebServer 0.0.7 0.0.6
MulleScion 1859.1.9 1859.1.8
MulleScionHTMLPreprocessor 0.2.5 0.2.4
mulle-scion 1859.1.8 1859.1.7
mulle-markdown 0.0.1 -


Finally the synced version numbers are a thing of the past. It’s expected that mulle-objc-runtime and MulleObjC remain syned, but the others will likely fall behind (and have fallen behind).

New is the addition of mulle-musl-gcc for support of the musl C library.

RELEASENOTES Version mulle-objc 0.20 version
mulle-objc-runtime 0.21.0 0.20.0
mulle-objc-debug 0.20.1 0.20.0
mulle-objc-list 0.20.1 0.20.0
mulle-musl-gcc 0.0.1 -
mulle-objc-compat 0.20.1 0.20.0
MulleObjC 0.21.0 0.20.0
MulleObjC-startup 0.20.1 0.20.0
mulle-objc-runtime-startup 0.20.1 0.20.0
mulle-objc-developer 0.23.0 0.22.0


mulle-gdb remains essentially unchanged, but follows the gdb version. The mulle-clang compiler received an update to the newest llvm version and a code generation bug was fixed.

RELEASENOTES Version mulle-objc 0.20 version


mulle-fprintf and mulle-sprintf have seen some significant changes.

mulle-time now distinguishes between “calendar” time and a process’ “absolute” time.

RELEASENOTES Version mulle-objc 0.20 version
mulle-atexit 0.0.11 0.0.10
mulle-atinit 0.0.8 0.0.7
mulle-dlfcn 0.0.9 0.0.8
mulle-fprintf 0.1.0 0.0.1
mulle-mmap 0.1.2 0.1.1
mulle-sprintf 2.1.0 2.0.0
mulle-stacktrace 0.2.5 0.2.4
mulle-testallocator 4.2.5 4.2.4
mulle-time 1.0.0 0.1.0


There is nothing new for mulle-concurrent.

RELEASENOTES Version mulle-objc 0.20 version
mulle-thread 4.4.1 4.4.0
mulle-fifo 0.0.3 0.0.2
mulle-aba 2.0.23 2.0.22
mulle-concurrent 2.2.12 2.2.11
mulle-multififo 0.0.2 0.0.1


mulle-c11 is now supporting Windows better. There is now support for the musl C library (Linux/FreeBSD only).

RELEASENOTES Version mulle-objc 0.20 version
mulle-c11 4.2.0 4.1.2
mulle-allocator 4.2.5 4.2.4
mulle-data 0.1.0 0.0.3
mulle-buffer 3.2.0 3.1.0
mulle-container 6.1.0 6.0.0
mulle-http 0.1.4 0.1.3
mulle-musl-gcc 0.0.1 -
mulle-unicode 2.4.4 2.4.3
mulle-url 2.3.4 2.3.3
mulle-utf 3.1.1 3.1.0
mulle-vararg 1.1.3 1.1.2
mulle-c-developer 0.15.0 0.14.0


mulle-sde sees a major new feature, with the addition of multiple sourcetrees per project. This makes large projects like the MulleFoundation more easily configurable.

RELEASENOTES Version mulle-objc 0.20 version
mulle-craft 2.0.0 1.0.0
mulle-dispense 3.1.0 3.0.0
mulle-domain 1.0.1 1.0.0
mulle-env 4.1.0 4.0.2
mulle-fetch 3.0.1 3.0.0
mulle-make 1.1.0 1.0.0
mulle-match 1.0.1 1.0.0
mulle-monitor 1.0.1 1.0.0
mulle-platform 1.0.1 1.0.0
mulle-sde 1.1.0 1.0.1
mulle-semver 1.0.1 1.0.0
mulle-sourcetree 1.1.0 1.0.0
mulle-template 1.0.1 1.0.0
mulle-test 6.1.0 6.0.1
mulle-sde-developer 0.24.0 0.23.0


mulle-project now contains the convenient mulle-gitignore script!

RELEASENOTES Version mulle-objc 0.20 version
mulle-bashfunctions 4.1.0 4.0.0
mulle-project 3.1.0 3.0.0

Post a comment

All comments are held for moderation; basic HTML formatting accepted.

E-mail: (not published)