it-swarm.com.ru

Как вручную создать файлы icns с помощью iconutil?

Когда я проверяю свое приложение, я получаю эту ошибку: 

комплект приложений не содержит значок в формате ICNS, содержащий изображения 512x512 и [email protected].

Я использую для создания иконок icns с Img2icns app, и до сегодняшнего дня он всегда работал правильно. Но теперь я получаю эту ошибку, и нет способа заставить ее работать. Я пытался соединить два файла PNG (512x512 и 1024x1024) в Img2icns , но всегда получаю эту ошибку. Я также пытался следовать инструкциям Apple OS X Human Interface Guideline, но когда я пытаюсь создать наборы значков, я получаю следующую ошибку терминала:

-bash: синтаксическая ошибка рядом с неожиданным токеном 'newline'

Я не очень хорош с терминальными командами, так что, возможно, я делаю что-то не так. Я написал:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

Если кто-то может помочь, это будет очень цениться. Спасибо, Масси.

90
Blue

Оформить заказ следующие инструкции ( ссылка ):

Используйте iconutil для создания файла icns вручную 

Средство командной строки iconutil преобразует папки iconset в готовые к развертыванию файлы icns высокого разрешения. (Вы можете найти полную документацию для этого инструмента, введя man iconutil в Терминале.) Этот инструмент также сжимает полученный файл icns, поэтому вам не нужно выполнять дополнительное сжатие.

Чтобы преобразовать набор иконок в файл icns

Введите эту команду в окне терминала:

iconutil -c icns <iconset filename>

где <iconset filename> - это путь к папке, содержащей набор значков, которые вы хотите преобразовать в icns. Вывод записывается в то же место, что и iconset file, если вы не укажете выходной файл, как показано:

iconutil -c icns -o <icon filename> <iconset filename>

Другими словами, вам нужно заменить <iconset filename> на путь:

/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset

Поскольку путь содержит пробелы, вам необходимо использовать двойные кавычки, например:

iconutil -c icns "/Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset"

Эта команда должна работать правильно.

55
Anne

Вот скрипт для преобразования 1024x1024 png (с именем «Icon1024.png») в требуемый файл icns. Сохраните его в файл с именем «CreateICNS.src» в папке, где находится ваш файл png, затем в терминале «cd» в той же папке и введите «source CreateICNS.src», чтобы вызвать его:

mkdir MyIcon.iconset
sips -z 16 16     Icon1024.png --out MyIcon.iconset/icon_16x16.png
sips -z 32 32     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 32 32     Icon1024.png --out MyIcon.iconset/icon_32x32.png
sips -z 64 64     Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 128 128   Icon1024.png --out MyIcon.iconset/icon_128x128.png
sips -z 256 256   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 256 256   Icon1024.png --out MyIcon.iconset/icon_256x256.png
sips -z 512 512   Icon1024.png --out MyIcon.iconset/[email protected]
sips -z 512 512   Icon1024.png --out MyIcon.iconset/icon_512x512.png
cp Icon1024.png MyIcon.iconset/[email protected]
iconutil -c icns MyIcon.iconset
rm -R MyIcon.iconset
236
Aidan

Есть модуль узла командной строки, который выполняет всю работу по преобразованию файла PNG в каталог iconset:

npm install -g node-icns
nicns --in adventure-cat.png --out adventure-cat.icns
17
Zeke

Эти команды (введенные в Терминале) помогли мне преобразовать старый файл icns в новый формат:

cd Folder_With_Icns_File
iconutil -c iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil -c icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset

Обновление

Параметр -c для iconutil больше не поддерживается. Вместо этого используйте --convert:

cd Folder_With_Icns_File
iconutil --convert iconset Your_Icon_Name.icns 
rm Your_Icon_Name.icns 
iconutil --convert icns Your_Icon_Name.iconset
rm -R Your_Icon_Name.iconset
12
Aidan

Хотя использование всевозможных сценариев для преобразования изображения высокого разрешения PNG в набор различных копий с низким разрешением может показаться удобным (и это действительно так), не следует забывать, что этот вид автоматического изменения размера будет создавать заметно несовершенные изображения.

Чем меньше разрешение, тем ярче значок!

Вместо этого вы всегда должны запрашивать логотип в каком-либо векторном формате, например, в SVG, у вашего дизайнера. С этим под рукой, вы можете вручную подготовить идеальные файлы PNG во всех необходимых разрешениях, а затем сделать один файл .icns, который сделает ваш значок приложения красивым на каждом экране, от мобильного телефона до какого-нибудь высококачественного дисплея Retina последний iMac.

Начиная с последней директивы Apple от 2016 года, вы должны подготовить следующие файлы PNG:

+---------------------+--------------------+--------------+
|      filename       | resolution, pixels | density, PPI |
+---------------------+--------------------+--------------+
| icon_16x16.png      | 16x16              |           72 |
| [email protected]   | 32x32              |          144 |
| icon_32x32.png      | 32x32              |           72 |
| [email protected]   | 64x64              |          144 |
| icon_128x128.png    | 128x128            |           72 |
| [email protected] | 256x256            |          144 |
| icon_256x256.png    | 256x256            |           72 |
| [email protected] | 512x512            |          144 |
| icon_512x512.png    | 512x512            |           72 |
| [email protected] | 1024x1024          |          144 |
+---------------------+--------------------+--------------+

После того, как все файлы PNG подготовлены, поместите их в какой-либо каталог с расширением .iconset (например, Logos.iconset) и выполните из терминала:

iconutil --convert icns Logos.iconset

Если после выполнения этой команды не было ошибок, тогда все файлы были подготовлены должным образом, и вы получили файл Logos.icns в том же каталоге, содержащий все красивые четкие логотипы для вашего приложения, которые подойдут для любого современного экрана с 2017 года.

9
TranslucentCloud

Дополнительный комментарий: при создании файла .icns необходимо переименовать все файлы pic с префиксом «icon_ », в противном случае iconutil завершится ошибкой с сообщением об ошибке: «.iconset: error: не удалось сгенерировать ICNS». который не информативен вообще.

8
Bearsu

Я написал bash-скрипт для создания icns из SVG-файла:

#!/usr/bin/env bash 
sizes=(16 32 64 128 256 512)
largfile='[email protected]'
if [ ! -f "$largfile" ]; then
  convert -background none -resize 1024x1024 "$1" "$largfile"
fi
for s in "${sizes[@]}"; do
  echo $s
  convert -background none -resize ${s}x${s} "$largfile" "icon_${s}x$s.png"
done

cp 'icon_32x32.png'     '[email protected]'
mv 'icon_64x64.png'     '[email protected]'
cp 'icon_256x256.png'   '[email protected]'
cp 'icon_512x512.png'   '[email protected]'

mkdir icon.iconset
mv icon_*x*.png icon.iconset
iconutil -c icns icon.iconset

Убедитесь, что на Mac установлена ​​программа imagemagick с поддержкой librsvg:

brew install imagemagick --with-librsvg

Этот сценарий послужил мне довольно хорошо. 


Обновление

Для более тщательной обработки я создал инструмент командной строки (написанный на Swift) для генерации AppIcon.appiconset с правильной компоновкой и форматом:

https://github.com/kindlychung/genicon

5
qed

Я переработал скрипт @ Генри, чтобы он выглядел лучше:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -c icns $DIR
rm -frv $DIR

Обновление

Параметр -c для iconutil больше не поддерживается. Вместо этого используйте -—convert:

#!/bin/zsh
NAME=$(basename $1 .png); DIR="$NAME.iconset"
mkdir -pv $DIR
for m r in 'n' '' '((n+1))' '@2x'; do
    for n in $(seq 4 9 | grep -v 6); do
        p=$((2**$m)); q=$((2**$n))
        OUT="$DIR/icon_${q}x${q}${r}.png"
        sips -z $p $p $1 --out $OUT
    done
done
iconutil -—convert icns $DIR
rm -frv $DIR
5
dardo82

Когда я проверяю свое приложение, я получаю эту ошибку:

комплект приложений не содержит значок в формате ICNS, содержащий изображения 512x512 и 512x512 @ 2x.

Я не очень хорош с терминальной командой и, возможно, я делаю что-то не так. Я написал:

iconutil -c icns </Users/myname/SDK Mac Apps/MyApp/grafica/icon.iconset>

Во-первых, как я упоминал в комментарии к ответу Анны, вам, вероятно, не нужно использовать iconutil. Вы должны иметь возможность просто добавить набор значков в ваш проект и позволить XCode конвертировать его для вас как часть сборки.

В любом случае, это может быть вашей проблемой:

Я пытался поставить два файла PNG вместе (512x512 и 1024x1024) ... но я всегда получаю ошибку.

Нет размера 1024 на 1024 балла. Элемент 1024 на 1024 пикселя (который был 1024 очками до Mountain Lion) теперь используется для 512 на 512 точек @ 2x.

Ваш файл PNG должен быть назван соответствующим образом: [email protected]

3
Peter Hosey

Старая версия Apple Icon Composer 2.2 работает просто отлично, вы просто открываете .ICNS в ней, нажимаете кнопку 1024x1024 и добавляете свое изображение.

3
valexa

Dead simple .png ???? .icns

  1. Загрузить IconMaker.app Это просто .applescript не кусает
  2. Перетащите файл .png на только что созданный IconMaker.app.

Подробнее: http://eon.codes/blog/2016/12/06/Creating-an-app-icon/

High Sierra updateiconutil теперь более строго относится к размеру исходного .png. Подробнее об этом в блоге после прыжка. ✌️

3
eonist

Код оболочки @ dardo82 хорош и сработал . Вот более простой код в sh (для всех * nix) и быстрее (как это действительно важно):

#!/bin/sh
#   This runs silent, be as verbose as you wish
NAME=$(basename ${1} .png)
DIR="${NAME}.iconset"
mkdir -p ${DIR}
for i in 16 32 128 256 512 ; do
    x=""
    for p in $i $(($i+$i)) ; do
        sips -z $p $p ${1} --out "${NAME}.iconset/icon_${i}x${i}${x}.png"
        x="@2x"
    done
done >/dev/null  # /dev/null in lieu of a "-s" silent option
iconutil -—convert icns $DIR
rm -r $DIR
2
MichaelT

Запустите iconutil -c icns Icon.iconset

Заметка

  • Icon.iconset - это папка
  • Имя начинается со строчной буквы icon_
  • Когда вы видите Icon.icns с правильным изображением, вы знаете, что это работает

 enter image description here

2
onmyway133

Есть 2 задачи:
- создать 10 правильных файлов icns
- получите ваш проект XCode, чтобы использовать их правильно 

Поскольку у меня были часовые проблемы с обеими этими задачами, а также мне не нравится, когда я не «вижу», что происходит, вот путь для осторожных: 

Создать 10 правильных файлов icns:
Я использовал приведенный выше сценарий от Генри: он все еще работает для HighSierra и Xcode 9.2, включая команду 'c'.
Файл icns, который я получил, в Finder/Quicklook отображался только как один значок размера, а в Preview отображался только 8 из 10 размеров.
Поэтому я использовал терминал, пошел с cd в свою папку и использовал команду: iconutil -c iconset (имя файла icns) в только что созданном файле icns, чтобы вернуть файл icns обратно в папку iconset, и - lo & behold - Я мог видеть мои недавно созданные 10 файлов значков. Используя Быстрый просмотр папки с иконками (и используя полноэкранный режим, чтобы иметь возможность масштабировать их с помощью ползунка), я мог убедиться, что все размеры на самом деле выглядят очень хорошо.

В качестве отступления: они выглядели лучше, чем мои попытки изменить размер в PSE, скорее всего потому, что я не нашел времени, чтобы поиграть со всеми вариантами изменения размера в PSE. Если вы используете PSE, убедитесь, что ваши файлы png сохранены без цветового профиля. Кроме того, по признанию моего невежества, для меня файл 256x256 @ 2 такой же, как файл 512x512 - оба с разрешением 72 dpi. Попытка следовать комментариям с разрешением 144 т/д у меня не сработала. 

Получите ваш проект XCode, чтобы использовать их правильно:
Сначала я удалил все свои бесплодные попытки в Xcode и зафиксировал чистую версию в репозитории git (что было бы разумно, было бы сначала зафиксировать чистую версию - прежде чем я неистово запустил одиссею добавления значков).
Я также удостоверился, что в файле info.plist нет указателя, связанного с записью файла значка, и что в общих настройках проекта я выбрал AppIcon для значков приложений.
Затем я добавил каталог assets.asset и в каталог ресурсов новую папку AppIcon «AppIcons and Launch Images» для ОС.
Затем я скопировал (перетаскивал с нажатой опцией) из папки с набором иконок каждый файл изображения png в соответствующий AppIcon Spaceholder. Итак, еще раз, я мог видеть, что происходит. Xcode действительно преобразовал это в файлы icns, или, может быть, - поскольку моя папка с набором иконок, полученная из папки icns, - форматы файлов были приняты. 

Затем заархивируйте и подтвердите, и при загрузке или проверке ошибок не будет. 

1
Uwe

То же, что @Henry (комментарий выше), но принимает в качестве аргумента имя файла PNG и выводит ICNS с тем же именем.

