1. Введение

1.1. Что такое M++

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).

1.2. Пример использования шаблонов M++ для проектов на C++

Допустим, что мы хотим скомпилировать традиционный пример "Hello, world". Для этого:

  1. Создаем файл hello.cpp:
    	#include <iostream.h>
    
    	int
    	main() {
    		cout << "Hello, world!" << endl;
    
    		return 0;
    	}
    	
  2. Создаем файл с описанием проекта hello.4xx:
    	#include <start.4xx>
    
    	appMode = "exe";
    	screenMode = "console";
    
    	target = "hello";
    
    	cppSource += "hello.cpp";
    
    	#include <finish.4xx>
    	
  3. Создаем подкаталог с именем 'o'. В него будут помещаться объектные файлы.
  4. Запускаем M++:
    	mxxc -f hello.4xx
    	

Полученный файл hello.4xx содержат все необходимые для M++ указания по поводу построения проекта. При этом проектный файл не содержит чего-либо специфического для операционной системы и семейства компиляторов. Поэтому его легко перенести на другую платформу и/или компилятор, не изменив при этом ни строчки в проектном файле.

1.3. Пример использования языка 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 );
	}
}
Hosted by uCoz