Hi Patrick,

On Thu, Feb 14, 2019 at 09:12:18AM -0500, Patrick Hemmer wrote:
> 
> 
> On 2019/2/14 08:20, Frederic Lecaille wrote:
> > On 2/14/19 1:32 PM, Frederic Lecaille wrote:
> >> On 2/13/19 7:30 PM, Patrick Hemmer wrote:
> >>>
> >>>
> >>> On 2019/2/13 10:29, Olivier Houchard wrote:
> >>>> Hi Patrick,
> >>>>
> >>>> On Wed, Feb 13, 2019 at 10:01:01AM -0500, Patrick Hemmer wrote:
> >>>>> On 2019/2/13 09:40, Aleksandar Lazic wrote:
> >>>>>> Am 13.02.2019 um 14:45 schrieb Patrick Hemmer:
> >>>>>>> Trying to compile haproxy on my local machine for testing
> >>>>>>> purposes and am
> >>>>>>> running into the following:
> >>>>>> Which compiler do you use?
> >>>>>     # gcc -v
> >>>>>     Configured with:
> >>>>> --prefix=/Applications/Xcode.app/Contents/Developer/usr
> >>>>> --with-gxx-include-dir=/usr/include/c++/4.2.1
> >>>>>     Apple LLVM version 9.0.0 (clang-900.0.39.2)
> >>>>>     Target: x86_64-apple-darwin17.7.0
> >>>>>     Thread model: posix
> >>>>>     InstalledDir:
> >>>>> /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
> >>>>>
> >>>>>
> >>>>>>>          # make TARGET=osx
> >>>>>>>          src/proto_http.c:293:1: error: argument to 'section'
> >>>>>>> attribute is not
> >>>>>>> valid for this target: mach-o section specifier requires a
> >>>>>>> segment and section
> >>>>>>> separated by a comma
> >>>>>>>          DECLARE_POOL(pool_head_http_txn, "http_txn",
> >>>>>>> sizeof(struct http_txn));
> >>>>>>>          ^
> >>>>>>>          include/common/memory.h:128:2: note: expanded from
> >>>>>>> macro 'DECLARE_POOL'
> >>>>>>>                          REGISTER_POOL(&ptr, name, size)
> >>>>>>>                          ^
> >>>>>>>          include/common/memory.h:123:2: note: expanded from
> >>>>>>> macro 'REGISTER_POOL'
> >>>>>>>                          INITCALL3(STG_POOL,
> >>>>>>> create_pool_callback, (ptr), (name),
> >>>>>>> (size))
> >>>>>>>                          ^
> >>>>>>>          include/common/initcall.h:102:2: note: expanded from
> >>>>>>> macro 'INITCALL3'
> >>>>>>>                          _DECLARE_INITCALL(stage, __LINE__,
> >>>>>>> function, arg1, arg2,
> >>>>>>> arg3)
> >>>>>>>                          ^
> >>>>>>>          include/common/initcall.h:78:2: note: expanded from macro
> >>>>>>> '_DECLARE_INITCALL'
> >>>>>>>                          __DECLARE_INITCALL(__VA_ARGS__)
> >>>>>>>                          ^
> >>>>>>>          include/common/initcall.h:65:42: note: expanded from macro
> >>>>>>> '__DECLARE_INITCALL'
> >>>>>>> __attribute__((__used__,__section__("init_"#stg))) =   \
> >>>>>>>
> >>>>>>>
> >>>>>>>
> >>>>>>> Issue occurs on master, and the 1.9 branch
> >>>>>>>
> >>>>>>> -Patrick
> >>>> Does the (totally untested, because I have no Mac to test) patch
> >>>> works for
> >>>> you ?
> >>>
> >>> Unfortunately not. Just introduces a lot of new errors:
> >>>
> >>>
> >>>      In file included from src/ev_poll.c:22:
> >>>      In file included from include/common/hathreads.h:26:
> >>>      include/common/initcall.h:134:22: error: expected ')'
> >>>      DECLARE_INIT_SECTION(STG_PREPARE);
> >>>                                               ^
> >>>      include/common/initcall.h:134:1: note: to match this '('
> >>>      DECLARE_INIT_SECTION(STG_PREPARE);
> >>>      ^
> >>>      include/common/initcall.h:124:82: note: expanded from macro
> >>> 'DECLARE_INIT_SECTION'
> >>>                      extern __attribute__((__weak__)) const struct
> >>> initcall *__start_init_##stg __asm("section$start$__DATA$" stg); \
> >>> ^
> >>
> >> Try to use -E in place of -c option of your compiler to stop after
> >> having preprocessed the code. Then have a look to how the code of
> >> src/ev_poll.c was preprocessed.
> >>
> >> This should help.
> >>
> >> Fred.
> >
> > As this sounds to be a preprocessing issue, and to have a look to how
> > the code is preprocessed for Apple we can invert the two #ifdef
> > __APPLE__  condition of Olivier's patch to use the same preprocessor
> > commands on a Linux system.
> >
> >
> > Here is the code after having preprocessed it:
> >
> >
> > # 134 "include/common/initcall.h"
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_PREPARE __asm("section$start$__DATA$" STG_PREPARE);
> > extern __attribute__((__weak__)) const struct initcall
> > *__stop_init_STG_PREPARE __asm("section$end$__DATA$" STG_PREPARE);
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_LOCK __asm("section$start$__DATA$" STG_LOCK); extern
> > __attribute__((__weak__)) const struct initcall *__stop_init_STG_LOCK
> > __asm("section$end$__DATA$" STG_LOCK);
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_ALLOC __asm("section$start$__DATA$" STG_ALLOC);
> > extern __attribute__((__weak__)) const struct initcall
> > *__stop_init_STG_ALLOC __asm("section$end$__DATA$" STG_ALLOC);
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_POOL __asm("section$start$__DATA$" STG_POOL); extern
> > __attribute__((__weak__)) const struct initcall *__stop_init_STG_POOL
> > __asm("section$end$__DATA$" STG_POOL);
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_REGISTER __asm("section$start$__DATA$"
> > STG_REGISTER); extern __attribute__((__weak__)) const struct initcall
> > *__stop_init_STG_REGISTER __asm("section$end$__DATA$" STG_REGISTER);
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_INIT __asm("section$start$__DATA$" STG_INIT); extern
> > __attribute__((__weak__)) const struct initcall *__stop_init_STG_INIT
> > __asm("section$end$__DATA$" STG_INIT);
> >
> >
> >
> > should be I guess
> >
> > extern __attribute__((__weak__)) const struct initcall
> > *__start_init_STG_PREPARE __asm("section$start$__DATA$STG_PREPARE");
> >
> > etc.
> >
> >
> > and the compiler warns like this:
> >
> >
> > $ gcc -Iinclude -Iebtree -Wall -Wextra  -O2 -g -fno-strict-aliasing
> > -Wdeclaration-after-statement -fwrapv   -Wno-unused-label
> > -Wno-sign-compare -Wno-unused-parameter -Wno-old-style-declaration
> > -Wno-ignored-qualifiers -Wno-clobbered -Wno-missing-field-initializers
> >  -Wtype-limits -Wshift-negative-value -Wshift-overflow=2
> > -Wduplicated-cond -Wnull-dereference       -DCONFIG_HAP_LINUX_SPLICE
> > -DTPROXY -DCONFIG_HAP_LINUX_TPROXY -DCONFIG_HAP_CRYPT -DNEED_CRYPT_H
> > -DUSE_ZLIB  -DENABLE_POLL -DENABLE_EPOLL -DUSE_CPU_AFFINITY
> > -DASSUME_SPLICE_WORKS -DUSE_ACCEPT4 -DNETFILTER -DUSE_THREAD
> > -DUSE_OPENSSL  -DUSE_SYSCALL_FUTEX -DUSE_LUA -I/opt/local/include
> > -DUSE_PCRE -I/usr/include
> > -DCONFIG_HAPROXY_VERSION=\"2.0-dev0-85ab28-296\"
> > -DCONFIG_HAPROXY_DATE=\"2019/02/14\" -c -o src/ev_poll.o src/ev_poll.c
> > In file included from include/common/hathreads.h:26:0,
> >                  from src/ev_poll.c:22:
> > include/common/initcall.h:134:22: error: expected ‘)’ before
> > ‘STG_PREPARE’
> >  DECLARE_INIT_SECTION(STG_PREPARE);
> >                       ^
> > include/common/initcall.h:124:107: note: in definition of macro
> > ‘DECLARE_INIT_SECTION’
> >   extern __attribute__((__weak__)) const struct initcall
> > *__start_init_##stg __asm("section$start$__DATA$" stg); \
> >
> >                                    ^~~
> > include/common/initcall.h:134:22: error: expected ‘)’ before
> > ‘STG_PREPARE’
> >  DECLARE_INIT_SECTION(STG_PREPARE);
> >
> > sounds similar to Patrick's issue.
> >
> >
> >
> Yes, that is the generated code I end up with.
> 
> Just fumbling around, but if I change the macro to stringize the arg:
>     extern __attribute__((__weak__)) const struct initcall
> *__start_init_##stg __asm("section$start$__DATA$" #stg); \
>     extern __attribute__((__weak__)) const struct initcall
> *__stop_init_##stg __asm("section$end$__DATA$" #stg)
> 
> I end up with:
>     src/hlua.c:8301:1: error: argument to 'section' attribute is not
> valid for this target: mach-o section
>       specifier requires a section whose length is between 1 and 16
> characters
> 
> So now it seems like it's just too long.
> But this is much lower level than I'm used to dealing with, so just a guess.

Hi Patrick,

So, I finally got my hand on a shell on an OS X machine.
With the attached patch, it now builds for me, and it even seems to work !
Please let me know if it fixes your issues.

Regards,

Olivier
>From a4347ae2fbfeeb1db1aab0408b44f2fe05136f10 Mon Sep 17 00:00:00 2001
From: Olivier Houchard <ohouch...@haproxy.com>
Date: Wed, 13 Feb 2019 16:22:17 +0100
Subject: [PATCH 1/2] BUILD/MEDIUM: initcall: Fix build on MacOS.

MacOS syntax for sections is a bit different, so implement it.
(see issue #42).

This should be backported to 1.9.
---
 include/common/initcall.h | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/include/common/initcall.h b/include/common/initcall.h
index 35d237fd..9e705926 100644
--- a/include/common/initcall.h
+++ b/include/common/initcall.h
@@ -32,6 +32,11 @@
 /* List of known init stages. If others are added, please declare their
  * section at the end of the file below.
  */
+/*
+ * Please keep those names short enough, they are used to generate section
+ * names, Mac OS X accepts section names up to 16 characters, and we prefix
+ * them with i_, so stage name can't be more than 14 characters.
+ */
 enum init_stage {
        STG_PREPARE = 0,      // preset variables, tables, list heads
        STG_LOCK,             // pre-initialize locks
@@ -50,6 +55,12 @@ struct initcall {
        void *arg3;
 };
 
+#ifdef __APPLE__
+#define HA_SECTION(s) __section__("__DATA, i_" # s)
+#else
+#define HA_SECTION(s) __section__("init_" # s)
+#endif
+
 /* Declare a static variable in the init section dedicated to stage <stg>,
  * with an element referencing function <function> and arguments <a1..a3>.
  * <linenum> is needed to deduplicate entries created from a same file. The
@@ -62,7 +73,7 @@ struct initcall {
  */
 #define __DECLARE_INITCALL(stg, linenum, function, a1, a2, a3)     \
         static const struct initcall *__initcb_##linenum           \
-           __attribute__((__used__,__section__("init_"#stg))) =   \
+           __attribute__((__used__,HA_SECTION(stg))) =            \
                (stg < STG_SIZE) ? &(const struct initcall) {      \
                .fct = (void (*)(void *,void *,void *))function,   \
                .arg1 = (void *)(a1),                              \
@@ -113,9 +124,16 @@ struct initcall {
  * empty. The corresponding sections must contain exclusively pointers to
  * make sure each location may safely be visited by incrementing a pointer.
  */
+#ifdef __APPLE__
+#define DECLARE_INIT_SECTION(stg)                                              
     \
+       extern __attribute__((__weak__)) const struct initcall 
*__start_init_##stg __asm("section$start$__DATA$i_" # stg); \
+       extern __attribute__((__weak__)) const struct initcall 
*__stop_init_##stg __asm("section$end$__DATA$i_" # stg)
+
+#else
 #define DECLARE_INIT_SECTION(stg)                                              
     \
        extern __attribute__((__weak__)) const struct initcall 
*__start_init_##stg; \
        extern __attribute__((__weak__)) const struct initcall 
*__stop_init_##stg
+#endif
 
 /* Declare all initcall sections here */
 DECLARE_INIT_SECTION(STG_PREPARE);
-- 
2.20.1

Reply via email to