Ero sivun ”Kääntäminen” versioiden välillä

Siirry navigaatioon Siirry hakuun
Päivitystä
Kehityskirjastojen asennus eri jakeluissa
 
(12 välissä olevaa versiota samalta käyttäjältä ei näytetä)
Rivi 1: Rivi 1:
{{vaihtoehdot|koodin kääntämistä konekieleksi|Ohjelmatekstin suomeksi kääntämisestä|kotoistus}}
{{vaihtoehdot|koodin kääntämistä konekieleksi|Ohjelmatekstin suomeksi kääntämisestä|kotoistus}}


[[wikipedia:fi:Ohjelmointikielen kääntäjä|Kääntämisellä]] tarkoitetaan toimenpidettä, jossa ohjelman [[lähdekoodi]]n perusteella luodaan konekielinen ohjelma, joka on tietokoneen ymmärtämässä muodossa. Konekielinen ohjelma toimii yleensä vain tietyn käyttöjärjestelmän ja prosessorityypin yhdistelmällä, kun taas samasta lähdekoodista voidaan yleensä (jos lähdekoodi on sopivasti kirjoitettu) kääntää versiot monille eri alustoille. Lisäksi lähdekoodia on mahdollista muokata, jos omaa kohtalaiset ohjelmointitaidot. Konekielisen ohjelman muokkaaminen taas ei ole käytännössä mahdollista kuin erittäin rajoitetusti.
[[wikipedia:fi:Ohjelmointikielen kääntäjä|Kääntämisellä]] tarkoitetaan toimenpidettä, jossa ohjelman [[lähdekoodi]]n perusteella luodaan konekielinen ohjelma, joka on tietokoneen ymmärtämässä muodossa. Samasta lähdekoodista voidaan yleensä kääntää versiot monille eri alustoille. Lähdekoodia on myös mahdollista muokata itse, kun taas konekielisen ohjelman muokkaaminen on käytännössä erittäin rajoitettua.
 
Jos haluat muokata oman jakelusi pakettia, tämä kannattaa tehdä [[Jakelu|jakelun]] omilla työkaluilla ja mieluiten jakelun omasta lähdekoodista. Oman jakelun lähdekoodipaketit on yleensä mahdollista asentaa [[paketinhallinta|paketinhallinnan]] kautta erillisestä asennuslähteestä (source).
 
Jatkossa käsitellään muualta haetun lähdekoodin kääntämistä ja asentamista ilman jakelun omia työkaluja.


Jos haluaa muokata oman jakelun pakettia, tämä kannattaa tehdä jakelun omilla työkaluilla ja mieluiten jakelun omasta lähdekoodista (ellei nimenomaan halua toista versiota ohjelmasta - silloinkin jakelun tekemät muutokset on hyvä huomioida). Oman jakelun lähdekoodipaketit on yleensä mahdollista asentaa [[paketinhallinta|paketinhallinnan]] kautta erillisestä asennuslähteestä (source). Jatkossa käsitellään muualta haetun lähdekoodin kääntämistä ja asentamista ilman jakelun omia työkaluja.


== Nykyaikaiset rakennusjärjestelmät ==
== Nykyaikaiset rakennusjärjestelmät ==
=== CMake ===
=== CMake ===
[[CMake]] on yksi yleisimmistä ja de facto -standardeista rakennusjärjestelmistä monissa C/C++-projekteissa, erityisesti suurissa projekteissa kuten [[KDE]].
[[CMake]] on yksi yleisimmistä ja de facto -standardeista rakennusjärjestelmistä monissa [[C]]/[[C++]]-projekteissa, erityisesti suurissa projekteissa kuten [[KDE]]-ympäristössä.
 
==== Tyypillinen prosessi ====
 
Modernit kääntämistavat suosivat ulkopuolista käännöstä (out-of-source build). Tämä tarkoittaa, että kääntämisen luomat tiedostot (Makefile, objektit yms.) sijoitetaan omaan erilliseen hakemistoon (esim. build), jolloin lähdekoodihakemisto pysyy puhtaana.
 
<syntaxhighlight lang="bash">
# 1. Luo erillinen käännöshakemisto ja siirry sinne
mkdir build
cd build
 
# 2. Luo käännöstiedostot (Makefiles) lähdekoodin perusteella (lähdekoodi on ".." eli yksi ylöspäin hakemistorakenteessa.)
cmake ..  


