Nat! bio photo


Senior Mull

Twitter Github Twitch

mulle-objc 0.20 Release


Well happy new year to you all.

It’s a new year and lets get it started with the mulle-objc 0.20 release.

But lets reminisce about the good old days first, which were … 2021!

Looking back on 2021

For a “hobby” project, mulle-objc and its toolset are quite beefy. I put the repositories into OpenHub, and these are the results:

Organization Language Lines of Code COCOMO Years
MulleWeb Objective-C 49213 12
MulleFoundation Objective-C 135902 34
mulle-objc C 74012 18
mulle-core C 19481 5
mulle-concurrent C 15500 4
mulle-c C 40830 10
mulle-sde shell script 85485 22
mulle-bashfunctions shell script 5974 2
mulle-project shell script 9389 3
Total   435786 110

110 years of developer time have been spent on mulle-objc! And who am I to disagreee with the COCOMO model… The statistics are for the 0.19 version and don’t contain the compiler or the debugger.

mulle-objc is somewhat of an iceberg. I would guess that there is just about the same amount of library code already written, which hasn’t been released yet. For example MulleUI is coming along nicely and it, or parts of it, may see a release this year.


Turning back to the present and the 0.20 release, here is another statistic. The total number of repositories pushed to github by the mulle-objc 0.20 release was 87. Getting this accomplished typically takes a week, and it wouldn’t be feasible without mulle-project.

I still would like to see the time cut down significantly, but the automation is already quite high. Most of the time spent during a release is fixing bugs. So with my coders hat on, it’s not like completely wasted time in terms of the development of the project.


As I am currently jobless, I can spend much more time on mulle-objc. So I would expect the pace of development to accelerate significantly. The long term goal of mulle-objc is still cross-platform Application development. There is a roadmap for the next five years, but I don’t want to make any promises, so I keep the roadmap close to my heart and secret :)

What’s new ?

Project structure

A look at a typical mulle-sde executable project as would be generated by mulle-sde init -m mulle-objc/objc-developer, reveals:

├── cmake
│ ├──
│ ├── reflect
│ │   ├── _Dependencies.cmake
│ │   ├── _Headers.cmake
│ │   ├── _Libraries.cmake
│ │   ├──
│ │   ├── _Resources.cmake
│ │   └── _Sources.cmake
│ └── share
│     ├── AAMSupportObjC.cmake
│     ├──
│     ├── ...
│     └── UnwantedWarningsC.cmake
├── CMakeLists.txt
└── src
    ├── demo-version.h
    ├── generic
    │   ├── import.h
    │   ├── import-private.h
    │   ├── include.h
    │   ├── include-private.h
    │   └──
    ├── main.m
    └── reflect
        ├── _demo-export.h
        ├── _demo-import.h
        ├── _demo-import-private.h
        ├── _demo-include.h
        ├── _demo-include-private.h
        ├── _demo-include-public.h
        ├── _demo-provide.h
  1. There is now a _Resources.cmake in cmake/reflect. Images, text files and sound files with common file extension like jpg or wav will be automatically categorized as a resource. Of course the list of file extensions is extensible with mulle-match patternfiles.
  2. There are a lot of little files all over the place, that explain, what the directory should contain and what each file does. In an ideal world each file or directory in a mulle-objc project should be self-documenting or leading to documentation. These are steps in this direction.
  3. The “generic” headers like import.h are now in their own directory “generic”. This has advantages for header motility. I should/will be writing a separate article on this in my generic header article series.

If you look inside the generated files, like in this instance cmake/share/UnwantedWarnings.cmake, you will find a footer like this:

# extension : mulle-c/c-cmake
# directory : project/all
# template  : .../UnwantedWarningsC.cmake
# Suppress this comment with `export MULLE_SDE_GENERATE_FILE_COMMENTS=NO`

This will tell you which extension place this file there during installation, which should make extsnsion a little easier to manager. Also you can inherit mulle-sde extensions with your own extensions. So the file comments should make customizing mulle-sde for your purposes a lot easier.

I have also tried to improve the usage texts for many of the mulle-sde commands.

Framework support

The new CMake templates now support the building of libraries as Frameworks on the macos/darwin platform.

Objective-C core types

