Hi Kou,

> What does "only one version of the library" mean here? Only
> shared version or only static version? If we use
> -DARROW_BUILD_SHARED=ON and -DARROW_BUILD_STATIC=ON, we can
> build both of shared version and static version in the same
> build process. Am I missing something?

That was a mistake on my part. What I meant was that, for "executable"
targets, only one version can be linked:
[1]
https://github.com/apache/arrow/blob/acbad2942be80e9a76b888f99fe3b9ebdc4f2941/cpp/examples/arrow/CMakeLists.txt#L144-L148
[2]
https://github.com/apache/arrow/blob/acbad2942be80e9a76b888f99fe3b9ebdc4f2941/cpp/examples/parquet/CMakeLists.txt#L51-L56
[3]
https://github.com/apache/arrow/blob/acbad2942be80e9a76b888f99fe3b9ebdc4f2941/cpp/tools/parquet/CMakeLists.txt#L29-L33

Should we set an alias target in one place for such usages, for example:

    if(ARROW_BUILD_SHARED)
        add_library(parquet_lib ALIAS parquet_shared)
    else()
        add_library(parquet_lib ALIAS parquet_static)
    endif()

, or just leave it be until there are more occurrences?

Thanks,
Eddie

Sutou Kouhei <k...@clear-code.com> 於 2025年6月3日 週二 下午4:44寫道:

> Hi,
>
> > However, with the current implementation, only one version of the library
> > actually exists within a single build process.
>
> What does "only one version of the library" mean here? Only
> shared version or only static version? If we use
> -DARROW_BUILD_SHARED=ON and -DARROW_BUILD_STATIC=ON, we can
> build both of shared version and static version in the same
> build process. Am I missing something?
>
>
> Thanks,
> --
> kou
>
> In <cahgae5exol+9ohtujp+-n3vpssrgeajbxn1do0dlegbqsz6...@mail.gmail.com>
>   "Re: [C++] Static/Shared Linkage in CMakeLists.txt" on Tue, 3 Jun 2025
> 16:37:42 +0800,
>   Eddie Chang <kalcifer7...@gmail.com> wrote:
>
> > Hi Kou,
> >
> > Building both shared and static versions of the library simultaneously is
> > certainly possible. My current focus is on the fact that we have multiple
> > build targets linking against the same library, and each time we do so,
> we
> > repeat the same if-else logic to decide which version to link.
> >
> > However, with the current implementation, only one version of the library
> > actually exists within a single build process. So we only need to
> determine
> > whether to build the static or shared version once―when building the
> > library itself―instead of repeating the same check every time a build
> > target links against the same library.
> >
> > If you'd like to support both versions, I suppose you already need to
> build
> > twice (with different build options) with the current implementation?
> > Thanks,
> > Eddie
> >
> > Sutou Kouhei <k...@clear-code.com> 於 2025年6月3日 週二 下午3:10寫道:
> >
> >> Hi,
> >>
> >> How to support a use case that wants both of shared library
> >> and static library with your suggested approach? Do you
> >> build Apache Arrow C++ twice for shared library and static
> >> library?
> >>
> >> If so, what CMake package name is used for them?
> >> "ArrowShared" and "ArrowStatic"?
> >>
> >>
> >> Thanks,
> >> --
> >> kou
> >>
> >> In <cahgae5er0+vbomjv7w8_dt068yhabclqdkkigo_qp8lz4vr...@mail.gmail.com>
> >>   "RE: Re: [C++] Static/Shared Linkage in CMakeLists.txt" on Tue, 3 Jun
> >> 2025 14:49:02 +0800,
> >>   Eddie Chang <kalcifer7...@gmail.com> wrote:
> >>
> >> > Just to clarify, my suggestion was assuming that each build only
> produces
> >> > either static or shared libraries, not both.
> >> >
> >> > Given that assumption, wouldn't it be better to define targets using a
> >> > single name (without `_static` or `_shared` suffix), and decide in one
> >> > place whether that target is defined as STATIC or SHARED depending on
> the
> >> > `ARROW_BUILD_SHARED`?
> >> >
> >> > That way, we wouldn't need to switch on `ARROW_BUILD_SHARED`
> repeatedly
> >> to
> >> > determine which target name to link.
> >> >
> >> > On 2025/06/03 06:05:45 Sutou Kouhei wrote:
> >> >> Hi,
> >> >>
> >> >> Do you want a CMake target that can be used for shared
> >> >> linking and static linking? For example, you want to use
> >> >> Parquet::parquet for shared linking and static linking,
> >> >> right?
> >> >>
> >> >> In my understanding, we can't do it with CMake. We need to
> >> >> specify "SHARED" or "STATIC" when create a CMake target by
> >> >> add_library().
> >> >> See also:
> >> >> https://cmake.org/cmake/help/latest/command/add_library.html#normal
> >> >>
> >> >> Thanks,
> >> >> --
> >> >> kou
> >> >>
> >> >> In <ca...@mail.gmail.com>
> >> >>   "[C++] Static/Shared Linkage in CMakeLists.txt" on Tue, 3 Jun 2025
> >> > 13:45:36 +0800,
> >> >>   Eddie Chang <ka...@gmail.com> wrote:
> >> >>
> >> >> > Hello everyone, I've noticed that in our CMakeLists.txt files, we
> have
> >> >> > multiple instances where we conditionally select either the static
> or
> >> >> > shared version of a linked target based on a cache variable such as
> >> >> > ARROW_BUILD_SHARED. For example, the following pattern appears in
> >> > several
> >> >> > places:
> >> >> >
> >> >> >     if(ARROW_BUILD_SHARED)
> >> >> >         set(PARQUET_EXAMPLE_LINK_LIBS parquet_shared)
> >> >> >     else()
> >> >> >         set(PARQUET_EXAMPLE_LINK_LIBS parquet_static)
> >> >> >     endif()
> >> >> >
> >> >> > I’m wondering if there is a specific reason we don’t set the
> >> > static/shared
> >> >> > property of the libraries in a single location, and instead
> continue
> >> >> > duplicating this kind of logic throughout the codebase?
> >> >>
> >>
>

Reply via email to