Tyypillinen prosessi on: ''cmake .'', ''make'' (tai ''cmake --build .''), ''sudo make install''.
# 3. Käännä ohjelma (voidaan käyttää make- tai cmake --build -komentoa)
make
 
# 4. Asenna ohjelma järjestelmään
sudo make install
 
</syntaxhighlight>


=== Meson ===
=== Meson ===
[[Meson]] on uudempi, nopea ja suosittu rakennusjärjestelmä, joka on yleistynyt erityisesti [[GNOME]]-ympäristön ja monien muiden vapaan lähdekoodin projektien keskuudessa.
[[Meson]] on uudempi, nopea ja suosittu rakennusjärjestelmä, joka on yleistynyt erityisesti [[GNOME]]-ympäristön ja monien muiden vapaan lähdekoodin projektien keskuudessa. Se käyttää tyypillisesti [[Ninja]]-työkalua käännösprosessin suorittamiseen.


Tyypillinen prosessi on: ''meson setup builddir'', ''meson compile -C builddir'', ''sudo meson install -C builddir''.
==== Tyypillinen prosessi ====
<syntaxhighlight lang="bash">
# 1. Luo käännöshakemisto (Meson hoitaa tämän itse)
meson setup builddir  


[[Ninja]] on nopea, matalan tason rakennusjärjestelmä, jota [[Meson]] käyttää suoraan ja jonka [[CMake]] voi valita taustajärjestelmäksi perinteisen [[Makefile]]n sijaan käännösprosessin nopeuttamiseksi.
# 2. Käännä ohjelma Meson-hakemistossa
meson compile -C builddir


== Perinteinen GNU Autotools tapa ==
# 3. Asenna ohjelma järjestelmään
Vaikka tämä prosessi on edelleen validi ja käytössä monissa vanhemmissa tai yksinkertaisemmissa projekteissa, se ei enää edusta ainoaa tai edes yleisintä tapaa kääntää ohjelmia nykyaikaisessa Linux-ympäristössä.
sudo meson install -C builddir
</syntaxhighlight>


Ohjelmat kannattaa yleisesti ottaen asentaa jotenkin [[Ohjelmien asentaminen|muuten]] kuin muualta haettua koodia kääntämällä. Jos itse kääntäminen on välttämätöntä, käy se yleensä näin:
=== Ninja ja riippuvuuksien hallinta ===
[[Ninja]] on nopea, matalan tason rakennusjärjestelmä, jota [[Meson]] käyttää suoraan ja jonka [[CMake]] voi valita taustajärjestelmäksi perinteisen Makefilen sijaan käännösprosessin nopeuttamiseksi.


* Tarkista että ainakin [[gcc]] ja [[make]] ovat asennettuina.
Kaikki rakennusjärjestelmät tarvitsevat usein apua löytääkseen järjestelmästä puuttuvat kehityskirjastot (headerit). ''[[pkg-config]]'' on standardi työkalu, joka auttaa rakennusjärjestelmiä löytämään tarvittavat kirjastotiedostot ja niiden sijainnit.
* Hanki jostakin ohjelman lähdekoodit, joko kopioi ohjelman lähdekoodipaketti ja pura se
 
== Perinteinen GNU Autotools -tapa ==
Vaikka nykyaikaiset järjestelmät ovat yleistyneet, tämä prosessi on edelleen validi ja käytössä monissa vanhemmissa tai yksinkertaisemmissa projekteissa.
 
Ohjelmat kannattaa yleisesti ottaen asentaa jotenkin muuten kuin muualta haettua koodia kääntämällä. Jos itse kääntäminen on välttämätöntä, käy se yleensä näin:
 
'''1. Valmistelut:''' Tarkista, että ainakin [[gcc]] ja [[make]] ovat asennettuina.
 
'''2. Lähdekoodin haku ja purku:'''


  [[tar]] xvzf hyvasofta.tar.[[gz]]  
  [[tar]] xvzf hyvasofta.tar.[[gz]]  
Rivi 30: Rivi 65:
  tar xvjf hyvasofta.tar.[[bz2]]
  tar xvjf hyvasofta.tar.[[bz2]]


tai käytä ohjelmistoprojektin [[versionhallintajärjestelmä]]ä.
tai käytä ohjelmistoprojektin [[versionhallintajärjestelmä]]ä (esim. [[Git]]).


* Siirry paketin hakemistoon.
'''3. Siirry hakemistoon komennolla:'''
  cd hyvasofta
  cd hyvasofta