I abandoned mulle_utf8_t as the UTF8 character type and went back to char. This makes C string methods easier to interface with C. Also char * is UTF8 in mulle-objc by default, so it just seemed right.

id is pointer to an object. void * is a pointer to anything. NSInteger is supposed to be able to be big enough to hold a void *. That would be intptr_t. Now the problem is that for printf there is not modifier to print intptr_t. But there is for ptrdiff_t. I hereby declare that sizeof(NSInteger) == sizeof( inptr_t) == sizeof( ptrdiff_t) holds true for mulle-objc. That way one van use "%td" to print NSInteger. It’s nice to own the language :)

Together with mulle-fprintf it’s now possible to write:

   mulle_printf( "last: %@ length: %td\n, [array lastObject], [array count]);

Notice that the format string is a C-string. But an object gets formatted with "%@" and there is no need for casting NSUInteger.


As my old company Codeon is no longer, I moved the compiler and the debugger into a new home. They are now in mulle-cc. The big change is noticable for homebrew users, as the old tap “Codeon-GmbH” won’t give them the new compiler. This should do the trick:

brew untap Codeon-GmbH/software
brew tap mulle-cc/software

There have been a ton of changes with regards to mulle-sde. It’s too much to cover in the release notes. Let me drop a few buzzwords:

  • macros for loops
  • improved include system
  • fake namespacing
  • precompiled headers

I will probably write a few articles about all the changes.

All tools have been improved in terms of clarity of the documentation and execution speed. Also there are less bugs…

So if something is unclear or you find a bug somewhere, by all means hit that “issue” button on some project and let me know.

Also last but not least, mulle-objc is now sponsored by Jetbrains. Thanks for the support.

A happy 2022 to everybody, it’s gonna be a good year for Objective-C.

Release Notes

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


There were a few fixes but no substantial changes in MulleWeb,

RELEASENOTES Version mulle-objc 0.19 version
MulleBase64 0.0.2 0.0.1
MulleZlib 0.15.6 0.15.5
MulleCurl 0.17.5 0.17.4
MulleHoedown 0.2.4 0.2.3
MulleObjCJSMNFoundation 0.18.2 0.18.1
MulleObjCHTTPFoundation 0.18.2 0.18.1
MulleObjCInetFoundation 0.18.2 0.18.1
MulleCivetWeb 0.17.6 0.17.5
MulleWebClient 0.0.6 0.0.5
MulleWebServer 0.0.6 0.0.5
MulleScion 1859.1.8 1859.1.7
MulleScionHTMLPreprocessor 0.2.4 0.2.3
mulle-scion 1859.1.7 1859.1.6


The most interesting changes are found in MulleObjCPlistFoundation, MulleObjCOSFoundation, MulleObjCValueFoundation. Overall not a lot has changed here.

RELEASENOTES Version mulle-objc 0.19 version
MulleObjCArchiverFoundation 0.20.0 0.19.0
MulleObjCCalendarFoundation 0.20.0 0.19.0
MulleObjCContainerFoundation 0.20.0 0.19.0
MulleObjCExpatFoundation 0.20.0 0.19.0
MulleObjCInetOSFoundation 0.20.0 0.19.0
MulleObjCKVCFoundation 0.20.0 0.19.0
MulleObjCLockFoundation 0.20.0 0.19.0
MulleObjCMathFoundation 0.20.0 0.19.0
MulleObjCOSFoundation 0.20.0 -
MulleObjCPlistFoundation 0.20.0 0.19.0
MulleObjCStandardFoundation 0.20.0 0.19.0
MulleObjCUnicodeFoundation 0.20.0 0.19.0
MulleObjCValueFoundation 0.20.0 0.19.0
MulleFoundation 0.20.0 0.19.0
Foundation 0.20.0 0.19.0
objc-compat 0.20.0 0.19.0
mulle-bunchobjects 0.20.0 0.19.0
mulle-testgen 0.20.0 0.19.0
MulleObjCStandardFoundation-startup 0.20.0 0.19.0
MulleFoundation-startup 0.20.0 0.19.0
Foundation-startup 0.20.0 0.19.0
mulle-foundation-developer 0.20.0 0.19.0
foundation-developer 0.20.0 0.19.0


mulle-objc-runtime has spawned mulle-objc-debug. This reduces the compiled size of mulle-objc-runtime significantly. mulle-objc-runtime and its internal structures have seen an overhaul.

RELEASENOTES Version mulle-objc 0.19 version
mulle-objc-runtime 0.20.0 0.19.0
mulle-objc-runtime-startup 0.20.0 0.19.0
mulle-objc-list 0.20.0 0.19.0
mulle-objc-debug 0.20.0 -
MulleObjC 0.20.0 0.19.0
MulleObjC-startup 0.20.0 0.19.0
mulle-objc-compat 0.20.0 0.19.0
mulle-objc-developer 0.22.0 0.21.0

At the moment all mulle-objc and MulleFoundation projects still have a synced version number. This was supposed to change, but hasn’t except for mulle-objc-developer…


mulle-cc is a new github org, that holds the mulle-clang compiler and the mulle-gdb debugger. A Windows (Visual Studio) download is available for the compiler for the first time. The mulle-lldb debugger has been dropped.

RELEASENOTES Version mulle-objc 0.19 version


mulle-fprintf interfaces mulle-sprintf with <stdio.h>. It’s the new default printf for mulle-objc (say bye bye to NSLog). There have been function name and signature changes in mulle-sprintf.

mulle-time is new. It provides an interface to the OS clock.

RELEASENOTES Version mulle-objc 0.19 version
mulle-atexit 0.0.10 0.0.9
mulle-atinit 0.0.7 0.0.6
mulle-dlfcn 0.0.8 0.0.7
mulle-fprintf 0.0.1 -
mulle-mmap 0.1.1 0.1.0
mulle-sprintf 2.0.0 1.0.20
mulle-stacktrace 0.2.4 0.2.3
mulle-testallocator 4.2.4 4.2.3
mulle-time 0.1.0 0.0.1


There is a new project mulle-mutififo, which can be useful for fixed size pipes between multiple threads.

RELEASENOTES Version mulle-objc 0.19 version
mulle-aba 2.0.22 2.0.21
mulle-concurrent 2.2.11 2.2.10
mulle-fifo 0.0.2 0.0.1
mulle-multififo 0.0.1 -
mulle-thread 4.4.0 4.3.0


mulle-container has gotten a major bump as I consolidated and orthogonalized the API over the various data structures. mulle-utf can now do some character set conversions.

RELEASENOTES Version mulle-objc 0.19 version
mulle-c11 4.1.2 4.1.1
mulle-allocator 4.2.4 4.2.3
mulle-data 0.0.3 0.0.2
mulle-buffer 3.1.0 3.0.0
mulle-container 6.0.0 5.0.0
mulle-http 0.1.3 0.1.2
mulle-unicode 2.4.3 2.4.1
mulle-url 2.3.3 2.3.2
mulle-utf 3.1.0 3.0.1
mulle-vararg 1.1.2 1.1.1
mulle-c-developer 0.14.0 0.13.2


Because every function in each mulle-sde project has been renamed, the version needed to be bumped a major version I felt. In fairness the project is getting dangerously close to a real 1.0. I still feel I need to have a more beginner friendly way of creating sourcetrees in order to “market” this a bit more aggressively. But maybe soon…

RELEASENOTES Version mulle-objc 0.19 version
mulle-craft 1.0.0 0.19.0
mulle-dispense 3.0.0 2.0.2
mulle-domain 1.0.0 0.0.1
mulle-env 4.0.1 3.4.0
mulle-fetch 3.0.0 2.0.0
mulle-make 1.0.0 0.16.0
mulle-match 1.0.0 0.8.0
mulle-monitor 1.0.0 0.9.2
mulle-platform 1.0.0 0.5.0
mulle-sde 1.0.1 0.47.0
mulle-semver 1.0.0 0.0.1
mulle-sourcetree 1.0.0 0.25.0
mulle-template 1.0.0 0.0.4
mulle-test 6.0.0 5.3.1
mulle-sde-developer 0.23.0 0.22.0


mulle-bashfunction has lost a lot of unused API. The way scripts should load mulle-bashfunctions has also changed. Last but not least mulle-bashfunctions-env has been renamed to mulle-bashfunction

RELEASENOTES Version mulle-objc 0.19 version
mulle-bashfunctions 4.0.0 3.4.0
mulle-project 3.0.0 2.4.0

Post a comment

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

E-mail: (not published)