Я хотел бы начать проект С++ на GitHub, чтобы я мог клонировать/строить на разных операционных системах (например, OSX и unix). Будет множество зависимостей, которые необходимо установить (например, curl, libxml2 и т.д.), И, насколько это возможно, я бы хотел, чтобы пользователь не потребовал вручную устанавливать депиляции в системе. Можно ли это сделать?
Как мне настроить проект С++ на github, чтобы он был переносимым?
Ответ 1
Это зависит от того, сколько вы хотите откусить.
Короткий ответ - пусть CMake выполнит работу. Он будет генерировать проекты для любой платформы, и они должны использоваться. Вам не нужно распространять двоичные файлы для этого, предполагая, что они легко доступны вам (и им, по расширению).
Вот пример, который устанавливает sqlite, boost и eigen, которые я использовал для одного из моих проектов.
cmake_minimum_required(VERSION 2.8)
set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/Modules)
# boost
find_package(Boost 1.42.0 REQUIRED )
include_directories(${Boost_INCLUDE_DIRS})
link_directories(${Boost_LIBRARY_DIRS})
find_package(Eigen REQUIRED)
include_directories(${EIGEN_INCLUDE_DIRS})
find_package(Sqlite3 REQUIRED)
include_directories(${SQLITE3_INCLUDE_DIR})
set(CMAKE_CXX_FLAGS "-std=c++0x")
include_directories(.)
link_libraries(
${Boost_LIBRARIES}
${SQLITE3_LIBRARIES}
)
add_executable(igd_sqlite
main.cpp
)
Вы бы взяли это и создали проекты визуальной студии, make файлы и т.д. Затем создайте проект, как обычно.
CMake поддерживает множество библиотек из коробки, хотя иногда вам приходится искать Google для менее популярных и добавлять их в свой проект.
Я использую его для повседневной работы, даже если мне не нужна перекрестная платформа.
Когда я действительно хочу распространять двоичные файлы, я обычно настраиваю внешнюю папку с двоичными файлами.
Вот пример:
https://github.com/tomisarobot/curl_race
Это отлично работает, если у вас нет большого количества внешних зависимостей, и если они не огромны. Если это не так, я бы рекомендовал поместить каждую пластину в разные репозитории. Ваш источник должен быть в своем собственном. Вы можете использовать подпроекты, если хотите, хотя это не обязательно. Внешние депо не часто меняются, поэтому его не всегда стоит накладных расходов. Обычно я пишу bash script, чтобы документировать, где все это получить. Этот script обычно необходим для сборки распределения.
Такие вещи, как maven-nar-plugin, хотя я не знаю его зрелости. Если вы просто создаете все двоичные файлы для распространения вместе с вашим источником, возможно, это не так привлекательно. Я не вижу много разговоров об этом, поэтому я предполагаю, что принятие является низким. Посмотрев, что делает maven для Java, он должен быть более популярен.
Ответ 2
Немногие мысли
1) Инструменты
-
Если возможно, включите источники инструмента в репозиторий, чтобы их можно было создать как первый шаг
-
Когда это невозможно, четко укажите, какая минимальная версия какого инструмента требуется, чтобы пользователь мог самостоятельно установить их
- Возможно, проверьте, удовлетворяются ли требования зависимостей, запустив script
2) Язык
Компиляция с соблюдением строгого языка. Например
g++ -std=c++11 -pedantic