* Hakemistossa on yleensä tekstitiedostoja, joiden nimet ovat <tt>README</tt>, <tt>INSTALL</tt> tai vastaavaa. Lue nämä ja varmista, että kääntäminen todella tapahtuu niin kuin seuraavassa kerrotaan.
Lue hakemistossa olevat ''README''- tai ''INSTALL''-tiedostot.


* Mikäli ''configure''-tiedostoa ei löydy. Aja [[autoreconf]]-[[Bash-skriptaus|skripti]] komennolla:
'''4. configure -tiedoston luonti (tarvittaessa):''' Mikäli configure-tiedostoa ei löydy, aja ''autoreconf''-[[Bash-skriptaus|skripti]] komennnolla:


  autoreconf -i
  autoreconf -i


* autoreconf ajaa automaattisesti autoconf-, autoheader-, aclocal-, automake-, gettextize- ja libtoolize-ohjelmat oikeassa järjestyksessä ja luo configure-skriptin.
autoreconf ajaa automaattisesti tarvittavat ohjelmat ja luo configure-skriptin.


* Aja [[autoconf|<tt>configure</tt>]]-[[Bash-skriptaus|skripti]] komennolla:
'''5. Konfigurointi:''' Aja ''configure''-[[Bash-skriptaus|skripti]] komennolla:


  ./configure
  ./configure
# tai määrittele asennuspolku käyttäjän kotihakemistoon:
./configure --prefix=$HOME/ohjelmat/


tai  
* Riippuvuudet: Jos ''configure'' epäonnistuu puuttuvien riippuvuuksien vuoksi (kehityskirjastot eli headerit), ne löytyvät paketinhallinnasta yleensä päätteellä ''-devel'' tai ''-dev''. [[Debian]]-pohjaisissa jakeluissa ne on usein helppo asentaa komennolla:


  ./configure --prefix=$HOME/ohjelmat/
  sudo apt-get build-dep ohjelma


Jos käyttää tällaista vipua käytetään niin käännetty ohjelma pitäisi löytyä hakemistosta $HOME/ohjelmat/bin.
{| class="wikitable"
|+ Kehityskirjastojen asennus eri jakeluissa
|-
! Jakeluperhe (Paketinhallinta) !! Yleinen pääte !! Esimerkki asennuskomento
|-
| Debian, Ubuntu, Mint (APT) || -dev || sudo apt install libssl-dev
|-
| Fedora, Red Hat, CentOS (RPM / DNF) || -devel || sudo dnf install openssl-devel
|-
| Arch, Manjaro (Pacman) || Ei yleistä päätettä, usein pelkkä paketin nimi || sudo pacman -S openssl
|-
| OpenSUSE (Zypper) || -devel || sudo zypper install openssl-devel
|}


Configure luo käännöksessä tarvittavan [[Makefile]]n. Jos <tt>configure</tt>-skriptiä ei ole, kokeile komentoja <tt>make config</tt> ja/tai <tt>make menuconfig</tt>. Jos mistään ei tapahdu mitään, katso olisiko hakemistossa <tt>install.sh</tt>-tyylistä skriptiä. Jos on, aja se komennolla:
./install.sh


Osassa ohjelmapaketteja saattaa myös olla Makefile valmiina, jolloin <tt>configure</tt>a ei ole, eikä sitä tarvitse ajaa.
'''6. Kääntäminen:'''
* Jos <tt>configure</tt>-skripti ei mene kunnialla läpi, on syy usein puuttuvissa kehitys[[kirjasto]]issa eli headereissa (skripti mainitsee jonkin tietyn riippuvaisuuden puuttuvan). Nämä löytyvät paketinhallinnan kautta yleensä päätteellä ''-devel'' tai ''-dev'' (esimerkiksi ''[[gimp]]-devel'', pääte vaihtelee jakeluittain). Tilan säästämiseksi useimpien ohjelmien paketointien mukana ei toimiteta niiden kehityskirjastoja, vaan nämä on asennettava erillisestä paketista. Joskus ongelmana voi myös olla se, ettei <tt>configure</tt> löydä tarvittavaa riippuvaisuutta vaikka se ja sen kehityskirjastot olisi asennettu. Tällöin niiden sijainti on yleensä mahdollista määritellä erillisellä [[valitsin|valitsimella]]. Lisätietoja valitsimista saa komennolla:
./configure --help
 
