CMake - instalacja w systemie

CMake - instalacja w systemie
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
0

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

Kopiuj
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:

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

Plik CMakeLists.txt

Kopiuj
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?


Fan moderatora somekind
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:3 minuty
0

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


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
2

A nie wystarczy po prostu:

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

?

Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
0
0x666 napisał(a):

A nie wystarczy po prostu:

Kopiuj
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?


Fan moderatora somekind
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
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.

Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
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?


Fan moderatora somekind
06
  • Rejestracja:prawie 20 lat
  • Ostatnio:około rok
  • Postów:2440
0

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

BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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:
Kopiuj
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

edytowany 2x, ostatnio: BartoSAS
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
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


Fan moderatora somekind
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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.

Althorion
Prawdę mówiąc, zawsze jak używam CMake’a to mam takie wrażenie…
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
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


Fan moderatora somekind
edytowany 1x, ostatnio: Marcin Marcin
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
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

edytowany 1x, ostatnio: BartoSAS
Marcin Marcin
  • Rejestracja:około 6 lat
  • Ostatnio:2 miesiące
  • Postów:610
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


Fan moderatora somekind
BartoSAS
  • Rejestracja:ponad 10 lat
  • Ostatnio:3 minuty
  • Postów:305
0

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.