ICM is a communication mechanism that can be used for sending messages in an asyncronous fashion between agents. It supports queuing of messages, and is designed as a transportation method for ACLs (agent communication languages). It was developed at the Fujitsu Labs, and is under the LGPL.

Qu-Prolog supports ICM communication features for symbolic communication. As part of the porting process for porting Qu-Prolog to Win32, ICM was needed to be ported. While ICM does compile perfectly well under Cygwin, the licencing of Cygwin may cause potential difficulties when linking applications to the ICM libraries. In addition to this, it appears that it is very hard (if it is possible at all) to link native Win32 software against Cygwin-compiled libraries. As a result, a native port was done. Both the Cygwin process and the native port are described below.

Porting ICM to native windows was initially thought to be a great challenge. Porting, however, took a little under two days. It should be noted that ICM is written C, and as a result is much more portable than Qu-Prolog, which is in C++. Using a rosetta stone of function and include translations developed during the Qu-Prolog port, it was relatively quick to port the code across.

This source should be considered somewhat dirty. While sending and recieving messages and queuing messages does work fine, and Qu-Prolog appears to use it with no problems, it was done for expediency, not for good programming practice. When time permits a proper patch will be submitted to the maintainers at the SourceForge project.

Compiling ICM under Cygwin was very quick and easy. Unfortunately, this code may not be distributed as ICM is both GPL and LGPL (the ICM library is) and Cygwin is GPL. Fortunately, however, the LGPL contains the following clause:

3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices.

Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy.

This option is useful when you wish to copy part of the code of the Library into a program that is not a library.

Note on Cygwin:

Initially the idea was suggested to link the native Qu-Prolog against a Cygwin ported ICM. Cygwin compiled libraries, however, are almost impossible to link against from native windows software according to the documentation. As ICM was only a small project, a native Win32 port was started instead to see how difficult it would be.