Skip to content

Instantly share code, notes, and snippets.

@valgur
Last active May 9, 2023 19:53
Show Gist options
  • Save valgur/f87d626ab966af163d09834ff890ea8c to your computer and use it in GitHub Desktop.
Save valgur/f87d626ab966af163d09834ff890ea8c to your computer and use it in GitHub Desktop.
Create a recipe skeleton for a new conan-center-index package.
#!/bin/bash
set -eu -o pipefail
name=$1
version=$2
template=${3:-"cmake_package"}
echo Copying sources...
root=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
pkg_dir=$root/recipes/$name
rm -r "$pkg_dir" || true
cp -r "$root/docs/package_templates/$template" "$pkg_dir"
echo Cleaning up conanfile.py...
conanfile="$pkg_dir/all/conanfile.py"
# Strip all comments (except TODOs)
sed -E '/#.*$/ { /(# *TODO)/! d }' -i "$conanfile"
# Remove self.settings.rm_safe("compiler.*") lines that are meant for C libraries
sed -E '/self\.settings\.rm_safe\("compiler.+$/d' -i "$conanfile"
# Replace 'package_lib' with $name
sed "s/package_lib/$name/g" -i "$conanfile"
# Replace 'package' with lower-case name
sed -E "s/\bpackage\b/$name/g" -i "$conanfile"
sed "s/$name(self)/package(self)/g" -i "$conanfile"
# Replace 'Package' with capitalized name
sed "s/Package/${name^}/g" -i "$conanfile"
# Replace 'PACKAGE' with an all-caps name
sed "s/PACKAGE/${name^^}/g" -i "$conanfile"
# Autoformat
black "$conanfile" -l 100 -t py311
echo Cleaning up test_package/CMakeLists.txt...
cat > "$pkg_dir/all/test_package/CMakeLists.txt" << EOF
cmake_minimum_required(VERSION 3.15)
project(test_package LANGUAGES CXX)
find_package($name REQUIRED CONFIG)
add_executable(\${PROJECT_NAME} test_package.cpp)
target_link_libraries(\${PROJECT_NAME} PRIVATE $name::$name)
target_compile_features(\${PROJECT_NAME} PRIVATE cxx_std_14)
EOF
cat > "$pkg_dir/all/test_v1_package/CMakeLists.txt" << EOF
cmake_minimum_required(VERSION 3.15)
project(test_package LANGUAGES CXX)
include(\${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(TARGETS)
add_subdirectory(\${CMAKE_CURRENT_SOURCE_DIR}/../test_package/
\${CMAKE_CURRENT_BINARY_DIR}/test_package/)
EOF
echo Writing config.yml and conandata.yml...
cat > "$pkg_dir/config.yml" << EOF
versions:
"$version":
folder: all
EOF
cat > "$pkg_dir/all/conandata.yml" << EOF
sources:
"$version":
url: "https://github.com/$name/$name/archive/refs/tags/$version.tar.gz"
sha256: "________________________________________________________________"
EOF
echo Writing test_package/test_package.cpp...
cat > "$pkg_dir/all/test_package/test_package.cpp" << EOF
#include <cstdlib>
#include <iostream>
#include <${name}/${name}.h>
int main() {
${name}::${name} foo;
std::cout << "Hello, world!" << std::endl;
return EXIT_SUCCESS;
}
EOF
echo Done.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment