Es ist lange her, dass sich der Trend zu Swift verlagert hat, und die Anzahl der Personen, die sich für Objective-C interessieren, ist in den letzten Jahren zurückgegangen. Hier finden Sie eine Zusammenfassung der Einrichtung einer Objective-C-Entwicklungsumgebung unter Linux.
Es wurde unter Ubuntu 18.04 und 19.10 unter Docker getestet. Wenn Sie den Inhalt von "ENV" und "RUN" in die Docker-Datei extrahieren, funktioniert dies auf dem tatsächlichen Computer.
Wenn Sie mit dem altmodischen Objective-C 1.0 zufrieden sind, können Sie mit Clang 9 relativ einfach eine Objective-C-Entwicklungsumgebung einrichten, indem Sie ein fertiges Paket installieren, das mit apt verfügbar ist.
Dockerfile
FROM ubuntu:19.10
RUN set -x \
&& apt update \
&& apt upgrade -y \
&& DEBIAN_FRONTEND=noninteractive apt install -y tzdata \
&& apt install -y clang-9 make gobjc-9 gnustep-devel \
&& apt autoremove -y \
&& apt clean \
&& rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*
# Set alias
RUN echo 'alias clang-objc="clang-9 \$(gnustep-config --objc-flags) \$(gnustep-config --objc-libs) -lgnustep-base -I/usr/lib/gcc/x86_64-linux-gnu/9/include"' > ~/.bashrc
CMD ["/bin/bash"]
Die Essenz ist
$ apt install -y clang-9 make gobjc-9 gnustep-devel
ist. Auch in ~ / .bashrc
alias clang-objc="clang-9 \$(gnustep-config --objc-flags) \$(gnustep-config --objc-libs) -lgnustep-base -I/usr/lib/gcc/x86_64-linux-gnu/9/include"
Es ist definiert als. Auf diese Weise können Sie dies in diesem Docker-Container tun
$ clang-objc -o hoge hoge.m
$ ./hoge
Auf diese Weise können Sie die Objective-C-Quelle hoge.m
einfach kompilieren und ausführen.
Wenn Sie die Funktionen von Modern Objective-C wie z. B. vollständig nutzen möchten, müssen Sie libobjc2 von GNUstep einrichten. Es kann nicht mit apt installiert werden und muss aus dem Quellcode erstellt werden. Das ist ziemlich schwierig. GitHub-Repository von Plaurent war sehr hilfreich. Die Erstellungsprozedur kann wie folgt in einer Docker-Datei zusammengefasst werden.
Dockerfile
FROM ubuntu:19.10
ENV CC clang-9
ENV CXX clang++-9
ENV CXXFLAGS -std=c++11
ENV RUNTIME_VERSION gnustep-2.0
ENV PKG_CONFIG_PATH /usr/local/lib/pkgconfig
ENV LD /usr/bin/ld.gold
ENV LDFLAGS "-fuse-ld=/usr/bin/ld.gold -L/usr/local/lib"
WORKDIR /GNUstep-build
RUN set -x \
&& apt update \
&& apt upgrade -y \
&& apt install -y git sudo clang-9 clang++-9 build-essential wget \
subversion cmake libffi-dev libxml2-dev \
libgnutls28-dev libicu-dev libblocksruntime-dev libkqueue-dev libpthread-workqueue-dev autoconf libtool \
libjpeg-dev libtiff-dev libffi-dev libcairo-dev libx11-dev libxt-dev libxft-dev \
&& apt autoremove -y \
&& apt clean \
&& rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/*
# Build GNUstep make
RUN set -x \
#
# Checkout tools-make
&& git clone https://github.com/gnustep/tools-make.git \
#
# Build GNUstep make
&& cd tools-make \
&& CC=${CC} ./configure \
--with-layout=gnustep \
--disable-importing-config-file \
--enable-native-objc-exceptions \
--enable-objc-arc \
--enable-install-ld-so-conf \
--with-library-combo=ng-gnu-gnu \
&& make -j8 \
&& sudo -E make install \
&& . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh \
&& echo ". /usr/GNUstep/System/Library/Makefiles/GNUstep.sh" >> ~/.bashrc \
&& echo "export RUNTIME_VERSION=gnustep-2.0" >> ~/.bashrc \
&& echo 'export CXXFLAGS="-std=c++11"' >> ~/.bashrc \
&& cd .. \
#
# Build libdispatch
#
# Checkout swift-corelibs-libdispatch
&& git clone https://github.com/apple/swift-corelibs-libdispatch \
&& cd swift-corelibs-libdispatch \
&& git checkout swift-5.1.1-RELEASE \
#
# Build libdispatch
&& rm -Rf build \
&& mkdir build \
&& cd build \
&& cmake .. \
-DCMAKE_C_COMPILER=${CC} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DCMAKE_BUILD_TYPE=Release \
-DUSE_GOLD_LINKER=YES \
&& make \
&& sudo -E make install \
&& sudo ldconfig \
&& cd ../.. \
#
# Build libobjc2
#
# Checkout libobjc2
&& git clone https://github.com/gnustep/libobjc2.git \
&& cd libobjc2 \
&& git submodule init \
&& git submodule sync \
&& git submodule update \
#
# Build libobjc2
&& rm -Rf build \
&& mkdir build \
&& cd build \
&& cmake .. \
-DCMAKE_C_COMPILER=${CC} \
-DCMAKE_CXX_COMPILER=${CXX} \
-DCMAKE_ASM_COMPILER=${CC} \
-DTESTS=OFF \
&& cmake --build . \
&& sudo -E make install \
&& sudo ldconfig \
&& cd ../.. \
#
# Build GNUstep make second time
&& cd tools-make \
&& CC=${CC} ./configure \
--with-layout=gnustep \
--disable-importing-config-file \
--enable-native-objc-exceptions \
--enable-objc-arc \
--enable-install-ld-so-conf \
--with-library-combo=ng-gnu-gnu \
&& make -j8 \
&& sudo -E make install \
&& . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh \
&& cd .. \
#
# Build GNUstep base
#
# Checkout libs-base
&& git clone https://github.com/gnustep/libs-base.git \
#
# Build GNUstep base
&& cd libs-base \
&& ./configure \
&& make -j8 \
&& sudo -E make install \
&& cd ..
# For GUI programming
#
# Build GNUstep GUI Library
RUN set -x \
&& . /usr/GNUstep/System/Library/Makefiles/GNUstep.sh \
#
# Checkout libs-gui
&& git clone https://github.com/gnustep/libs-gui.git \
#
# Build GNUstep GUI Library
&& cd libs-gui \
&& ./configure \
&& make -j8 \
&& sudo -E make install \
&& cd .. \
#
# Build GNUstep GUI Backend
#
# Checkout libs-back
&& git clone https://github.com/gnustep/libs-back.git \
#
# Build GNUstep GUI Backend
&& cd libs-back \
&& ./configure \
&& make -j8 \
&& sudo -E make install \
&& cd ..
WORKDIR /workdir
# Clean build directory
RUN rm -rf /GNUstep-build
# Set alias
RUN echo 'alias clang-objc="\${CC} \$(gnustep-config --objc-flags) \$(gnustep-config --objc-libs) -fobjc-arc -lobjc -ldispatch -lgnustep-base"' >> ~/.bashrc
CMD ["/bin/bash"]
Es war ein langer Build-Vorgang ... Zum Schluss zu ~ / .bashrc
alias clang-objc="\${CC} \$(gnustep-config --objc-flags) \$(gnustep-config --objc-libs) -fobjc-arc -lobjc -ldispatch -lgnustep-base"
Ist also in diesem Docker-Container eingestellt
$ clang-objc -o hoge hoge.m
$ ./hoge
Auf diese Weise können Sie die Objective-C 2.0-Quelle hoge.m
einfach kompilieren und ausführen.
Die diesmal erstellte Docker-Datei und die zum Testen bereitgestellten Objective-C-Quellen wurden in das GitHub-Repository hochgeladen.
$ docker run --rm -it -v $(pwd):/workdir doratex/clang9-objc2:latest /bin/bash
# cd test
# ./test_all.sh
Auf diese Weise können Sie verschiedene Objective-C 2.0-Funktionen testen. (Der letzte GUI-Test der Tests funktioniert jedoch nur, wenn er mit dem X Window System-Server verbunden ist.)
Das diesmal erstellte Docker-Image wird in Docker Hub Repository hochgeladen.
$ docker pull doratex/clang9-objc2:ubuntu1910
Sie können es verwenden, wenn Sie dies tun.
Recommended Posts