#ifdef IH
    string spchStr()            // join all SPCH -o option values and surround
    {                           // them by one set of single quotes
        string ret;
        for (int idx = 0, end = listlen(g_spch); idx != end; ++idx)
        {
            if (g_spch[idx] != "-o")
                ret += g_spch[idx] + ' ';
            else    // specify all following words as -o arguments
            {
                for (++idx; idx != end; ++idx)
                    ret += "-o " + g_spch[idx] + ' ';
                break;
            }
        }
        return ret;
    }
#ifdef USING_ARGS
    string tailArgs()
    {
        string ret;
        for (int idx = 1, end = listlen(g_spchArgs); idx != end; ++idx)
            ret += ' ' + g_spchArgs[idx];
        return ret;
    }
#endif
    void precompileSPCH()
    {
        string str = spchStr();         // surround all -o arguments by one 
                                        // pair of single quotes
#ifdef USING_ARGS
        system("icmake -S -a " + g_spchArgs[0] + " -i " + IH + ' ' + 
                str + "tmp/spch.gch" + tailArgs());
#else
        system("icmake -S -a " + g_spchArgs[0] + " -i " + IH + ' ' + 
                str + "tmp/spch.gch");
#endif
    }
#else
    void precompileSPCH()
    {
        requireIH("SPCH");
    }
#endif