ПРИМЕЧАНИЕ: Предполагается, что имя файла PNG будет иметь только 1 точку для отдельного расширения, то есть xpto.png.

Итак, сохраните приведенный ниже код в поле с именем «CreateICNS.src» в папке, где находится ваш файл png.

КОД:

IFS='.' read -ra ADDR <<< "$1"
ICONSET=${ADDR[0]}.iconset
mkdir $ICONSET
sips -z 16 16     $1 --out $ICONSET/icon_16x16.png
sips -z 32 32     $1 --out $ICONSET/[email protected]
sips -z 32 32     $1 --out $ICONSET/icon_32x32.png
sips -z 64 64     $1 --out $ICONSET/[email protected]
sips -z 128 128   $1 --out $ICONSET/icon_128x128.png
sips -z 256 256   $1 --out $ICONSET/[email protected]
sips -z 256 256   $1 --out $ICONSET/icon_256x256.png
sips -z 512 512   $1 --out $ICONSET/[email protected]
sips -z 512 512   $1 --out $ICONSET/icon_512x512.png
cp $1 $ICONSET/[email protected]
iconutil -c icns $ICONSET
rm -R $ICONSET

КАК ПОЛЬЗОВАТЬСЯ :

Затем в терминале «cd» в ту же папку и введите:

source CreateICNS.src {PNG filename}

где {PNG filename} - это имя вашего PNG-файла, то есть xpto.png.

Если ваш файл будет называться abc.png, вы будете использовать:

source CreateICNS.src abc.png
1
Telmo Dias

Вот функция, в основном основанная на примере Генри (может быть полезно в ~/.bash_profile):

mkicns() {
    if [[ -z "$*" ]] || [[ "${*##*.}" != "png" ]]; then
        echo "Input file invalid"
    else
        filename="${1%.*}"
        mkdir "$filename".iconset
        for i in 16 32 128 256 ; do
            n=$(( i * 2 ))
            sips -z $i $i "$1" --out "$filename".iconset/icon_${i}x${i}.png
            sips -z $n $n "$1" --out "$filename".iconset/icon_${i}x${i}@2x.png
            [[ $n -eq 512 ]] && \
            sips -z $n $n "$1" --out "$filename".iconset/icon_${n}x${n}.png
            (( i++ ))
        done
        cp "$1" "$filename".iconset/[email protected]
        iconutil -c icns "$filename".iconset
        rm -r "$filename".iconset
    fi
}

Использование:

$ mkicns "filename.png"  # double-quote if spaces exist in filename

Создает 10 размеров от 16x16 до [email protected]; принимает входные изображения в только .png формат.

0
l'L'l

Здравствуйте, для своих нужд я создал каплю, которая работает только в виде значков перетаскивания или значков для поиска в папке (я ограничился папками, так как поиск по томам всех значков может занять много времени). Таким образом, в перетаскивании вы можете удалить папки или приложения, все, что может содержать значок. Созданный набор значков носит имя исходного значка, он помещается в каталог «/ aaaicones» и путь к значку. Пример в папке "/ aaaicones, если вы отправите xcode.app, вы найдете "/Aaaicones/Applications/xcode.app/access.iconset "и /aaaicones/Applications/xcode.app/access.icns (воссозданный значок ) будет текстовый файл, в котором будет отслеживаться полный путь значков и путь к соответствующему примеру набора значков "/ Applications/xcode.app/Contents/Applications/Instruments.app/Contents/Frameworks/InstrumentsPlugIn .framework/Versions/A/Resources/access.icns ""/aaaicones/Applications/xcode.app/access.iconset "в приведенном примере (xcode) это может создать папку в конце (со всеми значками и iconset) размером 214 МБ. Если рассматривать только значок, он будет помещен в каталог "/ aaaicones/aIconeseule /" и его исходный путь, например /aaaicones/aIconeseule/Mac Elcapitan/.VolumeIcon.icns и/aaaicones/aIconeseule/Mac Elcapitan /.VolumeIcon.iconset с/aaaicones/aIconeseule/Mac Elcapitan/aalisticones.txt Капля находится ниже

