Как сгенерировать действие make install с помощью gyp?

Я использую gyp для создания make-файлов для своего проекта. Makefiles работают, заставляют рабочие двоичные файлы появляться в каталоге «out», здесь все отлично.

Тем не менее, я хотел бы, чтобы мои make-файлы имели некоторые «стандартные» действия/цели, а именно «установить», «удалить» и «очистить».

Я добавил цель «установить» в файлы .gyp, но у меня есть сомнения, правильно ли это сделать, особенно потому, что кажется, что нет способа исключить цель «установить» из «всех» в make с использованием gyp.

Мне также интересно, есть ли инструмент для создания файлов ./configure для gyp, или они должны быть написаны разработчиком и запускать gyp только с некоторыми необходимыми параметрами.

Как правильно добавить эти цели ("установить"...) в make-файлы, сгенерированные gyp? Можно ли сделать так, чтобы указанные действия работали и с другими системами сборки? (ниндзя и др.)


person OhJeez    schedule 03.12.2014    source источник


Ответы (1)


Лучший способ, который я нашел для этого, - создать make-файлы с помощью gyp в подкаталоге каталога проекта, а затем вручную написать make-файл с целями «установить», «очистить» и т. д., который выполняет Makefile, сгенерированный gyp.

Чтобы убедиться, что gyp вызывается с правильными аргументами, я вызываю его из ./configure

Структура каталога:

+ build
    |- Makefile (generated by gyp)
|- Makefile (written by hand)
|- configure (written by hand)
|- build.gyp (written by hand)

./настроить:

#!/bin/bash

PREFIX=/usr/local
BUILDTYPE=Release


for i in "$@"
do
        case $i in
            -p=*|--prefix=*)
            PREFIX="${i#*=}"

            ;;
        esac
        case $i in
            -b=*|--buildtype=*)
            BUILDTYPE="${i#*=}"

            ;;
        esac
done
gyp -D prefix="$PREFIX" -D configuration="$BUILDTYPE" --depth=. --generator-output=./build -f make

echo -e "prefix=$PREFIX\n" > ./config.mk

Makefile:

include config.mk

prefix ?= /usr/local

builddir=build/out
abs_builddir := $(abspath $(builddir))

all: config.mk
    $(MAKE) -C "./build" builddir="$(abs_builddir)"

binaries=$(prefix)/bin/foo $(prefix)/bin/bar

$(binaries): $(prefix)/bin/%: $(builddir)/%
    cp $< $@

install: $(binaries) $(directories)

# $(directories), uninstall, clean, .PHONY, etc.

build.gyp:

{
    'variables': {
    },
    'target_defaults': {
        // (...)
    },
    'targets': [
        {
            'target_name': 'foo',
            'type': 'executable',
            'defines': [],
            'include_dirs':[ 
                'src/headers'
            ],
            'sources': [ 
                'src/foo.c'
            ],
            'libraries': [
                '-lcrypto'
            ]
        },
        // (...)
    ]
}

И затем, все, что мне нужно сделать для установки, это классика и неповторимость:

./configure --prefix="/home/me/local_builds"
make
make install
person OhJeez    schedule 01.06.2015