2013-10-03 2 views
0

저는 응용 프로그램에 간단한 Makefile을 만들었습니다. 설치 후 udev 규칙을 다시 시작해야합니다.Makefile에서 udev를 다시 시작하십시오.

#1 SMP Debian 3.2.46-1+deb7u1 
ifeq (Debian,Debian) \ 
     @echo "Estoy dentro del if" 
/bin/sh: 1: Syntax error: word unexpected (expecting ")") 
make: *** [postinstall] Error 2 

문제가 어디 있는지 모르겠어요 :

INSTALLDIR=/pkt/bin 
OS:=$(shell uname -v) 
LBITS:=$(shell getconf LONG_BIT) 
LIBDIR=/usr/lib 

ifeq ($(LBITS),64) 
    LIBDIR64=/usr/lib64 
else 
    LIBDIR64=/usr/lib 
endif 

all: usbupdater 

configuracion.o: configuracion.cpp 
    g++ -c configuracion.cpp 

main.o: main.cpp 
    g++ -c main.cpp 

usbupdater: main.o configuracion.o 
    @echo "$(PATH)" 
    @echo "$(LIBDIR)" 
    g++ main.o configuracion.o $(LIBDIR)/libReadINI.a $(LIBDIR64)/chilkat/li 
bchilkat-9.4.1.a -lpthread -lresolv -o usbupdater 

clean: 
    rm -rf *.o *.cgh $(INSTALLDIR)/usbupdater 
install: 
    mv usbupdater $(INSTALLDIR)/usbupdater 
    cp -rf 99-persistent-usb.rules /etc/udev/rules.d/99-persistent-usb.rules 

postinstall: 
    @echo "$(OS)" 
    ifeq ($(findstring Debian,$(OS)),Debian) \ 
     @echo "Estoy dentro del if" 
     $(shell '/etc/init.d/udev' restart) \ 
    else \ 
     @echo "Estoy dentro del else" 
     $(shell ls -l) \ 
    endif 

문제는 내가 사후이 만들어 입력 할 때 나에게이 오류를 보여주고 있다는 점이다. 필자는 uname -v 결과를 데비안과 비교하여 udev restart 또는 udevcontrol reload_rules가 Opensuse OS 인 경우이를 비교합니다.

미리 감사드립니다. 내 영어를 유감스럽게 생각합니다.

답변

0

ifeq은 make 명령입니다. 레시피 컨텍스트에서 makefile의 모든 행은 쉘에 전달됩니다. 그래서 make는 ifeq을 쉘에 전달하고 쉘은 여러분이 무슨 말을하는지 전혀 모른다는 것을 알려줍니다.

구문을 사용하지 말고 쉘 구문을 사용하여 작성해야합니다.

또한 제조법에 $(shell ...) 기능을 사용하는 것이 거의 유용하지 않습니다. make 레서피는 셸에 의해 실행되므로 $(shell ...)을 사용하면 실행중인 셸의 양이 두 배가됩니다. $(shell ls -l)과 같은 명령은 작동하지 않을 것입니다. $(shell ...)은 백틱과 같으므로이 기능을 명령의 stdout으로 바꿉니다. 이 상황에서 오류가 발생합니다. 지금까지 내가 GNU의 어떤 버전도하지 않습니다이 있습니다 알고 있어요으로

postinstall: 
     @echo "$(OS)" 
     @case '$(OS)' in \ 
     (*Debian*) \ 
      echo "Estoy dentro del if"; \ 
      /etc/init.d/udev restart ;; \ 
     (*) \ 
      echo "Estoy dentro del else"; \ 
      ls -l ;; \ 
     esac 
0

규칙 정의 블록 내에서 내부 명령어 (예 : ifeq)를 사용할 수 없습니다. 하나 쉘의 if를 사용하거나 else 문이 정확히 표준하지 않고 make의 일부 버전에서 누락 될 수 있음을 주목할 필요가 또한

ifeq($(blah-blah), blah) 
    BUILD_CMD:=foo 
endif 

과 같은 몇 가지 변수 값을 생성하는 규칙의 ifeq 외부를 사용합니다.

왜이 제품을 원하십니까? make install 뭔가 다른 일을 그냥 다음 (복사) 파일을 설치하는 경우 나는 정말 나쁜 연습을 고려할 것입니다.

+0

(그리고 우리는 이것이 다른 make가 난 ifeq' 그'을 지원하지 않기 때문에 GNU 만들 알고 :

내가로 작성합니다 이를 인식하는)는 'else'명령을 지원하지 않습니다. – MadScientist

+0

나는 항상 ifeq가 꽤 표준이라고 생각했지만, 그것은 당신이 말하는 것처럼 보입니다. 감사. – keltar

관련 문제