CMake - instalacja w systemie

0

Chciałbym stworzyć możliwość instalowania aplikacji w systemie.
Do tej pory robiłem to funkcją wykorzystującą polecenie systemowe:

void set_global(void) {
    /*Function to set hdf-to-tif as global application.*/
    puts(ANSI_COLOR_RED"WARINING! ROOT PERMISSION OR ADMINISTRATOR NEED!"ANSI_COLOR_RESET);
    puts("Set "ANSI_COLOR_GREEN"hdf-to-tif"ANSI_COLOR_RESET" as global application.");
    system("sudo rm -rf /usr/bin/hdf-to-tif");
    system("sudo cp -r hdf-to-tif /usr/bin");
    system("export PATH=\"/usr/bin:$PATH\"");
    system("sudo chmod 755 /usr/bin/hdf-to-tif");
}

Chciałem to zmienić dodając do pliku CMakeList.txt odpowiednią instrukcję instalacji.
Po wykonaniu instalacji dostaję komunikat:

CMake Error at cmake_install.cmake:55 (file):
  file INSTALL cannot copy file

Plik CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(hdf-to-tif C)

set(CMAKE_C_STANDARD 99)

# find system installed GDAL package with predefined CMake variable for finding GDAL
find_package(GDAL REQUIRED)

# Specify location of GDAL header files
include_directories(include ${GDAL_INCLUDE_DIRS})

add_executable(hdf-to-tif main.c h5_proc.c h5_proc.h ANSI_color_codes.h)

# Specify GDAL libraries to link your cpp executable target against
target_link_libraries(hdf-to-tif -lm ${GDAL_LIBRARIES})

install(TARGETS hdf-to-tif DESTINATION /opt/)

Co powinienem dopisać w pliku CMakeLists.txt aby wykonało się to samo co robi funkcja set_global oraz jak zrobić to w ten sposób aby pod innymi systemami także działało?
CMAKE_BINARY_DIR - czy to będzie zależnie od systemu operacyjnego?
CMAKE_CURRENT_BINARY_DIR - czy to obecna ścieżka?

0

Katalog docelowy podaje się chyba na etapie konfiguracji.
https://cmake.org/cmake/help/v3.0/variable/CMAKE_INSTALL_PREFIX.html

2

A nie wystarczy po prostu:

install(TARGETS hdf-to-tif RUNTIME DESTINATION bin LIBRARY DESTINATION lib)

?

0
0x666 napisał(a):

A nie wystarczy po prostu:

install(TARGETS hdf-to-tif RUNTIME DESTINATION bin LIBRARY DESTINATION lib)

?

Twoja odpowiedź rozwiązała mój problem.
Czy za pomocą tego mogę zbudować to pod windows i stworzyć .exe które będzie dostępne z linii komend?

0

Chodzi Ci o to, żeby aplikacja była dostępna w cmd jak komenda np. ping czy ipconfig? Jeśli tak, to musiałbyś dodać katalog z .exe do zmiennej środowiskowej PATH. Ale czy to jest możliwe z poziomu CMake'a? Wątpię. Komenda make install jest przeniesiona ze świata Linux/Unixowego i średnio pasuje do Windowsa, gdzie od instalowania oprogramowania jest instalator.

0

Jak zrobię z poziomu windowsa gcc i podam pliki źródłowe to stworzyć plik .exe - czy można wygenerować instalator i zrobi to samo z cmake?

0

Jeśli w projekcie będziesz miał dodatkowo źródła instalatora, to oczywiście możesz tak zrobić.

0

Jeżeli dobrze zrozumiałem, to wydaje mi się to wykonalne:

  1. Budujesz projekt z poleceniem install.
  2. Do "install" dodajesz add_custom_command, które wykona doda do zmiennej PATH:
setx /M path "%path%;C:\your\path\here\"

CMake - add_custom_command
Dodanie do PATH permanentnie

P.S. - gdzieś musisz pomiędzy "wcisnąć" deploy, jak @_0x666_ napisał wyżej

0

Czy można zrobić instalator z CMake który zbuduje projekt i zainstaluje czy wrzucać binarkę dla użytkownika?

Myślałem aby w pakiecie instalacyjnym był CMake który skompiluje projekt i zainstaluje u użytkownika ale nie robi się tak
jest to wrzucanie pliku .exe który się instaluje i dodaje w systemie

0

Teoretycznie można, ale musisz przygotować sobie wszystkie ewentualne pliki, których potrzebuje Twój exe.
Mimo wszystko mam wrażenie, że wygodniej byłoby Ci zrobić mały .bat, który to ogarnie.

0

Opcja która by mnie bardziej interesowała to zintegrowanie tego z CI/CD które mam na gitlabie

Po wrzuceniu czegoś do repo chciałbym odpalić testy i zrobić paczkę z instalatorem.
Po dodaniu releasa chciałbym aby binarki były do pobrania

Trudne ale jak zrobię raz to mam cały system budowania i nie muszę tego kompilować na każdym systemie mając automatycznie gotowe pakiety do instalacji

0

A to zmienia postać rzeczy.
Polecam zapoznać się z ich sposobem tworzenia CI/DI
Więc z tego, co mogę Ci podpowiedzieć, a potem być może przyjdzie ktoś starszy doświadczeniem i skoryguje, to wygodną opcją jest:

  • CI/DI opisać w YAML, który ogarnie skrypty shellowe
  • w skryptach .bat lub .sh zapisz sobie:
    -- skompilowanie projektu CMake'm w trybie install
    -- przeprowadzenie testów
    -- dodanie niezbędnych plików dla binarki ( o ile testy się powiodły )
    -- spakowanie tego w zipa lub cokolwiek innego, na co pozwala GitLab, aby to było gotowe do pobrania jako release

I tu zaleta: przez to, że całość będzie sterowana YAMLem możesz rozbić sobie na kilka mniejszych skryptów powyższe kroki dla uzyskania ewentualnej wygody i czytelności

0

Mam do projektu zrobione testy na kontenerach które budują projekt. Podczas testów instaluje się w kontenerze.
Brakuje mi tej części gdzie tą binarkę spakuję w paczkę i wystawię jako pakiet w repo (przydałoby się aby nie tylko dla jednej dystrybucji) oraz skompiluję kolejną wersję pod windowsa

0

Tutaj pomysły mi się kończą, zostawiam Ci jeszcze jeden link: https://docs.gitlab.com/ee/user/project/releases/

1 użytkowników online, w tym zalogowanych: 0, gości: 1