on open draggedItems
    set input to draggedItems
    set fich to draggedItems


    set media to {}

    set theInfo to {}

    set n to "0"
    repeat with currentItem in draggedItems
        set dirchoisi to POSIX path of fich
        if ".icns" is not in dirchoisi then
            if "Volumes" is not in dirchoisi then

                set origi to do Shell script "echo   /aaaicones" & dirchoisi
                set fich to do Shell script "echo " & fich & " | xxd -p -c 100000 | sed 's#3a#2f#g' | xxd -r -p | sed 's#" & dirchoisi & "#" & "/aaaicones" & dirchoisi & "#g' | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"
                tell application "Finder"
                    if exists (folder fich) then
                        set nn to "0"
                        repeat with nn from 1 to 5
                            set origi to do Shell script "echo  " & origi & "/" & " | sed 's#//#" & nn & "/" & "#'"
                            set fich to do Shell script "echo " & fich & " | sed 's#:aaaicones*.*#" & origi & "#'" & " | xxd -p -c 100000 | sed 's#2f#3a#g' | xxd -r -p"

                            if not (exists folder (fich as Unicode text)) then
                                try
                                    set origi to do Shell script "echo  " & origi
                                    exit repeat
                                end try
                            end if
                        end repeat
                    end if
                end tell
                tell application "Finder"
                    if not (exists folder (fich as Unicode text)) then
                        do Shell script "mkdir -p -m 0777 " & quoted form of origi
                    end if
                end tell
                try
                    set theInfo to do Shell script "find " & (quoted form of dirchoisi) & " -name *.icns "
                end try




                set AppleScript's text item delimiters to return

                set theList to text items of theInfo

                set AppleScript's text item delimiters to ""

                set n to count theList
                repeat with i from 1 to n
                    if "Volumes" is not in item i of theList then
                        set end of media to item i of theList
                    end if
                end repeat
                set n to count media
                set cheminicns to do Shell script " > " & quoted form of (origi & "aalisticones.txt") & " |  chmod 777 " & quoted form of (origi & "aalisticones.txt")
                set cheminicns to do Shell script "ls " & quoted form of (origi & "aalisticones.txt")

                tell application "Finder"
                    set letext to (POSIX file cheminicns as alias)
                    set label index of letext to 2
                end tell



                repeat with i from 1 to n

                    set hdd to item i of media
                    try

                        set input to do Shell script "echo   " & hdd & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
                        do Shell script "echo   " & quoted form of input & " >>" & quoted form of cheminicns
                        set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "

                        do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
                        set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
                        do Shell script "echo   " & quoted form of (origi & png) & " | sed 's#.icns#.iconset#' >>" & quoted form of cheminicns
                    end try
                end repeat
                tell application "Finder"
                    if exists (folder fich) then
                        open fich
                    end if
                end tell

            end if
        else

            set input to do Shell script "echo   " & dirchoisi & " | sed 's#//#/#g; s#(#\\(#g;s#)#\\)#g' "
            set png to do Shell script "echo " & quoted form of input & " | sed 's#.*/##' "
            set origi to do Shell script "echo " & quoted form of ("/aaaicones/aIconeseule/" & input) & " | sed 's#/Volumes/##; s#" & quoted form of png & "##'"
            do Shell script "mkdir -p -m 0777 " & quoted form of origi
            do Shell script "echo   " & quoted form of input & " >>" & quoted form of origi & "aalisticones.txt"

            do Shell script "cp -f " & quoted form of input & " " & quoted form of origi
            set input to do Shell script "iconutil -c iconset  " & quoted form of (origi & png)
            do Shell script "echo   " & quoted form of (origi & png) & " >>" & quoted form of origi & "aalisticones.txt"
        end if
    end repeat
end open
0
deek5

Мне это нужно, но для CMake. Я также хотел вариант дать ему SVG.

Вот суть: https://Gist.github.com/Qix-/f4090181e55ea365633da8c3d0ab5249

И код CMake:

# LICENSE: CC0 - go nuts.

# Hi :) This is what I used to generate the ICNS for my game, Tide.
# Both input formats (SVG vs PNG) work just fine, but in my experience
# the SVG came out with noticeably better results (although PNG wasn't
# a catastrophe either). The logo for the game was simple enough that
# SVG was indeed an option.

# To use:
#
#    make_icns( INPUT "path/to/img.{svg,png}"
#               OUTPUT ICNS_PATH )
#
# Then add it as a custom target or use it as a
# dependency somewhere - I give you that option.
#
# For example:
#
#    add_custom_target( my-icns ALL DEPENDS "${ICNS_PATH}" )
#
# For the associated utilities:
#
# - PNG: brew install imagemagick
# - SVG: brew cask install inkscape
#
# Enjoy!

