Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[cdt] Add new port #29324

Merged
merged 4 commits into from
Mar 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions ports/cdt/boost-link.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
diff --git a/CDT/CMakeLists.txt b/CDT/CMakeLists.txt
index 555fb4e..86be850 100644
--- a/CDT/CMakeLists.txt
+++ b/CDT/CMakeLists.txt
@@ -155,7 +155,7 @@ target_compile_definitions(
)

if(CDT_USE_BOOST)
- target_link_libraries(${PROJECT_NAME} INTERFACE Boost::boost)
+ target_link_libraries(${PROJECT_NAME} PUBLIC Boost::boost)
Copy link

@artem-ogre artem-ogre Apr 4, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ex-purple
Hello, CDT maintainer here.
Could you explain why this patch is necessary? Maybe I could do the change upstream to avoid the need for patching.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks this #29324 (comment)
Otherwise the compiler just doesn't know where to find the boost headers to build cdt as library.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ex-purple
Sorry, I still don't get it :)
Error in this comment looks to be an include error. As CDT does not require any of the compiled parts of boost, in my understanding using target_link_libraries with INTERFACE should be enough. At least it works for cdt's automated CI builds.

Copy link

@artem-ogre artem-ogre Apr 4, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When I build CDT as header-only and use PUBLIC I get the CMake error: "INTERFACE library can only be used with the INTERFACE keyword"

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Look this: https://cmake.org/cmake/help/latest/module/FindBoost.html#imported-targets

Boost::boost
Target for header-only dependencies. (Boost include directory).

The command target_link_libraries(${PROJECT_NAME} PUBLIC Boost::boost) provides path to the boost headers

How else would the compiler find the boost header files to build CDT?

fatal error C1083: Cannot open include file: 'boost/container/flat_set.hpp':

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When I build CDT as header-only and use PUBLIC I get the CMake error: "INTERFACE library can only be used with the INTERFACE keyword"

Just check the value of the CDT_USE_AS_COMPILED_LIBRARY flag to choose between the INTERFACE or PUBLIC option.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Error in this comment looks to be an include error. As CDT does not require any of the compiled parts of boost, in my understanding using target_link_libraries with INTERFACE should be enough. At least it works for cdt's automated CI builds.

You are looking to get boost's include directories added to the build, so they need to be in cdt's build. INTERFACE supplies those include directories only to downstream consumers of your library.

You might not see this in your CI if another one of your dependencies happens to add the same include path, or if your system has another copy of boost installed somewhere global like /usr/include that is actually getting used here rather than the copy the user expected.

endif()


44 changes: 44 additions & 0 deletions ports/cdt/portfile.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
vcpkg_from_github(
OUT_SOURCE_PATH SOURCE_PATH
REPO artem-ogre/CDT
REF "${VERSION}"
SHA512 811d1fede4960808954bc17f37c8639f52800c98562e9283517c666735ddf3b2f2f8a57992669899be13c40b0fc4439d3cd1a101cb596d2335ef4fc307408c63
HEAD_REF master
PATCHES
boost-link.patch
)

vcpkg_check_features(OUT_FEATURE_OPTIONS FEATURE_OPTIONS
FEATURES
"64-bit-index-type" CDT_USE_64_BIT_INDEX_TYPE
"as-compiled-library" CDT_USE_AS_COMPILED_LIBRARY
"boost" CDT_USE_BOOST
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This looks like an alternative but it doesn't appear to leak into any ABI sensitive bits, so it's probably OK. However, the value does need to be "baked" into the resulting headers. See https://github.com/microsoft/vcpkg/blob/master/docs/maintainers/maintainer-guide.md#a-feature-may-replace-polyfills-with-aliases-provided-that-replacement-is-baked-into-the-installed-tree

I think you can do this with something like:

if(CDT_USE_BOOST)
set(CDT_USE_BOOST_STR "#if 1")
else()
set(CDT_USE_BOOST_STR "#if 0")
endif()

foreach(FILE CDTUtils.h Triangulation.hpp)
  vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/${FILE}" "#ifdef CDT_USE_BOOST" "${CDT_USE_BOOST_STR}")
endforeach()

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

)

if (NOT CDT_USE_AS_COMPILED_LIBRARY)
set(VCPKG_BUILD_TYPE "release") # header-only
endif()

vcpkg_cmake_configure(
SOURCE_PATH "${SOURCE_PATH}/CDT"
OPTIONS
${FEATURE_OPTIONS}
)

vcpkg_cmake_install()
vcpkg_cmake_config_fixup(CONFIG_PATH cmake)

if(CDT_USE_BOOST)
set(CDT_USE_BOOST_STR "#if 1")
else()
set(CDT_USE_BOOST_STR "#if 0")
endif()
foreach(FILE CDTUtils.h Triangulation.hpp)
vcpkg_replace_string("${CURRENT_PACKAGES_DIR}/include/${FILE}" "#ifdef CDT_USE_BOOST" "${CDT_USE_BOOST_STR}")
endforeach()

if (CDT_USE_AS_COMPILED_LIBRARY)
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
endif()

vcpkg_install_copyright(FILE_LIST "${SOURCE_PATH}/LICENSE")
31 changes: 31 additions & 0 deletions ports/cdt/vcpkg.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"name": "cdt",
"version": "1.2.0",
"description": "Constrained Delaunay Triangulation",
"homepage": "https://github.com/artem-ogre/CDT.git",
"license": "MPL-2.0",
"dependencies": [
{
"name": "vcpkg-cmake",
"host": true
},
{
"name": "vcpkg-cmake-config",
"host": true
}
],
"features": {
"64-bit-index-type": {
"description": "64bits are used to store vertex/triangle index types"
},
"as-compiled-library": {
"description": "Templates for float and double will be instantiated and compiled into a library"
},
"boost": {
"description": "Boost is used as a fall-back for features missing in C++98 and performance tweaks",
"dependencies": [
"boost-container"
]
}
}
}
4 changes: 4 additions & 0 deletions versions/baseline.json
Original file line number Diff line number Diff line change
Expand Up @@ -1356,6 +1356,10 @@
"baseline": "2.3",
"port-version": 3
},
"cdt": {
"baseline": "1.2.0",
"port-version": 0
},
"celero": {
"baseline": "2.8.5",
"port-version": 0
Expand Down
9 changes: 9 additions & 0 deletions versions/c-/cdt.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"versions": [
{
"git-tree": "d04985a703ae8b9201876879003d44c84f719a3a",
"version": "1.2.0",
"port-version": 0
}
]
}