CMake
Uwaga! Jest po północy! Programisto! Czy wiesz gdzie wskazuje teraz Twój wskaźnik? |
Ten artykuł jest częścią cyklu naukowego języki komputerowe. |
Języki programowania: |
Inne języki komputerowe: |
|
edytuj ten szablon |
CMake – język programowania wysokiego poziomu, mający w założeniach zastąpić stary i niewygodny program o nazwie make tak samo, jak C++ miał stanowić „lepsze C”. W miarę dokładania kolejnych funkcjonalności okazało się, że otrzymany twór stanowi kompletną maszynę Turinga, co całkowicie wyeliminowało konieczność używania jakiegokolwiek kompilatora. Często mylnie nazywany „narzędziem do zarządzania procesem kompilacji” z powodu pierwotnego celu postawionego przez jego twórców.
Prostota
Jest to jeden z najprostszych języków. Aby uzyskać najprostszy możliwy program, który nic nie robi, nie trzeba pisać żadnego maina. Pusty plik CMakeLists.txt w zupełności wystarczy. Obok niego tworzymy sobie katalog „build”, gdzie wchodzimy i po wykonaniu cmake ..
możemy oglądać nasze logi kompilacji w Czarnej Konsoli Hakerów™.
Kolejnym krokiem jest napisanie programu „żegnaj świecie”, co nie jest znacząco trudniejsze i sprowadza się do wywołania message("Hello world!")
. Nie potrzebujemy żadnych „inkludów”, żadnego informowania o tym, czego chcemy używać. Najprostsze przypadki są już wbudowane w sam język.
Zmienne
Jeśli lubisz PHP, to na pewno spodoba Ci się koncepcja pisania dolarów przy wszelkich zmiennych. Tutaj jest nawet ciekawiej, bo każda z nich jest ozdobiona wąsami z obu stron. Należy przy tym pamiętać, że ozdoby nakładamy tylko przy odczycie, inaczej wystąpi błąd. Dlaczego? Nie pytaj, taka jest tutejsza składnia, przyzwyczaisz się.
set(witaj "Hello world!") message("${witaj}")
Pętle
Tutaj sytuacja jest równie prosta. Możemy używać typowej pętli while i to nam w zupełności wystarczy do zapisania wszystkiego. Ewentualnie możemy użyć foreach do wygodnego przechodzenia przez wszystkie elementy jakiejś listy. Przykładowa pętelka:
cmake_minimum_required(VERSION 3.5) set(counter 1) set(max_counter 10) while(${counter} LESS ${max_counter}) message(${counter}) math(EXPR temp_counter "${counter}+1") set(counter ${temp_counter}) endwhile()
Jak widać, dodaliśmy w pierwszej linijce deklarację używanej wersji języka, żeby nasz kompilator wypluwał nam o jednego warninga mniej. Do wszelkich porównań mamy normalne słowa, takie jak LESS, GREATER czy EQUAL zamiast jakichś dziwacznych operatorów znanych w innych językach. Za pomocą uniwersalnej funkcji math jesteśmy w stanie policzyć wszystko, co jest do policzenia. Nie mamy jakichś dziwnych operatorów inkrementacji ani dekrementacji, po prostu dodajemy lub odejmujemy jedynkę.
Funkcje
Tutaj również nie ma wielkiej filozofii, nazywamy sobie jakoś naszą funkcję i ją wywołujemy.
cmake_minimum_required(VERSION 3.5) function(printNumbers from to) while((${from} LESS ${to}) OR (${from} EQUAL ${to})) message(${from}) math(EXPR next "${from}+1") set(from ${next}) endwhile() endfunction() printNumbers(1 5) printNumbers(7 9)
W przykładzie widać, że operatory logiczne również są proste i intuicyjne. Mamy AND, OR i NOT. To nam w zupełności wystarczy do zapisania dowolnych, nawet najbardziej dziwacznych warunków logicznych, jakie będziemy chcieli tutaj zastosować.
Coś trudniejszego
Zalety tego języka można wymieniać długo. No dobra, to pójdźmy od razu na głęboką wodę. Chcemy pobrać sobie stronę główną Nonsy i zapisać ją do pliku index.html na dysku. Pewnie myślisz, że musimy szukać jakiejś biblioteki do obsługi sieci, co? Nic z tego, kod robiący to zadanie można zapisać w dwóch prostych linijkach, o tak:
cmake_minimum_required(VERSION 3.5) file(DOWNLOAD "https://nonsa.pl/wiki/Strona główna" "${CMAKE_BINARY_DIR}/index.html")
Nie musisz wiedzieć, jak działa HTTPS, nie musisz się zastanawiać, jakiej biblioteki użyć. To wszystko jest już gotowe, twórcy języka zadbali o to, aby każda czynność była w nim prosta i bezbolesna. Wpisujesz dwie linijki i masz to, czego oczekujesz. Szybkie, proste i przyjemne. Warto wiedzieć, że CMAKE_SOURCE_DIR oznacza katalog z kodem źródłowym, a CMAKE_BINARY_DIR to folder, do którego trafią binarki.