ОС обнаруживает make-файл - PullRequest
       74

ОС обнаруживает make-файл

228 голосов
/ 03 апреля 2009

Я обычно работаю на нескольких разных компьютерах и нескольких разных операционных системах, таких как Mac OS X, Linux или Solaris. Для проекта, над которым я работаю, я извлекаю свой код из удаленного репозитория git.

Мне нравится работать над своими проектами независимо от того, в каком терминале я нахожусь. До сих пор я нашел способы обойти изменения ОС, меняя make-файл каждый раз, когда я переключаю компьютеры. Однако это утомительно и вызывает кучу головных болей.

Как мне изменить мой make-файл, чтобы он определял, какую ОС я использую, и соответственно изменял синтаксис?

Вот файл makefile:

cc = gcc -g
CC = g++ -g
yacc=$(YACC)
lex=$(FLEX)

all: assembler

assembler: y.tab.o lex.yy.o
        $(CC) -o assembler y.tab.o lex.yy.o -ll -l y

assembler.o: assembler.c
        $(cc) -o assembler.o assembler.c

y.tab.o: assem.y
        $(yacc) -d assem.y
        $(CC) -c y.tab.c

lex.yy.o: assem.l
        $(lex) assem.l
        $(cc) -c lex.yy.c

clean:
        rm -f lex.yy.c y.tab.c y.tab.h assembler *.o *.tmp *.debug *.acts

Ответы [ 12 ]

3 голосов
/ 01 октября 2009

Обратите внимание, что Makefiles чрезвычайно чувствительны к пробелам. Вот пример Makefile, который запускает дополнительную команду в OS X и работает в OS X и Linux. В целом, однако, autoconf / automake - это путь к чему-то нетривиальному.

UNAME := $(shell uname -s)
CPP = g++
CPPFLAGS = -pthread -ansi -Wall -Werror -pedantic -O0 -g3 -I /nexopia/include
LDFLAGS = -pthread -L/nexopia/lib -lboost_system

HEADERS = data_structures.h http_client.h load.h lock.h search.h server.h thread.h utility.h
OBJECTS = http_client.o load.o lock.o search.o server.o thread.o utility.o vor.o

all: vor

clean:
    rm -f $(OBJECTS) vor

vor: $(OBJECTS)
    $(CPP) $(LDFLAGS) -o vor $(OBJECTS)
ifeq ($(UNAME),Darwin)
    # Set the Boost library location
    install_name_tool -change libboost_system.dylib /nexopia/lib/libboost_system.dylib vor
endif

%.o: %.cpp $(HEADERS) Makefile
    $(CPP) $(CPPFLAGS) -c $
2 голосов
/ 04 августа 2011

Другой способ сделать это - использовать скрипт «configure». Если вы уже используете его в своем make-файле, вы можете использовать комбинацию uname и sed, чтобы все получилось. Сначала в вашем скрипте выполните:

UNAME=uname

Затем, чтобы поместить это в ваш Makefile, начните с Makefile.in, который должен иметь что-то вроде

UNAME=@@UNAME@@

в нем.

Используйте следующую команду sed в вашем скрипте configure после бита UNAME=uname.

sed -e "s|@@UNAME@@|$UNAME|" < Makefile.in > Makefile

Теперь ваш make-файл должен иметь UNAME, определенный как желаемый. Если / elif / else - это все, что осталось!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...