2016-09-05 3 views
0

J'ai un ancien projet et je veux utiliser cMake au lieu des anciens autotools. Ce que l'ancien programme fait est que, après le type make, il fera libtest.a, libtest.la, libtest.so.1.0.0 etc. dans un dossier caché appelé .libs, puis après je tape make install , il installera toutes les bibliothèques dans un dossier cible $ TEST_ROOT/lib (variable d'environnement), il installera également tous les fichiers .h dans le dossier $ TEST_ROOT/include.cmake: comment installer les répertoires include/et lib/en tant qu'autotool?

dans le Makefile.am:

source_list=test1.cpp test2.cpp 
include_HEADERS=test1.h test2.h 
AM_LDFLAGS="-pthread -lm -lrt" 
lib_LTLIBRARIES=libtest.la 
libtest_la_SOURCES=$(source_list) 
libtest_la_LDFLAGS=$(AM_LDFLAGS) -static-libgcc 

dans configure.ac, je ne vois qu'une seule ligne pertinente,

if test -n "${TEST_ROOT}"; then 
    ac_default_prefix=${TEST_ROOT} 
    includedir=${ac_default_prefix}/include 
fi 

Franchement, je ne comprends pas vraiment pourquoi les codes ci-dessus feront. a, .la, .so etc. bibliothèques ensemble, puis les installer dans le dossier correspondant. Probablement autotools peut reconnaître le "ac_default_prefix" et "includeddir"?

Quoi qu'il en soit, je veux faire la même chose avec cmake, ce qui suit est ma tentative, mais pas une solution complète.

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/.libs) 
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY $(CMAKE_BINARY_DIR}/.libs) 

set(CMAKE_CXX_FLAGS "-O3 -Wall") 
set(CMAKE_EXE_LINKER_FLAGS "-pthread -lm -lrt") 

file(GLOB SOURCES "*.cpp") 
add_library(test STATIC ${SOURCES}) 

Le code ci-dessus compilera libtest.a dans le dossier de construction, pas dans le dossier .libs l'intérieur du dossier de construction (ce qui signifie que CMAKE_RUNTIME_OUTPUT_DIRECTORY etc ne fonctionne pas).

En second lieu, il ne construira libtest.a, il n'y a pas libtest.la, pas libtest.so.1.0.0 etc.

Troisièmement, je ne suis toujours pas sûr de savoir comment laisser faire installer travail comme l'auto outils. Puis-je simplement définir le répertoire include cible et le répertoire lib cible, puis make install va installer tous les fichiers .h et les fichiers .so, .a, .la dans le répertoire cible?

Aidez-nous s'il vous plaît.

Merci.

+1

CMake a une commande spéciale pour l'installation - [install()] (https: // cmake.org/cmake/help/v3.0/commande/install.html). Vérifiez la documentation pour cela, probablement les choses deviennent claires. Comme pour les variables 'CMAKE _ * _ OUTPUT_DIRECTORY', chacune d'elles affecte seulement le type spécifique de la bibliothèque/exécutable. Les bibliothèques statiques sont affectées par [CMAKE_ARCHIVE_OUTPUT_DIRECTORY] (https://cmake.org/cmake/help/v3.0/prop_tgt/ARCHIVE_OUTPUT_DIRECTORY.html). En outre, lorsque vous construisez une bibliothèque STATIC, pourquoi vous attendez-vous à ce que '.la' et' .so' soient compilés? Actuellement, votre question comporte trop de sous-questions, essayez de vous concentrer sur l'une d'entre elles. – Tsyvarev

+0

Je suis entièrement d'accord avec le trop de revendications sous-questions. – steveire

Répondre

1

Vous devez vous rendre à l'adresse suivante: CMakeLists.txt et ajouter par ex.

INSTALL(TARGETS test DESTINATION lib) 

Dans votre racine CMakeLists.txt vous pouvez déterminer le chemin d'installation standard:

SET(CMAKE_INSTALL_PREFIX ".") 

De la même manière, vous pouvez installer vos fichiers d'en-tête:

FILE(GLOB files "${CMAKE_CURRENT_SOURCE_DIR}/*.hxx") 
INSTALL(FILES ${files} DESTINATION include) 

Vous pouvez trouver des exemples encore plus à: https://cmake.org/Wiki/CMake:Install_Commands

Vous pouvez alors dans décrochage et les fichiers libs avec make (https://cmake.org/cmake/help/v3.1/variable/CMAKE_INSTALL_PREFIX.html):

make DESTDIR=/home/mistapink install 
1

Vous pourriez avoir besoin de définir CMAKE_ARCHIVE_OUTPUT_DIRECTORY aussi. À part cela, sachez que CMake ne fonctionne pas comme Autotools. Si vous voulez plusieurs bibliothèques, vous avez besoin de plusieurs appels add_library.