Makefile: чтение / разбиение массива

Допустим, у вас была следующая структура каталогов:

# directory structure
├── GIT-REPO
│   ├── dev
│   ├── production
│   ├── mgmt

Я ищу способ в файле Makefile найти среду, основанную на том, в каком каталоге она живет. Я нашел способ сделать это в bash со следующим:

DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"                                                                    
IFS='/' read -r -a DIR_ARRAY <<< "$DIR"                                                                         
GIT_REPO=some-repo                                                                                            

for ((i=0; i < ${#DIR_ARRAY[@]}; i++)) do                                                                            
    if [ "${DIR_ARRAY[$i]}" = "$GIT_REPO" ] ; then                                                                   
        echo ${DIR_ARRAY[$i+1]}                                                                                      
    fi                                                                                                               
done

Но мне трудно перевести это в Makefile. Каждый из этих каталогов среды будет иметь Makefile, а также подкаталоги. Я хочу иметь возможность динамически искать, в какой среде он находится, находя имя каталога справа от каталога $GIT_REPO.

1 ответ

  1. Вот пример:

    /home/user/git_repo/mgmt
    /home/user/git_repo/prod
    /home/user/git_repo/prod/application/
    /home/user/git_repo/dev/
    /home/user/my_source_files/git_repo/prod/application
    

    Вы увидите, что есть некоторые сходства, но общая длина dir отличается. Они все разделяют git_repoи все содержат environment(prod, dev, mgmt). На верхнем уровне каждого каталога вышеMakefile, где я хочу вытащить environment. Мой пример bash был намного сложнее, чем мне было нужно, и я мог использовать sedего вместо этого. Это то, что находится в моем Makefileсейчас:

    GIT_REPO="my_repo"
    ENV=$(shell pwd | sed "s/^.*\/$(GIT_REPO)\///" | cut -d / -f 1)
    

    Что это будет делать, так это искать текст репозитория Git и удалять имя репозитория и любой корневой каталог перед ним. Затем применяем cut и отделяем его путем ‘ / ‘ и берем первый элемент. Это всегда возвращает папку среды.

    У меня есть очень специфический случай использования, когда я хочу динамически получить среду в моем Makefile, а не статически определять ее каждый раз.