M++ (Make++) - это язык и утилита командной строки, главным назначением которых является управление процессом компиляции и линковки программных проектов. По своему основному назначению M++ является аналогом утилиты make.
Отличием M++ от make является то, что язык M++ предназначен не для прямого написания make-правил (т.е. правил, управляющих зависямостями и процессом их построения). Вместо этого M++ предоставляет возможность создавать шаблоны для наиболее распространненых типов проектов и правила преобразования этих шаблонов в конкретные make-правила.
Благодоря шаблонам работа с проектом упрощается, т.к. необходимо только заполнять предусмотренные шаблоном поля (переменные), а не заботиться об вызовах транслятора, линкера, указания им нужных ключей и т.д. M++ содержит средства адаптации правил преобразования шаблонов к различным операционным системам и семействам компиляторов. В результате проект, построенный на основе шаблона, может быть легко перенесен на другую операционную систему и/или компилятор, т.к. в нем не будет обращения к именам конкретных утилит и инструментов.
M++ уже содержит готовую библиотеку шаблонов для управления проектами на языке C++. Эту библиотеку можно использовать непосредственно или адаптировать к собственным нуждам. Это возможно, т.к. правила преобразования шаблонов так же написаны на языке M++ и храняться в виде исходных текстов.
M++, начиная с версии 4.0, не привязана непосредственно к управлению процессом компиляции проекта. Более правильно будет говорить о том, что M++ это язык и набор функций (M++ API), доступных в этом языке. Важнейшую часть M++ API составляют функции для построения и выполнения make-правил. Но M++ может использоваться и для любых других задач, в которых требуется запуск команд (утилит) операционной системы и программ. В этом смысле M++ является аналогом языков управления командного процессора (например, как язык shell в UNIX).
Допустим, что мы хотим скомпилировать традиционный пример "Hello, world". Для этого:
#include <iostream.h> int main() { cout << "Hello, world!" << endl; return 0; }
#include <start.4xx> appMode = "exe"; screenMode = "console"; target = "hello"; cppSource += "hello.cpp"; #include <finish.4xx>
mxxc -f hello.4xx
Полученный файл hello.4xx содержат все необходимые для M++ указания по поводу построения проекта. При этом проектный файл не содержит чего-либо специфического для операционной системы и семейства компиляторов. Поэтому его легко перенести на другую платформу и/или компилятор, не изменив при этом ни строчки в проектном файле.
Следующий пример показывает, как можно изменить расширения C++ файлов, находящихся в текущем каталоге и всех его подкаталогах на платформе Win32:
string[] cpp_files; if( cpp_files = sys_find_files_subdir( ".", [ "*.CC", "*.cxx" ], [], [] ) ) { string new_file_name; foreach( f in cpp_files ) { new_file_name = str_extract_file_name( f ) + ".cpp"; io_print( f + " -> " + new_file_name + "\n" ); sys_run( "ren " + f + " " + new_file_name ); } }