Myös <tt>INSTALL</tt>- tai <tt>README</tt>-tiedostoissa on usein mainittu asiasta jotakin. [[Debian]]-pohjaisissa jakeluissa kehityskirjastot on yleensä helppo asentaa komennolla <tt>[[apt-get]] build-dep ohjelma</tt>.
* Käännä ohjelma komennolla:
  make
  make


Käännön aikana ruutuun tulostuu yleensä runsaasti tietoa käännön etenemisestä. Jos <tt>make</tt>-komento ei mene läpi, vaan pysähtyy ilmoittaen virheestä jollakin rivillä, on lähdekoodissa todennäköisesti vikaa. Yleensä kyse on lähdekoodin epäyhteensopivuudesta käytetyn kääntäjäversion kanssa. Virheilmoituksen perusteella saattaa olla mahdollista helpostikin korjata virhe. Muussa tapauksessa kannattaa lähettää palautetta ohjelman kehittäjälle.
'''7. Asennus:''' Siirry [[pääkäyttäjä]]ksi ja asenna ohjelma (katso kuitenkin kohta [[Kääntäminen#Kääntäminen ja paketinhallinta|Kääntäminen ja paketinhallinta]]):
 
* Siirry [[pääkäyttäjä]]ksi ja asenna ohjelma komennolla:
[[sudo]] make install
 
Tämä kopioi käännetyt binäärit lopulliseen asennushakemistoonsa. Mikäli et halua asentaa ohjelmaa pääkäyttäjänä, voit antaa tunnuksellesi kirjoitusoikeudet asennushakemistoon asennuksen ajaksi. Voit toki käyttää ohjelmaa myös lähdekoodihakemistosta käsin tai määrittää sopivan asennuspolun omasta kotihakemistostasi. Tämä tapahtuu <tt>configure</tt>n valitsimella <tt>--prefix</tt>, esimerkiksi <tt>--prefix=/home/kayttaja/hyvasofta</tt>.


Joskus Makefilessä on uninstall-toiminto, jolla ohjelma poisto onnistuu kätevästi komennolla:
  sudo make install
  make uninstall


Huomaa kuitenkin, että mikäli esimerkiksi poistat näin jonkin [[kirjasto]]n, sitä käyttävät ohjelmat lakkaavat toimimasta. Jos jostain syystä haluat kääntää ohjelman uudelleen, voit poistaa luodut binäärit ja Makefilen lähdekoodihakemistosta komennolla:
'''8. Siivoaminen ja poisto:''' Voit poistaa luodut binäärit ja Makefilen lähdekoodihakemistosta komennolla ''make clean''. Joskus Makefilessa on myös poistotoiminto ''make uninstall''.
  make clean
  make clean


== Kääntäminen ja paketinhallinta ==
== Kääntäminen ja paketinhallinta ==
Kenties paras vaihtoehto on tehdä käännetystä ohjelmasta oman jakelun mukainen paketti ja asentaa se paketinhallinnan kautta. Tällöin komentoa <tt>make install</tt> ei anneta, vaan tilalle tulee jakelun omat paketinluomis- ja asennuskomennot. Katso esimerkiksi [[CheckInstall]] sekä [[Deb-paketin tekeminen]].  
Kenties paras vaihtoehto on tehdä käännetystä ohjelmasta oman jakelun mukainen paketti ja asentaa se paketinhallinnan kautta. Tällöin komentoa ''make install'' ei anneta.
 
Katso esimerkiksi [[CheckInstall]], sekä [[Deb-paketin tekeminen]].


Jos käännettävä ohjelmisto tarjoaa jotakin toiminnallisuutta, josta paketinhallinnan olisi hyvä olla tietoinen, tämän voi kertoa paketinhallinnalle, vaikka itse ohjelmasta ei tekisikään oikeata ohjelmapakettia. Tähän käyttöön sopii "dummy"-paketti, joka sisältää vain riippuvuudet ja muun metadatan. Debianissa tällaisen paketin tekoon on olemassa apupaketti ''equivs''.
Jos käännettävä ohjelmisto tarjoaa jotakin toiminnallisuutta, josta paketinhallinnan olisi hyvä olla tietoinen, voit luoda niin sanotun '''"dummy"'''-paketin. Dummy-paketti sisältää vain riippuvuudet ja muun metadatan. Debianissa tällaisen paketin tekoon on olemassa apupaketti ''equivs''.


[[Luokka:Järjestelmä]]
[[Luokka:Järjestelmä]]
[[Luokka:Kehitystyökalut]]
[[Luokka:Kehitystyökalut]]
[[Luokka:Ohjeet]]
[[Luokka:Ohjeet]]