function (make_icns_from_png)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    find_program (
        convert_exe
        NAMES "convert" "convert.exe"
        DOC "Path to ImageMagick convert")
    if (NOT convert_exe)
        message (FATAL_ERROR "Could not find ImageMagick's 'convert' - is ImageMagick installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size}x${size}" "${ipath}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${convert_exe}" ARGS "${sourceimg}" -resize "${size2x}x${size2x}" "${ipath2x}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns_from_svg)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    set (CMAKE_FIND_APPBUNDLE NEVER) # otherwise, it'll pick up the app bundle and open a shit ton of windows
    find_program (
        inkscape_exe
        NAMES "inkscape" "inkscape.exe"
        DOC "Path to Inkscape"
        PATHS "/usr/local/bin" "/usr/bin")

    message (STATUS "Inkscape path: ${inkscape_exe}")

    if (NOT inkscape_exe)
        message (FATAL_ERROR "Could not find Inkscape - is it installed?")
    endif ()

    get_filename_component (ARG_INPUT_ABS "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    get_filename_component (ARG_INPUT_ABS_BIN "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}")
    get_filename_component (ARG_INPUT_FN "${ARG_INPUT_ABS_BIN}" NAME_WE)
    get_filename_component (ARG_INPUT_DIR "${ARG_INPUT_ABS_BIN}" DIRECTORY)

    set (sourceimg "${ARG_INPUT_ABS}")

    set (basepath "${ARG_INPUT_DIR}/${ARG_INPUT_FN}")
    set (output_icns "${basepath}.icns")
    set (iconset "${basepath}.iconset")

    set (deplist "")

    foreach (size IN ITEMS 16 32 128 256 512)
        math (EXPR size2x "2 * ${size}")

        set (ipath "${iconset}/icon_${size}x${size}.png")
        set (ipath2x "${iconset}/icon_${size}x${size}@2x.png")

        list (APPEND deplist "${ipath}" "${ipath2x}")

        add_custom_command (
            OUTPUT "${ipath}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath}" -w ${size} -h ${size} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath}"
            VERBATIM)

        add_custom_command (
            OUTPUT "${ipath2x}"
            COMMAND "${inkscape_exe}" ARGS -z -e "${ipath2x}" -w ${size2x} -h ${size2x} "${sourceimg}"
            MAIN_DEPENDENCY "${sourceimg}"
            COMMENT "ICNS resize: ${ipath2x}"
            VERBATIM)
    endforeach ()

    add_custom_command (
        OUTPUT "${output_icns}"
        COMMAND iconutil ARGS --convert icns --output "${output_icns}" "${iconset}"
        MAIN_DEPENDENCY "${sourceimg}"
        DEPENDS ${deplist}
        COMMENT "ICNS: ${output_icns}"
        VERBATIM)

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${output_icns}" PARENT_SCOPE)
    endif ()
endfunction ()

function (make_icns)
    cmake_parse_arguments (
        ARG
        ""             # Boolean args
        "INPUT;OUTPUT" # List of single-value args
        ""             # Multi-valued args
        ${ARGN})

    if (NOT ARG_INPUT)
        message (FATAL_ERROR "INPUT is required")
    endif ()

    if (NOT IS_ABSOLUTE "${ARG_INPUT}")
        get_filename_component (ARG_INPUT "${ARG_INPUT}" ABSOLUTE BASE_DIR "${CMAKE_CURRENT_SOURCE_DIR}")
    endif ()

    if (NOT EXISTS "${ARG_INPUT}")
        message (FATAL_ERROR "INPUT does not exist: ${ARG_INPUT}")
    endif ()

    file (RELATIVE_PATH ARG_INPUT "${CMAKE_CURRENT_SOURCE_DIR}" "${ARG_INPUT}")

    get_filename_component (ARG_INPUT_EXT "${ARG_INPUT}" EXT)
    if ("${ARG_INPUT_EXT}" STREQUAL ".png")
        make_icns_from_png (INPUT "${ARG_INPUT}" OUTPUT child_output)
    elseif ("${ARG_INPUT_EXT}" STREQUAL ".svg")
        make_icns_from_svg (INPUT "${ARG_INPUT}" OUTPUT child_output)
    else ()
        message (FATAL_ERROR "INPUT must refer to a .png or .svg, but a ${ARG_INPUT_EXT} was provided")
    endif ()

    if (ARG_OUTPUT)
        set ("${ARG_OUTPUT}" "${child_output}" PARENT_SCOPE)
    endif ()
endfunction ()
0
Qix